IO Complement Port(完成端口)

来源:互联网 发布:网络推广优化 编辑:程序博客网 时间:2024/06/05 03:58

参考:

        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” 服务器。

   3.IO Completion Ports特点:
        i WaitForMultipleObjects() 不同,这里不限制handles的个数。
        i I/O completion ports 允许一个线程将一个请求暂时保存下来,而由另一个线程为它做实际服务。
        i I/O completion ports 默默支持 scalable 架构。
        4.   I/O completion port是一种非常特殊的核心对象,用来综合一堆线程,让它们为“overlapped请求”服务。其所提供的功能甚至可以跨越多个 CPUs,Completion port可以自动补偿成长中的服务器,适合应用于沉重的负担。

   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 上等待的线程
     --------------------------------------------
      = 池子里的所有线程的个数




0 0
原创粉丝点击