【待总结】IOCP相关

I/O完成队列(先进先出) q1

等待线程队列(后进先出)q2

已释放线程列表(活动线程)l1

已暂停线程列表(挂起线程)l2

1.当线程调用GetQueuedCompletionStatus阻塞时,该线程被放入等待线程队列q2中。

   IO 完成端口内核对象根据此队列知道有哪些线程在等待处理completion packet。线程等待队列是按照 LIFO 的方式入队的,也就是当有一个 completion packet 到来时,系统先唤醒最后调用GetQueuedCompletionStatus进入等待队列的线程。

2.当一个异步 IO 请求完成了。

   1)系统会去检查是否这个 IO 设备与任何 IO 完成端口关联了,如果是,系统会在 IO 完成端口队列q1的末尾添加一个 completion packet(以 FIFO 的顺序入队),GetQueuedCompletionStatus 就是在这个队列上等待。

   2)此时completion packet来了,若正在运行的线程数小于最大并发线程数,从等待线程队列q2中拿到最后进入的线程tn将其唤醒,并将tn线程从等待队列q2中删除,将其tn的线程id放入已释放线程列表(活动线程)l1中,且GetQueuedCompletionStatus返回,此线程tn被唤醒处于活动状态。此时该completion packet从 IO 完成端口队列q1中删除。

3.若正活动的线程tn再次调用GetQueuedCompletionStatus时,该线程id从已释放线程列表(活动线程)l1中删除,且该线程再次进入等待线程队列(后进先出)q2中。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

1)创建 IOCP 的时候会指定一个并发值,虽然任意个线程可以关联到这个 IOCP,但是并发值限定了可以同时运行的线程数。假设这样的场景,有一个并发值为 1 的 IOCP,但是有多于一个的线程关联到了这个 IOCP,如果完成队列中总是有一个 completion packet 在等待,当正在运行的线程调用GetQueuedCompletionStatus时就会立即返回,该线程处理完这个 completion packet 再次调用GetQueuedCompletionStatus又会立即返回。在处理 completion packet过程中,虽然完成队列中始终有 completion packet 待处理,但是因为并发值为 1 的原因,系统不会去调度其他线程来执行,尽管关联 IOCP 的线程不止一个。同时也避免了线程切换的开销,因为始终都是这一个线程在执行。

2)在上述情况中,看起来线程池中关联的其他线程毫无用处,但是其实是没有考虑到正在运行的线程进入等待状态或者因为某种情况与该 IOCP 解除绑定时的情况。如果正在运行的线程调用Sleep, WaitFor*,或者一个同步 IO 函数,或者任何可以引起当前线程从运行状态变为等待状态的函数时,IOCP 就会立即调度其他关联的线程,维持始终有一个线程在运行。

for(int i=0; i<nWorkerCnt i++)

{

     ....

     CreateThread(...workThread...);

     ....

}

工作线程

workThread()

{

       GetQueuedCompletionStatus(...);

             

}

 

 

1.https://blog.csdn.net/tgxallen/article/details/77428539 windows IOCP完成端口原理详解

2.http://www.cnblogs.com/persistentsnail/p/3862433.html windows IOCP实践

1和2结合着看,理解原理

3.https://blog.csdn.net/zhongguoren666/article/details/7386592 IOCP

4.https://blog.csdn.net/fatacy/article/details/1623045 完成端口高效的三个原因

3和4概括总结,解决问题

5.https://blog.csdn.net/piggyxp/article/details/6922277 完成端口(CompletionPort)详解

一步一步如何使用详解

6. https://blog.csdn.net/neicole/article/details/7549497/ IOCP模型与网络编程

6包含具体的例子

7. https://blog.csdn.net/analogous_love/article/details/74531514 关于Windows完成端口(IOCP)的一些理解

7包含关键函数的讲解

8. https://blog.csdn.net/Timmiy/article/details/52224175 windows Socket编程之完成端口模型

9. https://www.cnblogs.com/hedengfeng/p/3853084.html 结构体指针之间喝结构体之间的强制类型转换那些事

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值