IO模型简介

web服务的发展:

1.单进程阻塞同步模型

这里写图片描述

当个web进程处理客户的所有访问,客户的请求需要排队等候获取,比如:开仓放粮,只有一个人发放粮食,等待获取粮食的人只能是排队等候。

2.多进程模型:

这里写图片描述

在web服务中有一个web的主进程,管理其他的子进程。当多个客户发送请求时,web的主进程对创建新的子进程对应不同的客户请求。以开仓放粮为例:现场有一个总调度,负责下面好多人的工作内容,当难民数量较少时,领取粮食可以通过多个窗口同时领取。

进程获取磁盘资源的过程:

这里写图片描述

进程获取资源需要通过内核控制CPU获取磁盘的数据,web进程获取数据(index.html),需要告诉管理员(kernel),管理员需要指挥cpu处理。
:
1.web-> kernel: 老大,给我一下index.html

2.kernel –> web : 等一会,我先找,找得到了给你

(web进程处于不可中断睡眠)

3.系统分为内核态和用户态,kernel获取磁盘的数据之后存放到内核的内存中,让后将内核的内存中的数据复制到用户态的进程的内存中。

数据从磁盘到内存的过程:
内存中数据读取是分页的,如果一页的内存大小是4M,磁盘的block的大小是1M,那么一次IO(读取内存的一个页面)需要从磁盘上获取4个block的内容。

DMA:直接内存访问(一般情况下是CPU为内核开辟内存空间等,DMA相当于将CPU的该功能分离出来。)

不可中断睡眠:当客户发送请求到服务器,服务器的进程需要通过内核调用资源,在内核调用资源的过程中,产生了IO调用,该进程的状态为wait,阻塞状态。(直接激活该进程也无法向客户端反馈数据)

单进程:阻塞
多进程:每一个进程响应一下请求
进程量大,进程切换数过多
每一个进程的空间是独立的,很多空间是重复数据,所以内存的使用率较低。

线程:thread
(Linux中没有线程,管理方式的与进程的不同,叫做轻量级进程LWP【light weight process】)

 每一个线程响应一个请求:
     线程依然需要切换,比起进程的切换属于轻量级
     同一个进程的线程可以共享进程的诸多资源,比如打开的文件
     与进程相比内存的使用率较低

进程等待CPU的返回数据:忙等、闲等

忙等:CPU时时查看资源是否已经获取到了
闲等:CPU先执行其他的进程,当轮到该进程再处理

异步非阻塞

多路IO(IO复用):
一般情况下,已经进程处理一个请求,如果一个进程处理多个请求,该进程将多个用户的请求汇总之后,告知内核,当数据获取之后在通知客户。客户接到通知之后获取数据。

AIO:异步IO

IO动作的执行:

进程无法直接操作I/O设备,必须通过系统调用请求kernel来协助完成I/O动作,内核会为每一个I/O设备维护一下buffer

这里写图片描述

  1. Process —> kernel : 给我拿一下index.html的数据
  2. kernel —> I/O Device : 拿一下/web/index.html的数据,放到我的buffer中
  3. I/O Device 开始干活读取数据,并存放到kernel的buffer中
  4. kernel —>Process : 数据获取好了,已经将我的buffer中数据拷贝到你的内存中。

对于输入对于输入而言,等待(wait)数据输入至buffer需要时间,而从buffer复制(copy)数据至进程也需要时间

分类

根据等待模式不同,I/O动作可分为五种模式
blocking I/O: 阻塞I/O
nonblocking I/O: 非阻塞I/O
I/O multiplexing (select and poll): I/O复用
signal driven I/O (SIGIO): 信号驱动I/O
asynchronous I/O (aio_): 异步I/O

Synchronous I/O:引起请求进程阻塞,直到I/O完成;
Asynchronous I/O:不导致请求进程阻塞;

同步:对于硬件来讲,双方需要同步时钟信号,设备之间的通信是通过二进制(01)实现通信,0代表的是低电压、1代表的是高电压、如果传输0111111到第二台设备,第二台设备只有和第一台设备时钟同步才能确定有几个1传输。
异步:双方不需要同步时钟信号,在数据报文直接有标记区分。

这里写图片描述

阻塞:

进程在获取数据的过程中一直都处于等待状态。

这里写图片描述

非阻塞

进程告知kernel从I/O设备上获取数据之后,一直在询问获取数据的进展,当kernel从I/O设备上获取数据完成之后,停止询问,开始等待kernel的buffer中的数据复制到进程的内存中。

这里写图片描述

I/O复用

kernel从IO设备上获取数据时,进程一直处于等待状态,数据获取完毕之后会通知进程,进程得到通知之后,重新调用系统告知内核开始复制buffer内容中的数据到进程的内存中。

这里写图片描述
I/O复用的能够处理多个请求,只是在中间的不阻塞的状态处理其他的请求,一般情况下I/O复用在多线程的状态下使用。

信号驱动 I/O

kernel从磁盘中获取数据,进程不是阻塞状态,当数据获取完毕之后会通知进程,进程再次通过系统调用通知内核开始将kernel中的buffer中的数据拷贝到进程中。
这里写图片描述

kernel获取数据之后通知进程的机制有两种水平触发和边缘触发。
水平触发:一直通知直到进程回应,
边缘触发:只通知一次。

异步 I/O

进程向kernel发送请求之后,kernel会响应一下进程,当数据获取完毕并复制到进程之后,会发送通知给进程。
这里写图片描述

IO五种模型的实例理解:

以到餐馆吃饭为例:
有两个过程:后厨做饭,将饭端到你的桌子上

阻塞:在前台报完面之后,一直等到饭端到你面前(你什么都不做只是等待)
非阻塞:从前台报完面之后,隔一会就问一下做好了没有,直到面做好,然后让服务员把面端到你桌上。

IO复用:从前台报完面之后,就做那儿一直等着,直到面做好,服务员吼一嗓子“xxxx号的面好了”,你听到之后回一句:”在这儿呢,端过来吧”。除了这个一问一答,其他时间你都在那儿等待。

异步IO:你和前台的说要打包带走,好了之后电话通知你,然后您就打游戏去了。

参考链接:http://blog.csdn.net/historyasamirror/article/details/5778378

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值