I/O Completion ports

I/O  Completion ports是一种非常特殊的核心对象,用来综合一堆线程,让它们为“overlapped请求”服务,其所提供的功能甚至可以跨越多个CPU,Completion port可以自动补偿成长中的服务器,适合应用于沉重的负担。

 

         解决了overlapped I/O中遇到的问题:

(1)      与WaitForMultipleObjects()不同,这里不限制handles的个数。

(2)      I/O  Completion ports允许一个线程将一个请求暂时保存下来,而由另一个线程为它做实际服务。

(3)      I/O  Completion ports默认支持scalable结构。

Scalable系统,是指藉着RAM或磁盘空间或CPU个数的增加而能够提升应用程序效能的一种系统。

使用completionport的步骤如下:

1.      产生一个I/O completion port。

2.      让它和一个文件handle产生关联。

3.      产生一堆线程。

4.      让每一个线程都在completion port 上等待。

5.      开始对着那个文件handle发出一些overlapped I/O请求。

I/O  Completion ports是一个核心对象,你必须使用CreateIoCompletionPort()才能产生它:

HANDLE CreateIoCompletionPort(HANDLE FileHandle,HANDLEExistingCompletionPort,DWORD CompletionKey,DWORD NumberOfConcurrentThreads);

Worker线程初始化自己之后,它应该调用GetQueuedCompletionStatus(),这个操作像是WaitForSingleObject()和GetOverlappedResult()的组合,函数规格如下:

GetQueuedCompletionStatus(HANDLE CompletionPort,LPDWORDlpNumberOfBytesTransferred,LPDWORD lpCompletionKey,LPOVERLAPPED* lpOverlapped,DWORDdwMilliseconds);

合理的线程个数应该是CPU个数的两倍再加2.没有理由说你不能够产生更多的线程,但记住,线程并不是免费的,100个worker线程在completion port上等待,并不会让系统速度更快一些。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值