IO模型
阻塞IO 非阻塞IO 同步IO 异步IO
针对网络IO的操作,可以分成两个阶段,准备阶段和操作阶段。
1,准备阶段 是判断是否能够操作(即等待数据是否可用),在内核进程完成的;
2,操作阶段 则执行实际的IO调用,数据从内核缓冲区拷贝到用户进程缓冲区。
5种IO模型分别是
阻塞IO模型、非阻塞IO模型、
IO复用模型、信号驱动的IO模型、异步IO模型;前4种为同步IO操作,只有异步IO模型是异步IO操作。
网络模型: https://zhuanlan.zhihu.com/p/336513738
知乎: 理解一下5种IO模型、阻塞IO和非阻塞IO、同步IO和异步IO - 知乎
阻塞IO
1、典型应用:阻塞socket、Java BIO;
2、特点:
- 进程阻塞挂起不消耗CPU资源,及时响应每个操作;
- 实现难度低、开发应用较容易;
- 适用并发量小的网络应用开发;
不适用并发量大的应用:因为一个请求IO会阻塞进程,所以,得为每请求分配一个处理进程(线程)以及时响应,系统开销大。
非阻塞IO
1、典型应用:socket是非阻塞的方式(设置为NONBLOCK)
2、特点:
- 进程轮询(重复)调用,消耗CPU的资源;
- 实现难度低、开发应用相对阻塞IO模式较难;
- 适用并发量较小、且不需要及时响应的网络应用开发;
同步阻塞IO ( IO复用)
1、典型应用:select、poll、epoll三种方案,nginx都可以选择使用这三个方案;Java NIO;
2、特点:
- 专一进程解决多个进程IO的阻塞问题,性能好;Reactor模式;
- 实现、开发应用难度较大;
- 适用高并发服务应用开发:一个进程(线程)响应多个请求;
3、select、poll、epoll
- Linux中IO复用的实现方式主要有select、poll和epoll:
- Select:注册IO、阻塞扫描,监听的IO最大连接数不能多于FD_SIZE;
- Poll:原理和Select相似,没有数量限制,但IO数量大扫描线性性能下降;
- Epoll :事件驱动不阻塞,mmap实现内核与用户空间的消息传递,数量很大,Linux2.6后内核支持;
信号驱动IO模型
当进程发起一个IO操作,会向内核注册一个信号处理函数,然后进程返回不阻塞;当内核数据就绪时会发送一个信号给进程,进程便在信号处理函数中调用IO读取数据。
特点:回调机制,实现、开发应用难度大;
异步IO模型
当进程发起一个IO操作,进程返回(不阻塞),但也不能返回果结;内核把整个IO处理完后,会通知进程结果。如果IO操作成功则进程直接获取到数据。
1、典型应用:JAVA7 AIO、高性能服务器应用
2、特点:
- 不阻塞,数据一步到位;Proactor模式;
- 需要操作系统的底层支持,LINUX 2.5 版本内核首现,2.6 版本产品的内核标准特性;
- 实现、开发应用难度大;
- 非常适合高性能高并发应用;