IO模型

2019-07-14 10:56发布

用户空间与内核空间

为了保证内核安全,不受到用户程序进程的干扰,操作系统将虚拟内存分为两部分:内核空间和用户空间

进程切换

从一个进程的运行转到另一个进程上运行,这个过程中经过下面这些变化(资源开销很大):
1. 保存处理机上下文,包括程序计数器和其他寄存器。
2. 更新PCB信息。
3. 把进程的PCB移入相应的队列,如就绪、在某事件阻塞等队列。
4. 选择另一个进程执行,并更新其PCB。
5. 更新内存管理的数据结构。
6. 恢复处理机上下文。

进程阻塞

正在执行的进程,由于期待的某些事件未发生,如请求系统资源失败、等待某种操作的完成、新数据尚未到达或无新工作做等,则由系统自动执行阻塞原语(Block),使自己由运行状态变为阻塞状态。可见,进程的阻塞是进程自身的一种主动行为,也因此只有处于运行态的进程(获得CPU),才可能将其转为阻塞状态。当进程进入阻塞状态,是不占用CPU资源的

文件描述符fd

文件描述符是一个索引值,指向内核为每一个进程所维护的该进程打开文件的记录表。当程序打开一个现有文件或者创建一个新文件时,内核向进程返回一个文件描述符。

缓存 I/O - 标准IO

在 Linux 的缓存 I/O 机制中,操作系统会将 I/O 的数据缓存在文件系统的页缓存( page cache )中,也就是说,数据会先被拷贝到操作系统内核的缓冲区中,然后才会从操作系统内核的缓冲区拷贝到应用程序的地址空间。
缓存 I/O 的缺点是数据在传输过程中需要在应用程序地址空间和内核进行多次数据拷贝操作,这些数据拷贝操作所带来的 CPU 以及内存开销是非常大的。

IO操作的两个阶段

  1. 等待数据准备至内核缓存区中(阻塞与非阻塞)
  2. 将数据从内核缓存区拷贝至用户程序进程中
正式因为这两个阶段,linux系统产生了下面五种网络模式的方案。
- 阻塞 I/O(blocking IO)
- 非阻塞 I/O(nonblocking IO)
- I/O 多路复用( IO multiplexing)
- 信号驱动 I/O( signal driven IO)
- 异步 I/O(asynchronous IO)

同步和异步区别

POSIX的定义synchronous IO和asynchronous IO是这样子的: - A synchronous I/O operation causes the requesting process to be blocked until that I/O operation completes; - An asynchronous I/O operation does not cause the requesting process to be blocked; 这里写图片描述
即整个IO操作(两个阶段都没有阻塞,则是异步,反之为同步)

阻塞和非阻塞区别:

请求开始到结果返回是否立即返回
这里写图片描述

常见IO模型:

阻塞、非阻塞、IO多路复用,异步

阻塞IO

这里写图片描述
从用户进程发起系统调用到数据从内核拷贝至用户进程,全部是被阻塞状态。

非阻塞IO

这里写图片描述
在数据准备阶段,进程并没有被阻塞(轮询),但在数据拷贝的阶段,进程被阻塞了。

IO多路复用

select、poll、epoll select为例: 当用户进程调用了select,那么整个进程会被block,而同时,kernel会“监视”所有select负责的socket,当任何一个socket中的数据准备好了,select就会返回。这个时候用户进程再调用read操作,将数据从kernel拷贝到用户进程。 所以,I/O 多路复用的特点是通过一种机制一个进程能同时等待多个文件描述符,而这些文件描述符(套接字描述符)其中的任意一个进入读就绪状态,select()函数就可以返回 这里写图片描述
和阻塞IO十分相似,两个阶段IO都被阻塞了,但是它在单进程的情况下比阻塞IO还要糟糕,因为在两个阶段中间,还多了一次系统调用,即监控进程通知用户进程数据已到。 所以IO多路复用的优势并不在快,而在能够管理多个IO(文件描述符)

异步IO

这里写图片描述
异步IO在准备数据和拷贝数据两个阶段都没有阻塞,全过程由内核进程完成,当IO完成后,内核进程通知用户进程

看到一个很生动的例子

参考链接 阻塞IO:我和女友点完餐后,不知道什么时候能做好,只好坐在餐厅里面等,直到做好,然后吃完才离开。 非阻塞IO:我女友不甘心白白在这等,又想去逛商场,又担心饭好了。所以我们逛一会,回来询问服务员饭好了没有,来来回回好多次,饭都还没吃都快累死了。 IO多路复用(事件驱动):你有多个女友都要在那里吃饭,然后你苦逼的在餐厅等着不断询问几个女友的饭是否有好了的,这时你的女友们就可以出去继续逛街,然后你一但发现某个女友的饭好了就打电话通知该女友来吃饭。 异步IO:女友不想逛街,又餐厅太吵了,回家好好休息一下。于是我们叫外卖,打个电话点餐,然后我和女友可以在家好好休息一下,饭好了送货员送到家里来。

热门文章