为什么很多人说I / O完成端口是快速而漂亮的模型? 什么是I / O完成端口的优缺点?
我想知道一些比其他型号更快的IOCP的要点。
如果你可以比较其他模型(选择,epoll,传统的多线程/进程)来解释它,那就更好了。
答案 0 :(得分:81)
I / O完成端口非常棒。描述它们没有更好的词汇。如果Windows中的任何内容都正确完成,那就是完成端口。
您可以创建一些线程数(实际上并不重要),并将它们全部阻塞在一个完成端口上,直到一个事件(您手动发布的事件或来自 a timer的事件或异步I / O或其他)到达。然后,完成端口将唤醒一个线程来处理事件,直到您指定的限制。如果你没有指定任何东西,它将假定“最多CPU核心数”,这非常好。
如果已经有超过最大限制的线程活动,它将等待其中一个线程完成,然后一旦进入等待状态,就将事件交给线程。此外,它总是以LIFO顺序唤醒线程,因此缓存仍然很温暖。
换句话说,完成端口是一个毫不费力的“事件轮询”以及“尽可能多地填充CPU”解决方案。
您可以在完成端口,套接字或其他任何可以等待的文件中抛出文件读取和写入。而且,如果您愿意,您可以发布自己的活动。每个自定义事件至少有一个整数和一个指针值的数据(如果你使用默认结构),但你并不仅限于此,因为系统也乐意接受任何其他结构。
此外,完成端口很快,非常快。曾几何时,我需要从另一个线程通知一个线程。碰巧的是,该线程已经有一个文件I / O的完成端口,但它没有泵送消息。所以,我想知道我是否应该咬紧牙关并使用完成端口以简化,即使发布一个线程消息显然会更有效率。我还没有决定,所以我进行了基准测试。令人惊讶的是,事实证明,完成端口的速度提高了约3倍。所以...更快,更灵活,决定并不难。
答案 1 :(得分:12)
通过使用IOCP,我们可以克服“每个客户端一个线程”的问题。众所周知,如果软件不在真正的多处理器机器上运行,性能会大幅下降。线程是既不是无限也不便宜的系统资源。
IOCP提供了一种方法让一些(I / O工作者)线程“公平地”处理多个客户端的输入/输出。线程被挂起,在有事情要做之前不要使用CPU周期。
另外,您可以阅读这本好书http://www.amazon.com/Windows-System-Programming-Johnson-Hart/dp/0321256190
中的一些信息答案 2 :(得分:-1)
通常,单个线程可以等待大量I / O完成,同时在I / O未返回时占用非常少的资源。
其他不基于I / O完成端口的异步模型通常使用线程池并让线程等待I / O完成,从而使用更多的系统资源。
另一方面,I / O完成端口通常需要硬件支持,因此它们通常不适用于所有异步方案。