- I/O完成端口是一种并发模型
- 相比于简单的多线程,I/O完成端口可以控制处于运行状态的线程数量,减少线程间的切换,减少了线程上下文的切换时间,以及线程上下文相关内存占用
- CreateIoCompletionPort(HANDLE hFile, HANDLE hExistingCompletionPort, ULONG_PRT CompletionKey, DWORD dwNumberOfConcurrentThreads) 创建一个I/O完成端口,并将一个设备与其关联起来
- I/O完成端口关联以下内部运作
- 设备列表:记录I/O完成端口关联的device,才CreateIoCompletionPort被调用时,添加新项,在设备关闭时删除项
- I/O完成队列(先入先出):记录I/O完成端口关联的I/O操作,每当有I/O请求或者PostQueuedCompletionStatus被调用时,添加新项;当完成端口从等待线程队列中被领取时删除
- 等待线程队列(后入先出,后入先出的原因是内存的局部性,可以提高性能):记录与I/O完成端口所关联的等待线程。当线程调用GetQueuedCompletionStatus时添加新项,当I/O完成队列中领取了一个任务后删除
- 已释放线程列表:记录从等待线程队列中被唤醒的线程。当线程领取I/O完成端口后进入已释放线程列表,当线程进入挂起时需转入至已暂停线程列表,因此需要从已释放线程列表中删除
- 已暂停线程列表:记录与I/O完成端口所关联的线程中处于挂起状态的线程。
- I/O完成端口的并发模型,理想状态下最多有逻辑核个线程处于工作中
- 通常线程池中的线程个数设定为CPU的逻辑核个数的2倍。原因:放置挂起线程太多而导致线程池中没有可用线程。而被挂起的线程最多为逻辑核个数个多
I/O完成端口
最新推荐文章于 2024-10-07 11:56:33 发布