参考:
1. http://www.cnblogs.com/lancidie/archive/2011/12/19/2293773.html 此文很详细地阐述了Overlapped IO, 并重点说明和实现完成端口范例。
2. 《Win32多线程程序设计》 侯捷译. 第六章Overlapped IO
部分摘录:
1.所谓 scalable 系统,是指藉着 RAM 或磁盘空间或 CPU 个数的增加而能够提升应用程序效能的一种系统。
2. 靠着“一大堆线程服务一大堆events ”的性质, completion ports比较容易建立起 “ scalable” 服务器。
i I/O completion ports 允许一个线程将一个请求暂时保存下来,而由另一个线程为它做实际服务。
i I/O completion ports 默默支持 scalable 架构。
5.大略可以这样描述一个 com pletion port:它是一个机制,用来管理一堆线程如何为completed overlapped I/O requests服务。然而,completion port远比一个简单的分派器丰富得多, I/O completion port 也像一个活门(阀)一样,保持一个CPU 或多个 CPUs 尽可能地忙碌,但也避免它们被太多的线程淹没。 I/O com pletion port 企图保持并行处理的线程个数在某个数字左右。一般而言你希望让所有的CPUs 都忙碌,所以默认情况下并行处理的线程个数就是 CPUs 的个数。
6. 操作概观
a. 产生一个 I/O completion port。
b. 让它和一个文件 handle 产生关联。
c. 产生一堆线程。
d. 让每一个线程都在 com pletion port上等待。
e. 开始对着那个文件 handle 发出一些 overlapped I/O 请求。
7. 产生一堆线程
一旦 completion port 产生出来,你就可以设立在该 port 上等待的那些线程了。I/O completion port 并不自己产生那些线程,它只是使用由你产生的线程。因此,你必须自己以 CreateThread() 或 _beginthreadex() (第8章)或AfxBeginThread()(第10 章)产生出线程。当你一产生这些线程时,它们都应该在 completion port 上等待。当线程开始为各个“请求”服务时,池子里的线程的组织如下:
目前正在执行的线程
+ 被阻塞的线程
+ 在 com pletion port 上等待的线程
--------------------------------------------
= 池子里的所有线程的个数