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上等待,并不会让系统速度更快一些。