I / O完成端口的优缺点

时间:2011-03-12 14:18:06

标签: windows network-programming io device-driver iocp

为什么很多人说I / O完成端口是快速而漂亮的模型? 什么是I / O完成端口的优缺点?

我想知道一些比其他型号更快的IOCP的要点。

如果你可以比较其他模型(选择,epoll,传统的多线程/进程)来解释它,那就更好了。

3 个答案:

答案 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完成端口由O / S提供,作为异步I / O操作,这意味着它发生在后台(通常在硬件中)。系统不会浪费任何等待I / O完成的资源(例如线程)。当I / O完成时,硬件向O / S发送一个中断,然后唤醒相关的进程/线程来处理结果。 错误:IOCP不需要硬件支持(请参阅下面的评论)

通常,单个线程可以等待大量I / O完成,同时在I / O未返回时占用非常少的资源。

其他不基于I / O完成端口的异步模型通常使用线程池并让线程等待I / O完成,从而使用更多的系统资源。

另一方面,I / O完成端口通常需要硬件支持,因此它们通常不适用于所有异步方案。