IO 学习笔记

275 阅读2分钟

阻塞与非阻塞:

阻塞与非阻塞指的是应用程序方面,描述的是在应用程序请求系统 IO 是,该如何继续处理的问题,前者是阻塞,直到操作系统准备好 IO 在继续处理,后者是直接继续执行,并使用线程一直轮询直到有 IO 准备好了

同步与非同步:

同步与非同步指的是操作系统层面的,描述的是当操作系统接收到 IO 请求时该如何响应的问题,前者是不响应,直到有 IO 资源准备好时在返回,后者是立马返回一个标记,当 IO 资源准备好时,在利用事件机制返回给程序

Unix IO 模型

  1. 阻塞式 IO

当应用程序调用系统调用(recvfrom)时,阻塞程序直到数据从内核复制到用户空间后才能继续执行

  1. 非阻塞式 IO

应用程序在调用(recvfrom)时,应用程序可以继续做其他事情,只不过会有个线程去不断的调用(recvfrom)方法来得知数据是否准备好

  1. IO 复用

通过 select、poll 等待数据(阻塞),他可以通过 select 选择器监听多个套接字连接,当某一个套接字数据可读时,调用系统调用(recvfrom)把内核复制到进程中

  1. 信号驱动式 IO

应用进程调用 sigaction 系统调用,内核立刻返回,也就是说应用进程非阻塞,等到内核数据准备好时,再通过 SIGIO 信号,通知应用进程调用 recvfrom 将数据从内核复制到进程中

  1. 异步 IO 模型

进行 aio_read 系统调用会立刻返回,应用程序继续执行,不阻塞,内核会在完成所有操作后通知应用进程它和信号驱动式 IO 最大的区别就是,信号驱动式 IO 是通知应用程序可以开始 IO 而异步 IO 则是告诉应用程序已经完成 IO 了