完成端口是Windows的一种机制, 在重叠IO模型基础上的优化
3.如果采用了多线程, 不好管理, 需要线程过多, 如果有响应客户端都在一个线程中管理, 相当于单线程, 其他线程都是闲置的
没有无序的问题(操作系统内部调用回调函数, 由操作系统决定)
采用了多线程:每个客户端同时响应, 都给一个线程, 数量太多> 事件通知
在一个时间片中, 每个线程执行一样的时间:电脑开太多软件会卡
假设一条线程执行完需要1秒, 10条依然需要10秒, 还要加上切换线程的时间, 所以>10秒
CPU核数 * 2 + 2:实际应用中的经验, 如果有线程挂起/睡眠等操作, 就多创建出来一些线程, 时刻满状态工作
理论上4核4个线程, 但是intel使用了超线程技术, 使得一个物理内核可以模拟出双核的性能
给一个软件创建的线程过多, 其他软件分的时间片就会减少
模仿消息队列, 系统创建了一个通知队列:有序, 不做无用功
将所有的套接字和一个完成端口(一个类型的变量)绑定到一起
使用AcceptEx、WSARecv、WSASend投递
当系统异步完成请求, 就会把通知放进一个队列, 该队列由操作系统创建维护
通过GetQueuedCompletionStaus从队列中一个一个拿处理
GetQueuedCompletionStatus()
使用AcceptEx、WSARecv、WSASend:
AcceptEx()
WSARecv()
WSASend()