httpd有三种MPM
1,prefork:一个主进程生成多个子进程,每个子进程处理一个请求,通常他以管理员的用户启动,监听在80端口(复用IO,select多路调用模型)
2,Work:一个主进程生成多个子进程,每个子进程生成多个线程,每个线程响应一个请求(复用IO)
3,event:一个主进程生成多个子进程,每个子进程响应多个请求(事件驱动IO)
I/O模型通常有两种方式,分别为同步IO和异步IO,以及阻塞IO和非阻塞IO
同步:
同步关注的是消息通知机制,如何通知调用者,调用发出请求后不会立即返回,一旦返回,则返回最终结果!
同步IO,调用方向被调用方请求一个应用,函数或者库调用,以及系统调用
异步:调用发出后,被调用方立即返回消息,但是返回的并非最终结果,被调用者通过通知机制等来通知调用者,或通过回调函数来处理结果
阻塞和非阻塞:关注的是调用者等待被调用者返回调用结果时的状态
阻塞:调用结果返回之前,调用者会被挂起,调用者只有在得到返回结果之后才能继续
非阻塞:调用者在结束返回之前,不会被挂起,即调用不会阻塞调用着
I/O模型:
blocking IO(阻塞IO),nonblocking IO(非阻塞IO),IO multiplexing(复用IO),signal drve IO(事件驱动IO),asynchronous(异步IO)
硬盘IO:
首先访问内核,内核收到请求,加载硬盘数据至内核空间,在从内核内存复制到进程内存
一个进程发起IO请求调用后,IO将由两个阶段组成一次IO,第一,数据从磁盘到内核内存,第二,数据从内核内存到进程内存,而这个过程中真正称为IO的步骤只是数据从内核内存到进程内存的过程。一个进程通常是处理单路IO
阻塞IO:调用一方被挂起,则计入阻塞等待
非阻塞IO:被调用者从硬盘到内核内存,在从内核内存到进程内存,调用者也分为两个阶段,调用者发出请求后,被调用者立即回复请求已收到后进入盲等待!
复用IO:进程自身只处理一个IO,一旦被IO阻塞,直到阻塞被唤醒之前,其他信息则不处理,默认情况下,调用者向被调用户发送请求就是直接调用请求本身,(select调用模式和poll调用模式) ,而复用IO select将调用者分别分配到不同的调用请求处理,但是select是有上限(上限为1024),prefork则基于select多路调用模型实现,从select来看,调用者仍然阻塞
事件驱动IO:调用者发起调用,被调用者第二阶段。
磁盘到内核内存在到进程内存,被调用者和内核收到用户请求后,立即返回调用者,请求已收到,对于调用者来讲,第一阶段已完成,无需盲等待。可继续处理第一阶段请求。第二阶段请求完成会通知调用者,而后处理下一个请求!第二阶段仍然阻塞,从内核空间到进程空间
事件驱动的通知机制:
1,水平触发:多次通知
2,边缘触发:只通知一次
异步IO:调用者向内核发起请求,请求收到后内核会完成这个调用,而整个调用过程无需调用者等待!
一次READ操作:
1,等待数据:从磁盘到内核内存
2,从内核内存复制到进程内存