<一>:IO 模型的种类: 

阻塞型、非阻塞型、复用型、信号驱动型、异步

 

<二>:IO 模型中概念:

1>. 同步/异步:

a. 关注消息通知机制。

b. 同步是指等待对方返回消息。

c. 异步是指被调用者通过状态、通知或回调机制通知调用者被调用者的运行状态。

 

2>. 阻塞/非阻塞:

a. 关注调用者在等待结果返回之前所处的状态;

b. 阻塞: blocking, 调用结果返回之前, 调用者被挂起;

c. 非阻塞: nonblocking , 调用结果返回之前, 调用者不会被挂起;

 

<三>:完成一次IO请求, 由两个阶段组成。

请求磁盘数据时, 使用到内核内存, 进程内存。 当接受到用户请求时,内核先将请求的数据加载至内核内存中,在从内核内存加载到进程内存。

第一步: 等待数据, 即数据从磁盘到内核内存。

第二步: 复制数据, 即数据从内核内存到进程内存。

 

<四>:如何判断IO模型?

IO模型的种类就是根据进程在IO请求的两个阶段时所处的状态分类的。

 

5IO模型具体特征?

1>. 阻塞型IO

IO请求的两个阶段,进程都是出于挂起状态的。

 

2>. 非阻塞型IO

IO请求第1阶段进程并没有出于阻塞模型, 在第2阶段出于阻塞状态。 但是第1阶段, 进程出于忙等状态, 不能处理任何请求。

 

3>. 复用型IO调用:  

在非阻塞IO模型的前提,每个进程可以监控多路IO的状态信号。

         

复用型IO在系统中实现方式?

select()BSD(Unix)系统中内核插件。

poll()是有Linux系统内核插件。

无论是select(), 还是poll()插件,都是可以使一个进程可以同时监控多路IO状态信号。 采用这种进制的IO模型为复用型IO调用。

 

 

4>. 信号驱动模型:

 IO请求的第一阶段,  进程是处于释放状态的,该期间进程接受别其他客户端请求。当IO第一阶段处理完之后,被调用者会通知进程资源加载完成,进程便处于阻塞状态,当IO请求第二阶段完成之后,进程将数据发往客户端。

 

event-drivent(事件驱动在系统中实现):

1>.  epoll (Linux) : 通过libevent库提供

2>.  Kqueue (BSD)

        3>.  /dev/poll (Solaris)

 

5>. 异步模型:

 IO请求的第一、二阶段, 进程都是处于释放状态的。进程仅仅负责接受客户端请求,之后的所有的工作进程都不需要负责。

 

<五>: Nginx的三大特征:

1>. Event-driven: 事件驱动

2>. Asynchronous: 异步

3> non-blockign: 非阻塞。

 

 

<六>: Httpd IO模型:

httpd各工作模式完成一次客户端的响应的需要的过程:

1>. prework : 二层模型, 主进程生成子进程,每一个进程仅能处理完一个用户请求,才能处理下一个请求。子进程接受一个用户请求,需要请求磁盘数据资源,进程处于睡眠状态,只有将请求的数据加载完,进程才会被唤醒。

2>.worker: 三层模型, 主进程生成子进程,子进程生成线程,线程用来处理用户请求。 当请求磁盘数据资源时,线程处于睡眠状态,只有将请求的数据加载完,线程才会被唤醒。

3>. event: 事件驱动,从生成进程角度来看上是二层模型, 从工作的模式角度来看是三层模型。 event事件驱动模型, 主进程生成子进程,每个子进程处理多个请求。 请求磁盘数据资源时,该子进程并没有处于睡眠状态。 该进程可以接受处理的别的客户端请求。