IOCP的概念并不复杂,只是使用起来需要知道一些原则,掌握一些技巧,对于基本概念不清楚、基本功不扎实的程序员来说,实践起来很容易出错。IOCP到底是干什么的?我们可以在当前线程上下文里调用I/O,这些I/O操作函数一般都是操作系统提供给你的(OS通常会管理所有硬件资源,禁止用户程序直接访问,OS会抽象这些硬件,向用户透露“设备文件”),其实谁提供给你接口并不重要,重要的是,外部设备的数据传送速度要远远低于CPU的处理速度。所以,如果你采用使用当前线程上下文里的同步I/O操作,就会进入叫做“阻塞”的状态,线程阻塞在系统调用上,等待驱动程序完成你要求的这次I/O操作,也就是说,你要同步等待此次操作的完成。IOCP实际上是提供这样一种机制,当你要系统进行一个I/O操作的时候,你把这个操作提交给IOCP,让IOCP机制替你等待此次操作的完成,操作完成后,IOCP再通过一种机制通知你。让你可以从一个队列里将“完成”包顺序地取出来。IOCP的概念就是这么简单。他解放了你的“调用者”线程,让你可以将操作交给IOCP去做,你的线程就可以去做其他事情(通常是关注到另外一个文件的I/O操作)。这样,你就可以用很少的几个线程处理大数量的文件操作。

解决方案 »

  1.   

    嗯 有几个问题请教你啊
    1. 创建端口,这个端口到底是什么东西啊?
    2. 将这个端口和设备关联起来,比如创建了socket,然后让socket和这个端口关联起来。这个关联到底有什么用啊?
    3. 系统发现有I/O请求,会检查消息队列有没有关联的端口,如果有的话就会让相关的线程去处理请求;完了之后通知应用程序直接来取数据就可以了。这里比较堵,思路不是很清楚,求指点?、
      

  2.   

    1. 这个端口就是系统给你建立的一个IOCP的实例。
    2. 关联后,你以overlapped方式操作,IOCP函数就知道你到底想要将操作提交给哪个IOCP实例了。
    3. 这就是我前面那贴说的,原理是一样的。
      

  3.   

    嗯,为何要创建多于cpu数量的线程,而这里面多的线程永远不会不唤醒,谢谢了?
      

  4.   


    不一定要多于cpu数量。其实多少线程都可以。
    多的线程也会被唤醒。
      

  5.   

    你把它理解成WINDOWS MFC编程里的消息驱动 事件响应处理就好了,是一个模子的
    就比如烧开水,普通编程就是从开烧到烧开一直等待
    而完成端口就是你把火点着,加个水开自动鸣叫的笛子,你就可以走开了
    等水开了笛子会叫,你听到笛子叫再来处理就行