I/O Device <---> Kernel Space <---> User Space
IO(Input/Output,输入/输出),数据的读取(输入)或写入(输出)操作。
IO主要包括:
用户进程的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 |
进程发起IO系统调用后,进程被阻塞,转到内核空间处理,整个IO处理完毕后返回进程。
进程发起IO系统调用后,如果内核缓冲区没有数据,需要到IO设备中读取,进程返回一个错误而不会被阻塞;进程发起IO系统调用后,如果内核缓冲区有数据,内核就会把数据返回进程。
IO多路复用就是一个 进程/线程同时处理多个IO请求 。该模型解决了非阻塞IO中的频繁轮询 CPU 的问题。
原理:进程把多个文件描述符注册到select/poll/epoll函数,由内核监视,函数阻塞。当有文件描述符就绪或超时的时候,函数返回,然后该进程进行相应的读/写操作。
典型应用:linux的select、poll、epoll
当进程发起一个IO操作,会向内核注册一个信号处理函数,然后进程返回不阻塞;当内核数据就绪时会发送一个信号给进程,进程便在信号处理函数中调用IO读取数据。
当进程发起一个IO操作,进程返回不阻塞,内核把整个IO处理完后,会通知进程结果。
Windows: IOCP
Linux: epoll (poll select)
Mac(BSD): kqueue
SunOS: event ports