I/O是什么?
从细节出发,搜寻本质
从C语言开始,我们就接触过一个头文件
# include <stdio.h>
上面的头文件实际上是 standard input and output 的缩写,标准输入输出
所以IO就是输入输出。
I/O分为什么?
- 阻塞IO
- 非阻塞IO
非阻塞IO通常要和其他IO通知机制一起使用,
比如IO复用和SIGIO信号。
I/O复用是什么?
如上所述,IO复用是一种最常使用的IO通知机制
它指的是,应用程序通过IO复用函数向内核注册一组事件,
内核通过IO复用函数把其中就绪的事件通知给应用程序。
I/O复用函数
IO复用函数本身是阻塞的,但是他们可以同时监听多个IO事件
- select
- poll
- epoll
IO模型
阻塞IO,IO复用,信号驱动IO都是同步IO模型
IO模型 | 读写操作和阻塞阶段 |
---|---|
阻塞IO | 程序阻塞于读写函数 |
IO复用 | 程序阻塞于I/O复用系统调用,但可同时监听多个IO事件,对IO本身读写是非阻塞的 |
SIGIO信号 | 信号出发读写就绪事件,用户程序执行读写操作,程序没有阻塞阶段 |
异步IO | 内核执行读写操作并触发读写完成事件,程序没有阻塞阶段 |
事件处理模式
服务器通常需要处理三类事件:IO事件,信号,定时事件
两种高效的事件处理模式
-
Reactor
同步IO模型通常用于实现Reactor模式
Reactor是这样一种模式:
它要求主线程(IO处理单元)只负责监听文件描述上是否有事件发生,
有的话就立即将该事件通知工作线程(逻辑单元)。
除此之外,主线程不做任何其他实质性工作。
读写数据,接收新的连接,以及处理客户请求均在工作线程中完成。 -
Proactor
异步IO模型则用于实现Proactor模式Proactor模式将所有IO操作都交给主线程和内核来处理,工作
边缘触发
只有当数据由少变多,才会触发事件。
水平触发
只要有数据,就触发事件。