王优秀|A 字母时,操作系统期间发生了什么...,键盘敲入( 三 )


恢复被中断进程的上下文;
通用块层
对于块设备 , 为了减少不同块设备的差异带来的影响 , Linux通过一个统一的通用块层 , 来管理不同的块设备 。
通用块层是处于文件系统和磁盘驱动中间的一个块设备抽象层 , 它主要有两个功能:
第一个功能 , 向上为文件系统和应用程序 , 提供访问块设备的标准接口 , 向下把各种不同的磁盘设备抽象为统一的块设备 , 并在内核层面 , 提供一个框架来管理这些设备的驱动程序;
第二功能 , 通用层还会给文件系统和应用程序发来的I/O请求排队 , 接着会对队列重新排序、请求合并等方式 , 也就是I/O调度 , 主要目的是为了提高磁盘读写的效率 。
Linux内存支持5种I/O调度算法 , 分别是:
没有调度算法
先入先出调度算法
完全公平调度算法
优先级调度
最终期限调度算法
第一种 , 没有调度算法 , 是的 , 你没听错 , 它不对文件系统和应用程序的I/O做任何处理 , 这种算法常用在虚拟机I/O中 , 此时磁盘I/O调度算法交由物理机系统负责 。
第二种 , 先入先出调度算法 , 这是最简单的I/O调度算法 , 先进入I/O调度队列的I/O请求先发生 。
第三种 , 完全公平调度算法 , 大部分系统都把这个算法作为默认的I/O调度器 , 它为每个进程维护了一个I/O调度队列 , 并按照时间片来均匀分布每个进程的I/O请求 。
第四种 , 优先级调度算法 , 顾名思义 , 优先级高的I/O请求先发生 , 它适用于运行大量进程的系统 , 像是桌面环境、多媒体应用等 。
第五种 , 最终期限调度算法 , 分别为读、写请求创建了不同的I/O队列 , 这样可以提高机械磁盘的吞吐量 , 并确保达到最终期限的请求被优先处理 , 适用于在I/O压力比较大的场景 , 比如数据库等 。
存储系统I/O软件分层
前面说到了不少东西 , 设备、设备控制器、驱动程序、通用块层 , 现在再结合文件系统原理 , 我们来看看Linux存储系统的I/O软件分层 。
可以把Linux存储系统的I/O由上到下可以分为三个层次 , 分别是文件系统层、通用块层、设备层 。 他们整个的层次关系如下图:
王优秀|A 字母时,操作系统期间发生了什么...,键盘敲入
文章图片
这三个层次的作用是:
文件系统层 , 包括虚拟文件系统和其他文件系统的具体实现 , 它向上为应用程序统一提供了标准的文件访问接口 , 向下会通过通用块层来存储和管理磁盘数据 。
通用块层 , 包括块设备的I/O队列和I/O调度器 , 它会对文件系统的I/O请求进行排队 , 再通过I/O调度器 , 选择一个I/O发给下一层的设备层 。
设备层 , 包括硬件设备、设备控制器和驱动程序 , 负责最终物理设备的I/O操作 。
有了文件系统接口之后 , 不但可以通过文件系统的命令行操作设备 , 也可以通过应用程序 , 调用read、write函数 , 就像读写文件一样操作设备 , 所以说设备在Linux下 , 也只是一个特殊的文件 。
但是 , 除了读写操作 , 还需要有检查特定于设备的功能和属性 。 于是 , 需要ioctl接口 , 它表示输入输出控制接口 , 是用于配置和修改特定设备属性的通用接口 。
另外 , 存储系统的I/O是整个系统最慢的一个环节 , 所以Linux提供了不少缓存机制来提高I/O的效率 。
为了提高文件访问的效率 , 会使用页缓存、索引节点缓存、目录项缓存等多种缓存机制 , 目的是为了减少对块设备的直接调用 。
为了提高块设备的访问效率 , 会使用缓冲区 , 来缓存块设备的数据 。
键盘敲入字母时 , 期间发生了什么?
看完前面的内容 , 相信你对输入输出设备的管理有了一定的认识 , 那接下来就从操作系统的角度回答开头的问题「键盘敲入字母时 , 操作系统期间发生了什么?」


推荐阅读