1.在网络环境下,I/O分为两个步骤:等待、数据搬迁。所以,为了提高效率,必须降等待时间降低。因此发展出5种 I/O 模型。
同步 | 阻塞I/O模型 |
非阻塞I/O模型 | |
多路复用I/O模型 | |
信号I/O模型 | |
异步 | 异步I/O模型 |
2.在详细了解之前,先补充几点系统知识。
- 内核:计算机系统的基础部分。为各个应用程序提供对硬件安全访问支持的一部分软件。
- recvfrom:从已连接套接口上获取数据,并捕获数据发送源的地址。
-
内存I/O 网络I/O 我们平常说的 磁盘I/O -
同步和异步:其实是指CPU时间片的利用,主要看请求发起方对消息结果的获取是再主动发起的还是被动通知的。
3.阻塞I/O模型:当用户进程发起 recvfrom系统调用,内核开始准备数据。对于网路I/O来说,很多时候内核没有足够的数据(完整的udp包)。这个时候,应用程序就被阻塞了。当数据准备好后,它就会将数据拷贝到用户内存,然后返回结果,整个进程解除阻塞状态。
优点 | 进程阻塞挂起,不消耗cpu资源,及时响应每个操作 |
编码难度小 | |
适合并发量小的网路应用开发 | |
缺点 | 不适合并发大的应用,因为一个请求I/O会阻塞应用 |
需要为每个请求分配一个线程以及时响应,系统开销大 |
4.非阻塞型
当用户发起read操作后,如果内核数据还没有准备好,那么会立即返回error,不会阻塞应用进程。用户进程接收到error后会再次发送read请求。如此往复循环,直到数据 进入用户内存。
特点 | 用户进程需要不断的轮询内核数据准备好没有 |
缺点 | 反复轮询调用,消耗cpu资源 |
响应不是很及时 |
5.多路复用模型
多个进程的I/O可以注册到一个复用器selector上。当用户进程调用selector时,复用器会监控所有注册过来的I/O。如果没有一个I/O对应的内核缓存准好了数据,那么select调用进程会被阻塞。 多个进程注册I/O后,只有一个select调用进程会被阻塞。
多路复用和阻塞模型实际没有多大区别,事实上,性能在某些情况下更加差些。因为多路复用要两次系统调用(select和recvfrom),而阻塞模型只有一次。但是,复用器的优势是它可以同时处理多个请求。所以如果处理的连接数不多,使用多路复用不一定比使用多线程的阻塞型I/O性能更好。
6.异步I/O
用户进程发起aio_read操作后,给内核传递和read相同的信息,并且告诉内核整个操作完成时如何通知用户进程立刻进行其他操作。(说白了就是回调)。从内核的角度,当他收到aio_read之后,会立刻返回,不会对进程产生任何阻塞。内核数据准备好后,将数据拷贝到用户进程。并立刻通知用户进程。