一、IO类型分类:

同步和异步:关注的是消息通知机制

  同步(synchronous):调用发出之后不会立即发出返回,但一旦返回就是最终结果

  异步(asynchronous):调用发出之后,被调用者会立即返回消息,但返回的结果并非是最终结果,被调用者通过状态机制或者消息通知机制来通知调用者;即通过回调函数来处理结果

 

阻塞和非阻塞:关注的是调用者等待调用结果(消息、返回值)的状态

 阻塞:调用结果返回之前,调用者(调用线程)会被挂起,处于不可中断的睡眠状态(Uninterruptable),调用者只有在得到结果后才返回

 非阻塞:调用结果返回之前,调用不会阻塞当前线程


二、httpd的IO模型

 1、阻塞型IO: blocking IO

  当进程发起recvfrom调用,内核发现内核空间没有数据,不会立即返回recvfrom调用结果,而是从硬盘中加载数据,准备数据;等内核空间的数据准备好之后,再把内核空间的数据复制到进程空间,复制完成后,通过回调函数,告诉进程数据数据已准备好,可以使用;进程在等待内核准备数据到复制数据到进程空间这段时间是被阻塞的。

          IO模型学习笔记_IO模型



 2、非阻塞模型:nonblocking IO

   当进程发起recvfrom调用,内核立刻返回调用信息,但返回的不是最中结果;内核发现内核空间没有数据,便从硬盘中加载数据,即准备数据,在内核准备数据的这段时间,进程不断的发送信息,内核返回信息给进程,此时进程处于盲等待状态,及非阻塞状态;当内核数据准备完后,从内核空间复制数据到进程空间,这复制数据的这段时间中,进程是被阻塞的;复制完以后通过回调函数返回给调用者,即进程

         IO模型学习笔记_IO模型_02

 

 3、IO复用模型:IO multiplexing;select(),poll()

  当进程发起IO调用,内核会立刻返回信息,但并不是最终结果;内核开始准备数据,从硬盘加载数据至内核空间,在这段时间内,进程不断发送消息,但是都被IO复用器阻塞,所以在内核准备数据的这段时间内,进程是被IO复读器阻塞;内核准备好数据以后开始复制数据到进程空间,数据复制完成后通知进程,资源可以使用;在这段时间内进程是被IO阻塞。

          IO模型学习笔记_IO模型_03


 4、信号驱动模型:SIGNAL Driven IO

  当进程发起IO调用,内核会立即返回信息,但不是最终结果;内核开始准备数据,从硬盘加载数据到内核空间;在这段时间内,进程是非阻塞的;当内核数据准备完成后,通知知进程,开始复制数据到进程空间;在这段时间内;进程是被阻塞的;

         IO模型学习笔记_IO模型_04

 5、异步IO模型:asynchronous IO

  当进程发起调用,内核会立即返回信息;但不是最后结果;然后内核开始准备数据,从硬盘加载数据到内核空间;数据准备完成后,开始将内核空间的数据复制到进程空间;复制完成后;通知进程可以使用;在内核准备数据到从内核复制数据到进程空间这段时间内;进程处于非阻塞状态。

     IO模型学习笔记_IO模型_05