1.IO的概念
- IO简单来讲就是对输入输出设备的简化表达形式
- 单片机中各种接口,进行数据流的传输
- 从磁盘中读取数据至内存,又或者从内存中写入磁盘
- 编程中的IO
- 此时的IO其应用程序的运行态,即进程---》IO调用
- 特别强调的是我们的应用程序其实并不存在实质的IO过程,真正的IO过程是操作系统的事情,
- 这里把应用程序的IO操作分为两种动作:IO调用和IO执行。
- 因此所有的IO操作算作IO调用,之后由内核进行执行
2.Linux中的5种IO模型
5种IO模型
同步IO:阻塞IO模型、非阻塞IO模型、IO复用模型、信号驱动的IO模型
异步IO
阻塞IO模型--bio---blockIO--》
非阻塞IO模型
注:阻塞和非阻塞的属性,是属于fd本身,默认为阻塞,可以通过
fcntl( fd,flag | O_NONBLOCK )进行非阻塞设置
IO复用模型 :IO多路复用
信号驱动的IO模型
异步IO
reactor---反应堆模型
一些概念
- 阻塞和非阻塞---》针对于线程状态,
- 一旦阻塞,线程被挂起,不能做其它事情)
- 非阻塞可以做其他事情:在等待的过程中可以做其它事情
- 同步和异步---》线程的做事顺序,异步和同步是相对的
- 同步为一个线程必须做完一件之后,通知再做下一件
- 异步为不必做完一件之后,再做下一件,可以一次性做多个,做完通知一下
- 同步和互斥--》两者的角度不同
- 同步按照一定的顺序执行,访问者对资源的有序访问。
- 互斥:同一个资源同一时间只有一个访问者可以进行访问,其他访问者需要等前一个访问者访问结束才可以开始访问该资源。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。
- 总结:同步是一种更为复杂的互斥,而互斥是一种特殊的同步。
3.常用使用形式----》用途
- 阻塞IO模型:阻塞socket
- 进程阻塞挂起不消耗CPU资源,及时响应每个操作;
- 实现难度低、开发应用较容易;
- 适用并发量小的网络应用开发;
- 非阻塞IO模型:socket是非阻塞的方式,超时处理
- 进程轮询(重复)调用,消耗CPU的资源;
- 实现难度低、开发应用相对阻塞IO模式较难;
- 适用并发量较小、且不需要及时响应的网络应用开发;
- IO复用模型 :select、poll、epoll三种方案,nginx都可以选择使用这三个方案
- 专一进程解决多个进程IO的阻塞问题,性能好;Reactor模式;
- 实现、开发应用难度较大;
- 适用高并发服务应用开发:一个进程(线程)响应多个请求
- 信号驱动的IO模型:信号机制不可控,不建议应用于服务层(业务层)
- 回调机制,实现、开发应用难度大;
- 异步IO:高性能服务器应用
- 不阻塞,数据一步到位;Proactor模式;
- 需要操作系统的底层支持,LINUX 2.5 版本内核首现,2.6 版本产品的内核标准特性;
- 实现、开发应用难度大;
- 非常适合高性能高并发应用;
4.拓展
在网络编程中,为什么使用IO多路复用,而不是异步IO?