IOCP       

IOCP I/O完成端口

使用线程池处理异步I/O请求的机制

I/O模型-同步/异步,阻塞/非阻塞

阻塞会挂起线程

同步表示A完成后才能执行B,两者有依赖关系

异步表示A/B可以同时进行,两者没有联系

同步I/O

I/O操作一般有两个不同的阶段:

1.等待数据数据到达网络,并拷贝到内核的缓冲区(等待数据准备好)。

2.把内核缓冲区的数据拷贝到应用程序缓冲区。
线程只要阻塞在以上任意一个阶段都称为同步I/O
阻塞I/O

非阻塞I/0

I/O复用(select、poll)

信号驱动I/O

异步I/O

线程不会阻塞在I/O两个阶段 异步i/O

(boost::asio实现的应该是异步I/0,数据拷贝到应用程序缓冲区的时候才用回调函数通知应用程序)

windows 重叠I/O

事件方式:每一个socket操作(接收或发送数据等IO操作)关联一个重叠结构,一个重叠结构关联一个事件,所以有多少个socket操作就应该有多少个WSAOVERLAPPED结构,有多少个WSAOVERLAPPED结构就应该有多少个WSAEVENT事件

完成例程:在重叠结构上关联一个回调函数,数据到达应用程序缓冲后系统调用该回调函数

完成端口(IOCP):事件方式和完成例程都会阻塞工作线程等待事件返回,而完成端口则是异步I/O,利用系统内核进行I/O调度.应用程序请求I/O操作,内核完成该操作以后,把完成的消息放入完成端口里,应用程序轮询该完成端口就知道I/O操作是否已经完成.

IOCP

IOCP实现

  1. 创建完成端口CreateIoCompletionPort

  2. 创建多个工作线程

  3. 创建监听套结字,并绑定到完成端口

  4. 投递acceptex请求

  5. 工作线程GetQueuedCompletionStatus,等待完成端口上的各I/O操作完成的消息.

  6. 如果accept完成,创建连接套结字,绑定连接套结字到完成端口,并投递相关I/O操作,继续投递acceptex请求

  7. 如果非accept请求完成,处理相关缓冲,继续投递相关I/O操作

  8. 6-7循环

    reference:

    http://blog.csdn.net/piggyxp/article/details/6922277