I/O模型
2020-01-01 本文已影响0人
AC编程
一、I/O介绍
I/O 可以分为网络IO和磁盘IO,网络IO本质是socket读取。
每次IO,都要经历两个阶段:
- 第一步:将数据从磁盘文件先加载至内核空间(缓冲区),这个过程需要等待数据准备完成,时间较长。
- 第二步:将数据从内核缓冲区复制到用户空间的进程的内存中,这个过程时间较短。
二、I/O模型
2.1 同步/异步
同步/异步 关注的是消息通信机制。
- 同步:synchronous,调用者等待被调用者返回消息才能继续执行。
- 异步:asynchronous,被调用者通过状态、通知或回调机制主动通知调用者被调用者的运行状态。
2.2 阻塞/非阻塞
阻塞/非阻塞 关注调用者在等待结果返回之前所处的状态
- 阻塞:blocking,指IO操作需要彻底完成后才返回到用户空间,调用结果返回之前,调用者被挂起。
- 非阻塞:nonblocking,指IO操作被调用后立即返回给用户一个状态值,无需等到IO操作彻底完成,最终的调用结果返回之前,调用者不会被挂起。
2.3 常用I/O模型
阻塞型、非阻塞型、复用型、信号驱动型、异步。
三、I/O多路复用模型
多个连接共用一个等待机制,该模型会阻塞进程,但是进程是阻塞在select或者poll这两个系统调用上,而不是阻塞在真正的IO操作上。
用户首先将需要进行IO操作添加到select中,继续执行做其他的工作(异步),同时等待select系统调用返回。当数据到达时,IO被激活,select函数返回。用户线程正式发起read请求,读取数据并继续执行。
IO多路复用是最常使用的IO模型,但是其异步程度还不够“彻底”,因它使用了会阻塞线程的select系统调用。因此IO多路复用只能称为异步阻塞IO模型,而非真正的异步IO。
参考资料