最近写一个IOCP框架,把自己的理解成章节先记下来,后面再讨论实现代码。
一个服务端程序一般需要同时响应多个客户端请求,使用异步I/O和多线程同步是常用的方法,按照定义,异步I/O调用会立即返回,而真正的I/O读写则会等待处理,如果有多个I/O处理累积起来,那么就要考虑他们之间的同步的问题了,通常有几种途径:
1)使用事件,有异步I/O提交,则设置事件信号,外部等待的线程开始处理I/O,缺点是I/O处理的线程必须等待事件并且不断检测是否有未决的I/O;
2)调用GetOverlappedResult(),这个和1)有同样的缺点;
3)APC(Asynchnous Procedure Call),这个方案有几个缺点,首先调用APC的线程必须APC在同一个线程上下文,其次调用APC的线程必须暂停在一个可唤醒的等待状态(Alertable wait state,这个翻译不知道算不算准确?);
4)使用IOCP,这个就是我们的主题了,使用IOCP是目前Windows平台下效率最高的异步处理了,当然要正确的实现一个IOCP框架也需要跨越许多的障碍,但是效率上的优势压倒一切,尤其对写服务器的工人来说诱惑力真的非凡,以致很多人都会前赴后继的造这个大大的“轮子”。
下一节讨论IOCP的原理和实现。