I/O模型和原理,以及简单解析客户端请求WEB服务器内部处理过程,MPM三种模


一.apache三种MPM对比。

1.)什么是MPM,看看官网的介绍:

wKiom1PwGu7wafAFAASDkgQYpa8591.jpg


2.)preforkMPM

多路处理模块(MPM),实现了一个非线程型的,预派生的WEB服务器模型,它适用于没有线程安全库,需要避免线程兼容的系统。它是将每个请求相互独立的情况下最好的MPM,单个请求出现问题,不会影响到其他的MPM。

 

3.)workerMPM

多路处理模块,支持混合线程,使用线程来处理请求,系统资源开销小于进程的MPM。使用了多个进程,每个进程又会生成多个线程,使得基于进程MPM的稳定性,如果挂掉一个进程,那么进程下的所有线程都会被影响。

 

4.)prefork对比worker:

prefork模式使用多个子进程,每个子进程一个线程,每个进程响应一个请求。大多数平台上,prefork在效率上要比worker高,但是内存及系统资源开销大。

worker模式使用多个子进程,每个进程生成多个线程,每个线程响应一个请求。在高并发的大流量的的服务器上,worker是一个比较不错的选择。内存占用开销小。

 

5.)nginx的event模式和apache的event的模式:

都是多线程,每个线程处理多个请求。

apache的event模式是信号驱动I/O。

nginx的event模式是异步I/O。


二.先来简单了解下客户端是怎么请求web服务器资源的。

wKioL1PwHOPh0ePGAAGLJ2mKs1U298.jpg

客户端基于网络发起请求(tcp socket通信模型),socket是位于domain中,domain有三种模型,unixdomain,每个socket地址是一个文件路径。ipv4domain是ipv4地址加上一个端口。ipv6 domain…。服务器接收到请求后,网卡看到ip地址就是本机内核所配置的地址,拆除ip首部封装,内核这个时候就看到了端口号,然后找到端口号对应的进程。数据不会直接交给进程处理,而是将数据缓存到内核内存上,等着数据全部加载完成后,复制到进程内存空间。进程开始处理数据,发现数据在磁盘的某个路径下,进程开始交给子进程去寻找数据,子进程没有访问磁盘的权限,而是发起一个软中断,转换为内核模式到磁盘读取数据。内核到磁盘找到数据库,开始向自己(内核内存)的内存缓存数据流,数据全部加载完毕后,内核通知子进程过来读取数据,子进程将数据返回给进程,进程在交给内核,内核开始封装tcp首部,ip首部,通过网卡返回给客户端。


三.I/O

1.)阻塞I/O

进程发起I/O调用,数据准备未完成之前,内核将进程转换为不可中断睡眠,这是阻塞。而内核将数据准备完成后,由内核内存空间复制到进程空间称为I/O。

 

2.)非阻塞I/O:

进程发起I/O调用,被调用函数完成前,不会阻塞当前进程,而是立即返回,开始盲等待。

 

3.)同步I/O:

进程发起一个过程调用后,在没有得到返回结果之前,该调用不会返回。

 

4.)异步I/O:进程发起一个过程调用后,即使被调用者不能立即将数据准备好,会返回未完成的结果,数据准备完成后,内核通知进程数据准备完毕,可以读取。


四.五种I/O模型:

1.)同步阻塞

2.)异步非阻塞

 

3)I/O复用模型:

一个进程处理多个I/O,同时处理监听套接字,请求套接字。

 

4.)信号驱动I/O:

进程发起I/O调用,进程会继续运行,但不会阻塞。当数据准备完成后,进程过接收到一个SIGIO信号,通知进程数据准备完成。

 

5.)异步I/O:

进程发起I/O调用,进程继续运行,不会阻塞,当数据准备完成后,由内核内存空间复制带进程内存空间后,通知进程I/O完成。


种I/O模型对比:

wKioL1PwHcPQ-2HbAAFMN8yIHf4302.jpg



 


你可能感兴趣的:(多线程,客户端,I/O,稳定性,流量)