IO模型简介
1. IO
I/O Device <---> Kernel Space <---> User Space
IO(Input/Output,输入/输出),数据的读取(输入)或写入(输出)操作。
IO主要包括:
- 内存IO
- 网络IO
- 磁盘IO
用户进程的IO分为两个阶段:
- 数据准备阶段:设备空间 <—> 内核空间
- 数据复制阶段:内核空间 <—> 用户空间
2. 五种IO模型
IO模型 | 英文 | 缩写 | 备注 |
---|---|---|---|
阻塞IO | Blocking IO | BIO | 同步阻塞IO |
非阻塞IO | Non-Blocking IO | NIO | 同步非阻塞IO |
IO多路复用 | IO Mutiplexing | 事件驱动模型;异步阻塞IO | |
信号驱动IO | Signal Driven IO | SIGIO | |
异步IO | Asynchronous IO | AIO | 异步非阻塞IO |
2.1 阻塞IO
进程发起IO系统调用后,进程被阻塞,转到内核空间处理,整个IO处理完毕后返回进程。
2.2 非阻塞IO
进程发起IO系统调用后,如果内核缓冲区没有数据,需要到IO设备中读取,进程返回一个错误而不会被阻塞;进程发起IO系统调用后,如果内核缓冲区有数据,内核就会把数据返回进程。
2.3 IO多路复用
IO多路复用就是一个 进程/线程同时处理多个IO请求 。该模型解决了非阻塞IO中的频繁轮询 CPU 的问题。
原理:进程把多个文件描述符注册到select/poll/epoll函数,由内核监视,函数阻塞。当有文件描述符就绪或超时的时候,函数返回,然后该进程进行相应的读/写操作。
典型应用:linux的select、poll、epoll
2.4 信号驱动IO
当进程发起一个IO操作,会向内核注册一个信号处理函数,然后进程返回不阻塞;当内核数据就绪时会发送一个信号给进程,进程便在信号处理函数中调用IO读取数据。
2.5 异步IO
当进程发起一个IO操作,进程返回不阻塞,内核把整个IO处理完后,会通知进程结果。
3. 主流操作系统的IO事件驱动模型
Windows: IOCP
Linux: epoll (poll select)
Mac(BSD): kqueue
SunOS: event ports