码迷,mamicode.com
首页 > 其他好文 > 详细

I/O模型

时间:2015-05-27 21:17:50      阅读:209      评论:0      收藏:0      [点我收藏+]

标签:i/o模型 apache niginx


技术分享


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

I/O模型

标签:i/o模型 apache niginx

原文地址:http://mingxiao.blog.51cto.com/8124243/1655760

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!