Uinx IO 模型

unix 的io 模型分为以下5类

阻塞io

当用户发起io请求后,等待数据,程序将数据从内核复制到程序缓冲区中,整个操作都是阻塞状态。
阻塞io

非阻塞io

当用户发起请求后,不等待数据,而是返回一个数据未准备完成的标志。
操作系统内核将准备要操作的数据,这个过程中程序会轮训的请求操作,直到操作系统将数据准备好。当程序轮训到系统内核响应数据准备好了之后,程序再将数据复制到程序自身的缓冲区
io2.png

io复用模型

我们常用select和poll函数使用了io复用模型。
当用户调用select函数的时候会阻塞,select函数会系统调用操作内核进行数据报的准备工作。当数据报准备完成后,程序直接复制数据包的内容到程序缓冲区中,io复用现在看来和阻塞io没有什么区别。但是当用户比较多的时候优势就展现出来了,假设有100个用户阻塞io会阻塞100个进程处理io.
如果是io复用模型,则用1个线程去管理这100个io请求。
io3.png
Xnip20200314_003630.jpg

信号驱动io

我们可以使用信号.当用户发起io请求后,使程序接受操作系统的信号通知。
不等待数据。此时操作系统进行数据报的准备,当数据报准备完成之后会以信号的方式通知程序。程序收到数据准备完成的信号通知后,在将数据复制到程序缓冲区中。
io4.png

异步io

当用户发起请求后不等待数据,操作系统内核直接将数据复制到程序的缓存区中,等到复制完成之后在通知程序操作成功。
io5.png

总结

前四种io模型都属于同步io,其中的第二阶段相同,都属于数据报准备完成后,操作系统内核将数据复制到程序的缓存区中。

  1. 阻塞io则在数据准备和数据准备完成一直处于阻塞中
  2. 非阻塞io则是轮训的方式一直请求操作系统内核数据报是否准备完成
  3. 多路复用io则是发起io请求后,调用select。select单线程来判断那个io请求的数据报是否准备好。然后系统直接调用。
  4. 信号io则是 操作系统内核在数据报准备好的时候以信号的方式通知程序
  5. 异步io全程都是操作系统进行io处理,在处理io结束后通知程序
  6. 异步非异步的区别是io操作过程是否由操作系统处理。
  7. 阻塞非阻塞是io操作,操作系统是否返回一个标志告知io操作是否完成

相关博客

Unix下 五种 I/O模型

图解UNIX的I/O模型