为了对n个设备使用总线的请求进行裁决_I/O设备

一个典型的系统架构。其中,CPU通过内存总线与系统内存相连。图像或其他高性能IO设备通过常规通用IO总线连接到系统(如PCI是其一种衍生形式)。接下来是外部总线(peripheral bus)如SCSI、SATA或USB连接最慢的设备(磁盘,键鼠等设备)。

b126b1fba1abb5e228e2892eaa237df9.png

物理布局和造价成本决定了这种分层架构,使高性能的设备离CPU更近,磁盘和其他低速设备离CPU越远。

为了更好的理解设备交互机制,这里抽象一个标准设备。下图显示的标准设备包含两个部分:一个部分是向系统其他部分展示的硬件接口interface(类似与软件接口,系统软件通过接口来控制它的特定操作,图中一个简化的接口包含三个寄存器:状态,命令和数据)。另一个部分是其内部结构internals,包含设备相关的内部实现。

f651f4848c64d0b395d6c1e9159158f1.png

图中一个简化的接口包含三个寄存器:状态,命令和数据。状态Status寄存器用于查看设备当前状态,命令Command寄存器用于通知设备执行某个具体任务,数据Data寄存器用于向设备传递或从设备读取数据。

一个对设备的操作的协议可被定义为:

1d1aaa647280956b3280fda5a1afbacd.png

协议分为四步

  1. 轮询polling设备,操作系统反复读取设备状态寄存器,等待设备进入可以接受命令的就绪状态。
  2. 把数据写入设备的数据寄存器。例如这个设备是磁盘,则需要多次写入操作把一个磁盘块4KB写入磁盘。在这个例子中CPU参与数据移动,被称为可编程IO,即PIO。
  3. 把命令写入设备的命令寄存器。
  4. 轮询设备,等待并判断设备是否执行命令。

然而polling轮询操作会导致CPU在这段时间内被浪费。因此工程师提出了“中断”方法。中断interrupt会产生一定切换开销,但允许CPU计算与设备IO重叠。当设备需要进行IO时,CPU不再需要轮询polling等待设备,而是产生中断,使对应进程等待(睡眠)。转而切换执行其他任务。当设备完成IO,会抛出硬件中断,此时CPU执行中断处理程序(interrupt handler)再唤醒等待的对应进程继续执行。

fddaf390568eaf9149f2d99aac605836.png

8e0e38fc34dcf69e8d7e84d39b00a19e.png

其中上图是polling:当设备IO时,操作系统会简单自旋,一直轮询设备状态。而下图是interrupt,当设备IO时,会中断执行其他进程。

而之前提到中断会产生一定切换开销,因此这并不总是一个很好的方案,当存在一高性能设备处理请求很快时,通常在一个CPU轮询时就能返回结果,这时使用polling反而更快。因此在设备时快时慢时,采用polling-interrupt hybrid策略可能更好,即先轮询一段时间,若设备没完成操作,再进行中断。另一个基于中断的优化是合并coalescing,设备完成IO并准备抛出中断时往往会等待一小段时间,在此期间,其他请求可能会很快完成,这样多次中断抛出可以合并为一次,以降低处理中断的代价。

一般来说,数据从内存到设备间的拷贝是需要CPU控制执行的。但这会浪费CPU的算力。

dd5b720b50f12287bdf514f5c7431b38.png

如图中的c部分,是从内存向设备的数据拷贝,为了分离这项工作,系统引入了DMA设备,可以协调完成内存和设备间的数据传输而不需要CPU介入。为了将内存的数据传入设备,操作系统会通过编程告诉DMA设备,需要传输数据的内存位置,传输数据量和设备拷贝到哪个设备的位置。DMA了解这些信息之后,即可独立完成数据传输工作。

14310fae40570b8035049223787aad75.png

操作系统与设备进行通信一般有两种方式:一是特权privileged指令,二是内存映射IO。

设备通过设备驱动程序纳入操作系统,驱动的意义在于构造一个通用块设备结构,以统一不同块设备的接口,实现一个与设备无关的操作系统。这可理解为一种抽象技术,在文件系统和设备之间抽线出一层通用块接口层。为上层系统隐藏底层设备的接口细节。

37aba61be039233bc248fb7d0b51c9ce.png

但这种封装也有不足,当某以块设备提供很多特殊的功能时,由于为了兼容操作系统,不得不提供通用块接口,会导致本身自带的特殊接口无法使用。操作系统代码中大部分都是驱动代码,而驱动代码的开发者水平良莠不齐。因此这也是内核代码崩溃的主要原因。

参考文献:

【1】 Operating Systems - Three Easy Pieces

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值