使用线程池处理异步I/O请求的机制
阻塞会挂起线程
同步表示A完成后才能执行B,两者有依赖关系
异步表示A/B可以同时进行,两者没有联系
I/O操作一般有两个不同的阶段:
1.等待数据数据到达网络,并拷贝到内核的缓冲区(等待数据准备好)。
2.把内核缓冲区的数据拷贝到应用程序缓冲区。
线程只要阻塞在以上任意一个阶段都称为同步I/O
阻塞I/O
非阻塞I/0
I/O复用(select、poll)
信号驱动I/O
线程不会阻塞在I/O两个阶段
异步i/O
(boost::asio实现的应该是异步I/0,数据拷贝到应用程序缓冲区的时候才用回调函数通知应用程序)
事件方式:每一个socket操作(接收或发送数据等IO操作)关联一个重叠结构,一个重叠结构关联一个事件,所以有多少个socket操作就应该有多少个WSAOVERLAPPED结构,有多少个WSAOVERLAPPED结构就应该有多少个WSAEVENT事件
完成例程:在重叠结构上关联一个回调函数,数据到达应用程序缓冲后系统调用该回调函数
完成端口(IOCP):事件方式和完成例程都会阻塞工作线程等待事件返回,而完成端口则是异步I/O,利用系统内核进行I/O调度.应用程序请求I/O操作,内核完成该操作以后,把完成的消息放入完成端口里,应用程序轮询该完成端口就知道I/O操作是否已经完成.
创建完成端口CreateIoCompletionPort
创建多个工作线程
创建监听套结字,并绑定到完成端口
投递acceptex请求
工作线程GetQueuedCompletionStatus,等待完成端口上的各I/O操作完成的消息.
如果accept完成,创建连接套结字,绑定连接套结字到完成端口,并投递相关I/O操作,继续投递acceptex请求
如果非accept请求完成,处理相关缓冲,继续投递相关I/O操作
6-7循环