I/O模型:
阻塞I/O:针对阻塞I/O执行的系统调用可能因为无法立即完成而被操作系统挂起,直到等待的事件发生为止。针对非阻塞I/O执行的系统调用总是立即返回,而不管事件是否已经发生,如果事件没有立即发生,这些系统调用返回-1,和出错的情况一样。显然只有在事件已经发生的情况下操作非阻塞I/O才能提高程序的效率,因此,非阻塞I/O通常要和其他I/O通知机制一起使用,比如I/O复用和SIGIO信号
I/O复用:应用程序通过I/O复用函数向内核注册一组事件,内核通过I/O复用函数把其中就绪的事件通知给应用程序,常用的I/O复用函数是select、poll和epoll.I/O复用函数本身是阻塞的,它们能提高程序效率的原因在于它们具有同时监听多个I/O事件的能力。
SIGIO信号:信号触发读写就绪事件,用户程序执行读写操作,程序没有阻塞阶段
以上三种I/O模型都是同步I/O模型,I/O的读写操作,都是在I/O事件发生之后,由应用程序来完成的。异步I/O机制,内核执行读写操作并触发读写完成事件,程序没有阻塞阶段。
两种高效的事件处理模式:
reactor模式:主线程(I/O处理单元)只负责监听文件描述符上是否有事件发生,有的话就立即将该事件通知工作线程,除此之外,主线程不做任何其他实质性的工作,读写数据、接受新的连接以及处理客户请求均在工作线程中完成。
proactor模式:所有I/O操作都交给主线程和内核来完成,工作线程仅仅负责业务逻辑