I / O完成端口的优缺点

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

要回复问题请先登录注册