- 对底层资源的操作是通过系统调用实现的, OS这样做的目的: 保证系统安全.
- IO操作的对象: 缓存(内核缓存, 进程缓存)
我们进行的IO操作并非直接和硬件资源交互, 传递数据, 真正的IO传输过程如图

1, 用户进程通过系统调用read读取数据;
2, 内核在硬件获取数据, 拷贝到内核缓存;
3, 内核将准备好的数据复制到用户缓存中;
4, 用户直接使用的是用户缓存中的数据.
IO模型的进化依靠的是底层操作系统这个基础设置的支持.
同步阻塞
用户态进程发出read调用后, 在内核准备数据和复制数据到用户缓存的这个时间段内, 阻塞等待;如果实现并发访问, 就需要针对每一个IO创建一个thread.
同步非阻塞
用户进程使用非阻塞的read, 发出该调用后, 继续执行进程, 内核准备数据的过程中不需要阻塞住.但是需要用户进程不断轮询发出read调用, 查看IO的执行结果.(一般不用, 但作为后续模型的基础)
多路复用
通过select/epoll系统调用, 不用阻塞, 也不需要轮询, 内核完成IO之后给调用进程返回内核数据准备结果, 这样面对多个IO请求, 只需要一个线程负责获取内核返回的状态结果, 有ready的io, 再通过非阻塞的read调用来完成IO(内核缓存到用户缓存的拷贝)
异步非阻塞
以上的多路复用离一步到位还有距离, 真正的异步非阻塞做到, 用户进程发出IO请求, 即返回执行自己的进程, 直到内核完成数据准备, 进而完成数据在内核缓存到用户缓存的复制, 给用户进程发送一个数据IO完成通知, 用户进程直接使用IO的结果.