Linux___I/O模型

图解I/O模型

一、阻塞和非阻塞

  • 针对阻塞I/O执行的系统调用可能因为无法立即完成而被操作系统挂起,直到等待的事件发生为止。
  • 针对非阻塞I/O执行的系统调用则总是立即返回,而不管事件是否已经发生。如果事件没有立即发生,返回-1。为了和出错返回-1作区别,此时必须根据errno来区分。对于accept,send,和recv而言,事件未发生时errno通常被设置成EAGAIN或者EWOULDBLOCK;对于connect而言,errno则被设置成EINPROGRESS。

只有在事件已经发生的情况下操作非阻塞I/O才能提高程序的效率。因此非阻塞I/O通常要和其他I/O机制一起使用。

二、I/O复用和信号驱动I/O

应用程序通过I/O复用函数向内核注册一组事件,内核通过I/O复用把就绪事件通知给应用程序。I/O复用函数本身是阻塞的,它们能提高程序效率的原因在于它们具有同时监听多个I/O事件的能力。

SIGIO也可以用来报告I/O事件,为一个目标文件描述符指定宿主进程,那么背指定的宿主进程将捕获到SIGIO信号。当目标文件描述符上有事件发生时,SIGIO信号的处理函数将被触发。我们可以在信号处理函数中对目标文件描述符执行非阻塞I/O操作。

三、同步和异步

程序是否按照代码顺序执行。

阻塞I/O、I/O复用和信号驱动I/O都是同步I/O模型。I/O的读写操作总是在I/O事件发生之后。

猜你喜欢

转载自blog.csdn.net/qq_41822235/article/details/86552004
今日推荐