I/O完成端口

  • 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倍。原因:放置挂起线程太多而导致线程池中没有可用线程。而被挂起的线程最多为逻辑核个数个多
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值