为什么很多人说 I/O 完成端口是一个又快又好的模型?
I/O完成端口的优缺点是什么?
我想知道一些使 I/O 完成端口比其他方法更快的点。
如果你能和其他模型(select、epoll、传统的多线程/多进程)相比解释一下,那就更好了。
为什么很多人说 I/O 完成端口是一个又快又好的模型?
I/O完成端口的优缺点是什么?
我想知道一些使 I/O 完成端口比其他方法更快的点。
如果你能和其他模型(select、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中的一些信息
I/O 完成端口由 O/S 作为异步 I/O 操作提供,这意味着它发生在后台(通常在硬件中)。系统不会浪费任何资源(例如线程)等待 I/O 完成。当 I/O 完成后,硬件向 O/S 发送一个中断,然后唤醒相关的进程/线程来处理结果。 错误:IOCP 不需要硬件支持(请参阅下面的评论)
通常,单个线程可以等待大量 I/O 完成,而在 I/O 未返回时占用很少的资源。
其他不基于 I/O 完成端口的异步模型通常使用线程池并让线程等待 I/O 完成,从而使用更多的系统资源。
另一方面是 I/O 完成端口通常需要硬件支持,因此它们通常不适用于所有异步场景。