IO模型详解及应用

 

如何阅读这篇文章顺序

1.1:了解同步异步和阻塞非阻塞

    1.11: 同步异步

    1.12:阻塞非阻塞

1.2:了解一次read操作需要的步骤

1.3:五种模型

1.1:I/O模型中的同步异步,阻塞非阻塞:

1.11:同步和异步:synchronousasyncronous

    关注的是消息通知机制

 

同步概念:调用发出之后不会立即返回,但一旦返回,则返回则是最终结果:

异步:调用发出之后,被调用方立即返回消息,但返回的并非最终结果,被调用者通过状态、通知机制等来通知调用者,或通过回调函数来处理结果。

同步异步:关注的是调用者如何等待结果

 

 

1.22:阻塞和非阻塞:blocknonblock

 

阻塞:调用结果返回之前,调用者会被挂起:调用者只有在得到返回结果之后才能继续:

非阻塞:调用者在结果返回之前:不会被挂起,即调用不会阻塞调用者

例子:比如你去饭馆吃面需要等着上面才能吃到。   

阻塞:当你在点面的时候前面排队的人很多,老板和你说一句客官稍等,这时候你没办法做其他事情这就是阻塞。

非阻塞:比如你和老板关系不错,你跟老板说一句给你上面,你就出去买烟估摸时间差不多了就回去了,这就是非阻塞。

  • 异步同步:关注的是调用者等待被调用者返回调用结果时的状态
  • 阻塞和非阻塞:关注的是如何通知被调用者结果已经完成

根据上面的概念划分的话常见的I/O模型分为这五种。

I/O模型:

blocking IO  # 阻塞式IO

nonblocking IO  # 非阻塞式IOIO multiplexing # 复用式IO

signal driven #事件驱动IO,事件驱动式IO有通知机制的

通知:

    水平触发:多次通知

    边缘触发:只通知一次

 asynchronous IO # 异步IO

1.2:为了解释I/O模型,举个read操作的例子。

例如:从磁盘一次read操作大体分为两个步骤

用户空间的进程是无法直接访问硬件的,所以步骤大概如下。

当一个用户进程需要进行io操作的时候向系统内核发送调用请求调用什么数据。这时候就分为两个步骤了。

  • 步骤一.当内核得到用户进程通知要调用数据的时候,内核本身是没有这个数据的,数据是在磁盘上的。所以内核会从磁盘加载到自己的内存中(内核内存) # 这个内存不是用户进程的那个内存,虽然内核能这么做,但这是不推荐的。
  • 步骤二.这个时候用户进程还是没有这个数据的,所以用户进程还需要从内核内存中copy一份数据到自己的这个进程内存中。这个就是第二个步骤

真正属于IO操作的步骤是内核内存中的数据到进程内存数据,这个属于真正执行IO操作步骤的阶段。内核内存从磁盘取数据的阶段是等待事件完成阶段。

 

 

 

五种IO模型

阻塞式I/O模型

当调用者发起调用请求之后,此处调用者一方会被挂起,这个时候进程会转入不可中断式睡眠状态,这个时候调用者在得到结果之前什么事情也不能够去做,将一直处于等待过程当中。 阻塞型I/O举例:当一个用户访问你web服务器的时候,这个时候你服务器会有一个进程去处理用户的请求去取数据,这个时候这个进程是被挂起的状态。这个时候这个进程是不能处理其他用户的请求,因为处于睡眠状态。当然事实情况是不会用阻塞式I/O的因为是需要处理两路请求的,一部分网络I/O请求,一部分磁盘I/O请求。一个进程通常情况下只能处理单路I/O的

非阻塞式I/O模型

50000+
5万行代码练就真实本领
17年
创办于2008年老牌培训机构
1000+
合作企业
98%
就业率

联系我们

电话咨询

0532-85025005

扫码添加微信