@wangjialin
2017-03-24T06:24:59.000000Z
字数 2703
阅读 771
os
IO是input和output的简写,直观理解就是输入输出,也就是数据的流动,很明显对于不同的主体输入输出就有不同的定义
linux对IO文件的操作分为缓存IO(BufferIO)和直接IO(DirectIO)。
参考缓存IO,对于一次IO访问,数据会被先copy到内核缓冲区,然后再从内核缓冲区copy到进程的地址空间,所以对于一次read,他会经历两个阶段:
1. 等待数据准备
2. 将数据从内核copy到进程中
根据这两个阶段内进程的状态,linux中将IO模型分为以下五种
同步阻塞IO特点是进程执行一个read操作后,直到数据返回,进程一直都会被阻塞,让出CPU,不能处理别的IO。具体过程如下:
优点:
1. 符合人的逻辑思维,开发比较简单
2. 及时返回数据,没有延迟,适合实时系统
3. 在希望能够立即发送和接收数据并且需要处理socket数量比较少的时候可以选择阻塞IO
缺点:
1. 对于需要处理socket数量较多的情况下不适合,扩展性能差
同步非阻塞IO特点是进程发出read操作之后需要不断地主动询问数据准备好了没有。具体就是:
优点:
1. 准备数据的时候用户进程不会被阻塞,也就意味着可以在数据准备的过程中可以处理别的任务
缺点:
1. 数据返回有延迟,因为每过一段时间才进行一次read操作,而数据可能在两次轮询之间的任意时间完成
2. 轮询会消耗大量的CPU时间,会导致整体数据吞吐量的降低
IO多路复用特点是单个进程可以同时处理多个网络IO。这个模型会用到select、poll、epoll这些调用函数,他们都是内核级别的,但是和阻塞IO相比差别是,这些函数可以同时阻塞多个IO操作。和非阻塞IO的轮询相比,用户进程可以等待多个socket,同时处理多个网络io,但是用户进程不是等待全部socket数据到达之后再处理,而是只要有一部分到达就会调用用户进程来处理。具体如下:
优点:
1. 系统在单线程的情况下也可以同时处理多个网络io,与多线程相比不需要维护额外的线程运行,系统开销小
2. 适合服务器需要同时处理多个处于监听状态或者连接状态的socket;适合服务器需要同时处理多种网络协议的socket
缺点:
1. 用了两个系统调用,这样的话在网络连接数不是特别多的情况下,使用这个模型的web server可能还没有使用多线程+阻塞IO性能好
这个模型用的比较少,特点是进程预先告诉内核,当某个描述符发生某件事时使用信号通知进程
这个模型主要特点是用户进程不关系数据什么时候到达内核且一直都是非阻塞的。
优点:
1. 对用户而言更省事,cpu利用率高
缺点:
1. 很多系统不支持,而且linux系统的异步最初是为了数据库设计,所以不会被缓冲,也就没办法利用操作系统的缓冲机制
2. 对开发者而言更加复杂,需要考虑数据复制好之后通知用户进程时用户进程的状态(进程在用户态处理任务——强行打断调用实现注册的信号处理函数决定何时以及如何处理这个任务;进程在内核态处理事情——通知挂起等进程回到用户态;进程被挂起——唤醒)