Web服务器和客户端是一对多关系,一个服务器必须能够同时处理来自多个客户端的请求。主要有一下三种方式
1. web服务器处理网络请求的机制
1.多进程方式
服务器每当接收到一个客户端的请求连接,就由服务器的主进程生成一个子进程和该客户端建立的连接进行交互,直到连接结束。Apache采用的是这种模式,后来改进提前生生成进程,但是本质没有变化。
- 优点:设计实现简单,进程间彼此独立,互不干涉。进程退出时由系统回收,比较方便。
- 缺点:进程创建开销比较大,需要内存复制,并发量比较大的时候压力比较大。
- 多线程方式
服务器收到客户单的请求时,由主进程创建一个线程来处理请求。
-
优点:创建的线程的开销小于进程
-
缺点:同一个进程的多个线程数据共享,需要开发者自己对内存进行管理。服务器需要长时间工作,会累加出错的风险。
3.异步方式
-
同步阻塞:发送方向接收方发送请求后,如果接收方处理请求的IO操作如果不能马上得到结果,就要一直等待结果,不能进行其他操作,类似超时排队结账。
优点是实现简单,缺点是效率不高。
-
同步非阻塞方式:发送方向接收端发送请求后,IO操作不能立即返回,接收方会立即返回做其他的事情,但是因为此时没有得到结果。在得到结果以后再返回给客户端,此期间接收方一直等待。直到收到响应后接收方发起下一次请求。
实际不使用这种方式
-
异步阻塞方式:接收方发送请求后,不必立即等待结果,可以进行其他操作,接收方IO操作要等待完成,期间不能进行其他操作。
实际不使用
。 -
异步非阻塞方式:接收方和发送方在处理请求的IO期间, 都可以做其他的事情,结果响应完成以后在返回给接收方。
效率最高
。
2.nginx 对网络请求的机制
nginx采用多进程机制+异步非阻塞模式处理网络请求
nginx 由一个主进程和多个work进程完成请求处理。主进程负责调度,work进程负责处理客户端的请求。多个work进程类似于apache服务器的处理方式,在每个work进程内部,采用异步非阻塞模式处理请求。 多进程机制保障在访问量增加的时候不增长对系统资源的压力,异步非阻塞模式减少工作进程在IO调用的延迟,保证了处理能力
。
异步非阻塞模式是如何实现的:IO调用是如何把自己的状态通知给工作进程的?
可以让工作进程隔一段时间取轮询查询,如果IO完成操作就通知客户端,如果没有完成就继续当前工作。这种方式会造成额外的开销,最好的方式是让IO在调用完成后主动通知工作进程,工作进程收到通知后,返回结果给客户端。select/poll/epoll/kqueue
这些事件驱动模型,就提供了一种通知机制,让一个进程可以并发处理多个请求,IO的状态完全驱动模型来管理,通知也有驱动模型来完成,事件驱动模型是linux操作系统自身支持的机制
。异步非阻塞模式以后将会单独学习,通过代码实验的方式去测试实现效果。
网友评论