两阶段
- 等待阶段:从发起I/O,到数据被读取到操作系统内核缓冲区(内核态)的过程。
- 拷贝阶段:将数据从内核态拷贝到用户态的过程。
五模型
-
阻塞I/O模型:发起I/O操作后一直阻塞,直到拷贝阶段和阻塞阶段都完成再执行后续操作。
-
非阻塞I/O模型:发起I/O操作后检查数据的准备阶段是否完成,没完成就直接返回错误码,可以通过轮询直到检测到数据准备完成;如果完成了就阻塞等待拷贝过程完成。
- 关于轮询:可以通过写轮训代码来实现多次轮询,但一般高级编程语言会自动实现轮询。
-
I/O复用模型:可以同时等待多个I/O操作,阻塞等待数据准备好,当其中某个I/O操作数据准备好后,会阻塞等待该I/O的拷贝阶段。其实就相当于在阻塞I/O模型上多加了个等待多个I/O。
-
信号驱动I/O模型:应用程序发起I/O后可以先做别的,准备阶段会在后台自动进行,当准备阶段结束后会给应用程序发送信号,之后应用程序阻塞等待拷贝阶段。
-
异步I/O模型:发起I/O后什么都不用管,准备阶段和拷贝阶段自动在后台执行,执行完成后会通知应用程序。
异同
- 除了异步模型,其他模型拷贝阶段都阻塞。
- 阻塞模型:就是等待也阻塞。
- 非阻塞模型:检查到数据没准备好就直接返回。
- 复用模型:就是能监控多个的I/O的阻塞模型。
- 信号驱动模型:准备阶段好了给通知。