1. 客户发起请求,
2. 服务器网卡接受到报文转交给内核TCP/IP协议栈处理;
3. 内核将请求转发给工作在用户空间的Web daemon
4. Web daemon根据用户请求的页面,向内核申请系统调用完成I/O操作
5. 内核发现web服务器进程请求的是一个存放在硬盘上的资源,因此通过驱动程序连接磁盘
6. 内核调度磁盘,获取需要的资源
7. 内核将资源复制到内核buffer中,并通知Web daemon
8. Web daemon通过系统调用取得资源,并将其复制到进程自己的缓冲区中
9. Web daemon形成响应,通过系统调用再次发给内核以响应用户请求
10.内核将封装报文,并发送到网卡
11.网卡将报文发送响应给用户
进程无法直接操作I/O(为了安全的原因),需要通过系统调用,进程请求内核完成I/O。
内核会为每个I/O设备维护一个buffer,将数据复制进buffer中有一个等待的过程。将buffer中的数据复制到进程也有一个等待的过程。根据等待模式不同I/O动作可分为五种类型。
blocking I/O
进程请求内核完成I/O时一直处于阻塞状态,直到数据从buffer复制到进程后,内核唤醒进程。一个请求接入后不能再接收其它请求。
noblocking I/O
进程请求内核完成I/O时,等待数据复制到内核buffer过程中,一直测试数据是否准备好。从内核buffer复制到进程过程中,进程一直出于阻塞状态。
I/O复用
进程向内核请求系统调用完成I/O,等待数据复制到内核buffer过程一直出于阻塞状态。复制到内核buffer后。内核不再将内核buffer中数据复制到进程,而是进程再次请求系统调用,将内核buffer中数据复制到进程,这个过程中进程也出于阻塞状态。
evetn-driven I/O
进程向内核请求系统调用完成I/O,等待数据复制到内核buffer过程不阻塞,而是复制完成后通知进程。复制到内核buffer后。内核不再将内核buffer中数据复制到进程,而是进程再次请求系统调用,将内核buffer中数据复制到进程,这个过程中进程处于阻塞状态。
AIO
整个过程都不阻塞,而是将内核buffer中数据复制到进程后通知进程,进程可以直接取数据响应。
web服务的常见工作方式:
多进程方式:每个进程处理一个请求,生成、销毁进程间切换消耗大量CPU资源的内存资源,当负载较大,性能显著降低。
优点: 比较稳定,各进程之间是独立的,单个进程问题不会影响其他进程。
缺点: 资源占用大
多线程方式:一个进程生成多个线程,每个线程处理一个请求。由于线程开销明显小于进程,而且部分资源还可以共享,因此效率较高
优点:效率高,低开销。线程间部分数据是共享的,且线程生成与线程间的切换所需资源开销比进程间切换小得多。
缺点:稳定性差,负载高时,线程快速切换过快会造成线程抖动,且线程过多会造成服务器不稳定。
异步方式:使用非阻塞方式处理请求,一个进程或一个线程处理多个请求。
优点:性能好,一个进程或线程处理多个请求,没有线程间切换。
缺点:稳定差,某个进程或线程出错,可能导致大量请求无法处理
apache三种工作模式
我们都知道Apache有三种工作模块,分别为prefork、worker、event。
prefork:多进程,每个请求用一个进程响应,这个过程会用到select机制来通知。
worker:多线程,一个进程生成多个线程,每个线程响应一个请求,但通知机制还是select不过可以接受更多的请求。
event:基于异步I/O模型,一个进程或线程,每个进程或线程响应多个用户请求,它是基于事件驱动(也就是epoll机制)实现的。
本文出自 “在路上” 博客,请务必保留此出处http://mingxiao.blog.51cto.com/8124243/1655760
原文地址:http://mingxiao.blog.51cto.com/8124243/1655760