一、什么是IO操作
即对系统中资源的读、写。
分为两个阶段:
(1) 准备阶段,例如输入操作时要等待数据已经就绪,输出操作时缓冲区中有空间可供使用;
(2) 数据拷贝阶段,例如输入操作时将数据从内核复制到用户缓存,输出操作时将用户缓存复制到内核。
二、linux下的IO模型
(1)阻塞IO模型
(2)非阻塞IO模型
(3)IO复用模型
(4)信号驱动IO模型
(5)异步IO模型
前四种属于同步IO,第五种是异步IO。前4中模型在第一阶段的准备阶段有区别,在第二阶段的数据拷贝过程中都会阻塞用户进程,而(5)在第一阶段的准备阶段和第二阶段的数据拷贝过程都不会阻塞用户进程。
三、
(1)阻塞IO模式:应用进程调用系统IO函数,若内核没有准备好,则准备阶段和数据拷贝阶段都会阻塞应用进程。
(2)非阻塞IO模型:应用进程调用系统IO函数,若内核没有准备好,则准备阶段会给应用系统一个信号,使其在准备阶段不阻塞,当数据准备就绪时,应用进程还是会阻塞在数据拷贝阶段。
(3)IO复用模型:进程一般使用的接口函数为select或者poll让内核监控多个描述符的就绪状态,内核通过select查询到所监控的描述符中有就绪的,则把就绪的描述符返回给调用进程,进程此时可以通过描述符对其进行IO操作。准备阶段阻塞的是接口函数select或poll,数据拷贝过程阻塞的是IO操作。
(4)信号驱动IO模型:信号驱动IO模型是让内核在描述符就绪时发送SIGIO信号通知用户进程。在使用信号驱动模型进行IO操作时,首先要打开socket使用信号驱动IO的能力;然后调用sigaction或signal系统调用设置信号SIGIO的处理函数,sigaction或signal系统调用不会被阻塞。应用进程收到SIGIO时会对描述符进行IO操作,数据拷贝阶段同样会阻塞。
(5)异步IO模型中,用户进程发起读取调用之后会立即返回,待内核接收到数据并将数据拷贝到用户进程空间之后,再通知用户进程。准备阶段和数据拷贝阶段都没有阻塞。
四、同步IO与异步(重叠)IO的区别
(1)同步IO在同一时刻只允许一个IO操作,也就是说对于同一个文件句柄IO操作是序列化的,重叠IO允许一个或多个线程同时发出IO请求。
(2)同步IO会降低cpu任务量,异步相比之cpu任务量较大。