<一>:IO 模型的种类:
阻塞型、非阻塞型、复用型、信号驱动型、异步
<二>:IO 模型中概念:
1>. 同步/异步:
a. 关注消息通知机制。
b. 同步是指等待对方返回消息。
c. 异步是指被调用者通过状态、通知或回调机制通知调用者被调用者的运行状态。
2>. 阻塞/非阻塞:
a. 关注调用者在等待结果返回之前所处的状态;
b. 阻塞: blocking, 调用结果返回之前, 调用者被挂起;
c. 非阻塞: nonblocking , 调用结果返回之前, 调用者不会被挂起;
<三>:完成一次IO请求, 由两个阶段组成。
请求磁盘数据时, 使用到内核内存, 进程内存。 当接受到用户请求时,内核先将请求的数据加载至内核内存中,在从内核内存加载到进程内存。
第一步: 等待数据, 即数据从磁盘到内核内存。
第二步: 复制数据, 即数据从内核内存到进程内存。
<四>:如何判断IO模型?
IO模型的种类就是根据进程在IO请求的两个阶段时所处的状态分类的。
5种IO模型具体特征?
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事件驱动模型, 主进程生成子进程,每个子进程处理多个请求。 请求磁盘数据资源时,该子进程并没有处于睡眠状态。 该进程可以接受处理的别的客户端请求。
原文:http://9280078.blog.51cto.com/9270078/1888006