如何阅读这篇文章顺序
1.1:了解同步异步和阻塞非阻塞
1.11: 同步异步
1.12:阻塞非阻塞
1.2:了解一次read操作需要的步骤
1.3:五种模型
1.1:I/O模型中的同步异步,阻塞非阻塞:
1.11:同步和异步:synchronous,asyncronous
关注的是消息通知机制
同步概念:调用发出之后不会立即返回,但一旦返回,则返回则是最终结果:
异步:调用发出之后,被调用方立即返回消息,但返回的并非最终结果,被调用者通过状态、通知机制等来通知调用者,或通过回调函数来处理结果。
同步异步:关注的是调用者如何等待结果
1.22:阻塞和非阻塞:block,nonblock
阻塞:调用结果返回之前,调用者会被挂起:调用者只有在得到返回结果之后才能继续:
非阻塞:调用者在结果返回之前:不会被挂起,即调用不会阻塞调用者
例子:比如你去饭馆吃面需要等着上面才能吃到。
阻塞:当你在点面的时候前面排队的人很多,老板和你说一句客官稍等,这时候你没办法做其他事情这就是阻塞。
非阻塞:比如你和老板关系不错,你跟老板说一句给你上面,你就出去买烟估摸时间差不多了就回去了,这就是非阻塞。
- 异步同步:关注的是调用者等待被调用者返回调用结果时的状态
 - 阻塞和非阻塞:关注的是如何通知被调用者结果已经完成
 
根据上面的概念划分的话常见的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的
