阻塞io的调用可能会因为无法立即完成而被 *** 作系统挂起,直到等待的事情发生为止。如网络编程的connect,发起连接时,客户端发送同步报文,直到等到接收到服务器确认报文。若服务器确认报文没有立即到达客户端,connect调用将会被挂起。
非阻塞io非阻塞io的调用总是立即返回,不管事件是否已经发生。如果事件没有立即发生,会返回-1,通过error区别出错情况。对于accept,recv而言,EAGAIN,EWOULDBLOCK,属于正常情况
在事件已经发生的情况下 *** 作非阻塞io,才能提高程序的效率。因此非阻塞io和其他io通知机制一起使用,io复用和SIGIO信号。
应用程序向内核注册多个事件,内核监管多个事件,并在事件就绪时通过io复用函数通知应用程序。io复用本身是阻塞的epoll_wait阻塞等待到有事件就绪来临。
SIGIO信号为一个文件描述符指定宿主进程,被认定的宿主进程会捕获到SIGIO信号,当目标文件描述符事件准备就绪时,就会触发信号处理函数
异步io阻塞,非阻塞,io复用,信号驱动都是同步io模型,这三种io模型都是在io事件发生后,由应用程序完成的。而POSIX规范的异步io模型不同,对于异步io,用户可以直接对io执行读写 *** 作,这些 *** 作告诉内核用户读写缓冲区 的位置,以及io *** 作完成后的通知方式。异步io总是立即返回,正真的读写 *** 作已经交给内核处理。
同步io向应用程序通知的是io就绪事件,异步io向应用程序通知的是io完成事件。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)