web优化必须了解的原理之I/o的五种模型和web的三种工做模式nginx
===========================================web
图解五种I/O模型apache
图解web支持的三种工做模式并发
===========================================异步
五种I/O:
ide
1)阻塞I/0函数
2)非阻塞I/O性能
3)I/O复用优化
4)事件(信号)驱动I/Ospa
5)异步I/O
为何要发起系统调用?
由于进程想要获取磁盘中的数据,而能和硬件打交道的只能是内核,进程通知内核说我要磁盘中的数据,此过程就是系统调用。
一次I/O的完成的步骤
当进程发起系统调用时,这个系统调用就进入内核模式,而后开始I/O操做
I/O操做分为两个步骤;
1、磁盘把数据装载到内核的内存空间,
2、内核的内存空间的数据copy到用户的内存空间中(此过程是I/O发生的地方)
如下是进程获取数据的详细图解过程;
整个过程:此进程须要对磁盘中的数据进行操做,则会向内核发起一个系统调用,而后此进程,将会被切换出去,此进程会被挂起或者进入睡眠状态,也叫不可中断的睡眠,由于数据尚未获得,只有等到系统调用的结果完成后,则进程会被唤醒,继续接下来的操做,从系统调用的开始到系统调用结束通过的步骤:
①进程向内核发起一个系统调用,
②内核接收到系统调用,知道是对文件的请求,因而告诉磁盘,把文件读取出来
③磁盘接收到来着内核的命令后,把文件载入到内核的内存空间里面
④内核的内存空间接收到数据以后,把数据copy到用户进程的内存空间(此过程是I/O发生的地方)
⑤进程内存空间获得数据后,给内核发送通知
⑥内核把接收到的通知回复给进程,此过程为唤醒进程,而后进程获得数据,进行下一步操做
I/O发生的地方才会出现阻塞或非阻塞
阻塞:进程发起I/O调用,进程又不得不等待I/O的完成,此时CPU把进程切换出去,进程处于睡眠状态则此过程为阻塞I/O
阻塞I/O系统怎么通知进程?
I/O完成,系统直接通知进程,则进程被唤醒
阻塞I/O的图解
非阻塞:进程发起I/O调用,I/O本身知道需过一段时间完成,就当即通知进程进行别的操做,则为非阻塞I/O
非阻塞I/O,系统怎么通知进程?
每隔一段时间,问内核数据是否准备完成,系统完成后,则进程获取数据,继续执行(此过程也称盲等待)
非阻塞I/O的图解:
I/O复用的图解:
事件(信号)驱动I/O的图解:
水平触发的事件驱动机制;内核通知进程来读取数据,进程没来读取数据,内核须要一次一次的通知进程;
边缘触发的事件驱动机制;内核只通知一次让进程来读取数据,进程能够在超时时间以内随时来读取数据。
nginx就采用了边缘触发的事件驱动机制,这就是为何nginx的并发性比apache好,固然nginx的性能比apache好,还有其它方面,如nginx支持异步I/O,mmap(内存映射)等等
异步I/O的图解:
前四种I/O属于同步操做,最后的一种则属于异步操做
五种I/O模型的比较:
web的三种工做模式
Prefork工做原理
主进程生成多个工做进程,由工做进程一对一的去响应客户端的请求
图解Prefork工做原理:
Worker工做原理
主进程生成多个工做进程,每一个工做进程生成一个多个线程,每一个线程去
响应客户端的请求
图解Worker工做原理:
Event工做原理
主进程生成多个工做进程,每一个工程进程响应多个客户端的请求,当接收
到客户端的I/O操做请求后,把I/O操做交给内核执行,进程去响应其余客
户端的请求,此进程最后接到内核的通知,而后经过此进程回复客户端的
请求结果,经过事件回调函数
图解Event工做原理:
本博客是根据看相应的文章,写出的本身对I/O的理解,可能并不精确,但愿广大博友多多指点,谢谢指教