共计 2355 个字符,预计需要花费 6 分钟才能阅读完成。
I/ O 流
- 概念
(1)c++ 中将数据的输入输出称之为流(stream),在 c ++ 中,流被定义为类,成为流类(stream class),其定义的对象为流对象。
(2)文件,套接字 (socket),管道(pipe) 等可能进行 I / O 操作的对象,能够被看做为流
- 工作机制
(1)大多数文件系统的默认 I / O 操作都是缓存 I /O。在 Linux 的缓存 I / O 机制中,读取数据时,都会将数据先拷贝到操作系统内核的缓冲区中,而后将操作系统内核缓冲区的数据拷贝到应用程序的地址空间,写的过程则相同。
(2)缓存 I / O 应用操作系统内核缓冲区,在肯定水平上拆散了应用程序空间和理论的物理设施,通过将数据写入缓冲区后,再一次性解决,缩小了读盘的次数,从而进步了性能
I/ O 模型
- 同步与异步:关注的是 音讯通信机制
同步(synchronous):调用者会始终“期待”被调用者返回音讯,能力继续执行,在此期间,调用者不能做其它事
异步(asynchronous):被调用者通过状态、告诉或回调机制被动告诉调用者被调用者的运行状态,在此期间,调用者能够边“期待”,边做其它事
- 阻塞和非阻塞:关注 调用者的状态
阻塞(blocking):调用者始终“期待”所处的状态
非阻塞(blocking):调用者可能边“期待”,边做其它事的状态
- 同步 I /O
(1)阻塞式 I /O:程序收回 I / O 申请,如果内核缓冲区为空,此时进行读操作,那么该程序就会阻塞
(2)非阻塞式 I /O:程序收回 I / O 申请,如果内核缓冲区为空,此时进行读操作,此时就会立即返回一个谬误
(3)I/ O 复用
a. 这是一种机制,程序注册一组文件描述符给操作系统,监督多个描述符,一旦某个描述符就绪(个别是读就绪或者写就绪),可能告诉程序进行相应的读写操作。示意“我要监督这些 fd 是否有 I / O 事件产生,有了就通知程序处理”。
b. 当多个 I / O 流共用一个期待机制时,该模型会阻塞过程,然而过程时阻塞在这种机制的零碎调用上,不是阻塞在真正的 I / O 操作上
c. I/ O 多路复用须要和非阻塞 I / O 一起应用,非阻塞 I / O 和 I / O 多路复用式绝对独立的。非阻塞 I / O 仅仅指流对象立即返回,不会被阻塞;而 I / O 多路复用只是操作系统提供的一种便当的告诉机制。
(4)信号驱动式 I /O
a. 用户过程能够通过零碎调用注册一个 信号处理程序,而后主程序能够持续向下执行,当有I/ O 操作准备就绪时,由内核告诉触发一个 SIGIO 信号处理程序执行,而后将用户过程所须要的数据从内核空间拷贝到用户空间
b. 此模型的劣势在于期待数据报达到期间过程不被阻塞。用户主程序能够继续执行,只有期待来自信号处理函数的告诉。
- 异步 I /O
a. 程序过程向内核发送 I / O 调用后,不必期待内核响应,能够持续承受其余申请,内核调用的 I / O 如果不能立刻返回,内核会持续解决其余事物,直到 I / O 实现后将后果告诉给内核
b. 信号驱动式 IO 是由内核告诉咱们何时启动一个 IO 操作,而异步 IO 是由内核告诉咱们 IO 操作何时实现。
I/ O 复用模型
- select
select 的大抵工作流程:
(1)采纳 数组 组织文件描述符
(2)通过遍历数组的形式,监督文件描述符的状态(可读,可写,异样)
(3)如果没有可读 / 可写的文件描述符,过程会阻塞期待一段事件,超时就返回
(4)当有一个可读 / 可写的文件描述符存在时,过程会从阻塞状态醒来
(5)进行 无差别轮询,找出可能操作的 I / O 流,若解决后,会移除对应的文件描述符
select 的毛病:
(1)每次调用 select,都须要把文件描述符汇合从用户空间贝到内核空间,这个开销在 I / O 流很多时会很大
(2)同时每次调用 select 都须要在内核遍历传递进来的所文件描述符数组,这个开销在 I / O 流很多时也很大
(3)select 反对的文件描述符数量太小了,默认是 1024
- poll
(1)采纳 链表 组织文件描述符
(2)原理和 select 统一
(3)只是解决了反对的文件描述符受限的毛病
(4)select 和 poll 都是 程度触发:找到可操作的 I / O 流并告诉过程,但过程本次没有解决,文件描述符没有被移除,下次轮询时依旧会告诉
- epoll
工作原理:
(1)红黑树和就绪链表,红黑树用于治理所有的文件描述符,就绪链表用于保留有事件产生的文件描述符。
(2)接管到 I / O 申请,会在红黑树查找是否存在,不存在就增加到红黑树中,存在则将对应的文件描述符放入就绪链表中
(3)如果就绪链表为空,过程则阻塞否则遍历就绪链表,并告诉利用过程解决文件描述符对应的 I /O
工作模式:
(1)LT 模式 (程度触发):检测到可解决的文件描述符时,告诉应用程序, 应用程序能够不立刻解决该事件。后续会再次告诉
(2)ET 模式 (边缘触发):检测到可解决的文件描述符时,告诉应用程序, 应用程序必须立刻解决该事件。如果本次不解决,则后续不再告诉
参考资料
IO 五种模型和 select 与 epoll 工作原理(引入 nginx)– osc_1ont5xz2 的个人空间 – OSCHINA – 中文开源技术交换社区
IO 模型:同步、异步、阻塞、非阻塞 | 神奕的博客 (songlee24.github.io)
(3) io 复用与 epoll 模型详解_集体文章 – SegmentFault 思否
(3) Linux IO 模式及 select、poll、epoll 详解_人云思云 – SegmentFault 思否
Linux 网络编程的 5 种 IO 模型:多路复用(select/poll/epoll) – 黄树超 – 博客园 (cnblogs.com)
(3) 网络编程——select 模型(总结)_集体文章 – SegmentFault 思否
网络编程之 IO 模型与 Epoll – 简书 (jianshu.com)
彻底搞懂 epoll 高效运行的原理 – 简书 (jianshu.com)
如果这篇文章说不清 epoll 的实质,那就过去掐死我吧!(3)– 知乎 (zhihu.com)