一、背景知识
《UNIX网络编程》中讲了5中IO模型,分别是:阻塞IO模型和非阻塞IO模型、IO复用模型、信号驱动的IO模型和异步IO模型。注意:只有异步IO模型是异步IO操作,其余都是同步IO操作。
二、什么是IO
通常我们说的IO指的就是磁盘IO或者网络IO。IO操作分为两部分:
- 第一部分:数据准备阶段,内核空间<–>IO设备(磁盘或者网卡)。
- 第二部分:内核将数据拷贝到用户空间(用户空间<–>内核空间)。
2.1 什么是同步IO和异步IO?
同步IO 和 异步IO的区别在于:IO的第二个阶段是否阻塞,若是需要等待或者轮询内核,直至完成才能执行就是同步IO;异步是用户线程发起IO请求后继续执行,内核完成数据的准备工作,发信号给线程,线程响应处理。
2.2.1 阻塞IO
阻塞IO指的是进程发起系统调用后,进程被阻塞。转到内核空间处理,直到IO设备准备好数据,内核再将数据拷贝到用户空间,返回进程。
2.2.2 非阻塞IO
非阻塞IO是,进程发起系统调用,如果内核缓冲区没有数据,需要先到IO设备读取数据,此时,内核会给进程返回一个错误码,而不至于阻塞进程。进程会轮询多次调用系统调用,检查数据是否就绪,消耗CPU资源。
2.2.3 小结
阻塞IO 和 非阻塞IO 区别在与发起IO请求后第一步是否阻塞,而且非阻塞IO会一直轮询内核数据有没有准备好,浪费CPU资源,不建议用。
2.3 IO复用模型
多个进程的IO可以注册到一个复用器(select)上,然后让一个进程调用该select,select会监听所有注册进来的IO。如果select监听的所有IO都没有数据可读,调用select的进程就会一直阻塞在select。只要任意一个IO的内核缓冲区有数据可读,select就会返回。
除了selectIO复用外,Linux还提供了 poll 和 epoll 两种方案。
特点:
- 专一进程解决进程IO阻塞问题,Reactor模式。
- 适用于高性能服务器开发,一个进程或线程响应多个请求。
2.4 异步IO模型
进程发起IO操作,进程返回。内核拷贝完数据会以信号的方式,通知进程。进程在自己的信号处理函数中处理数据。
文章参考于<零声教育>的C/C++linux服务期高级架构。