type
status
date
slug
summary
tags
category
icon
password
类型
标签
状态
如何将I/O 集成进计算机系统中? I/O 应该如何集成进系统中?其中的一般机制是什么?如何让它们变得高效?
系统架构
在如下计算机架构中,CPU通过某种内存总线(memory bus)或互连电缆连接到系统内存。更下面是外围总线(peripheral bus)。它们将最慢的设备连接到系统包括磁盘、鼠标及其他类似设备。

这样的分层架构物理布局合理且造价成本低。越快的总线越短,因此高性能的内存总线没有足够的空间连接太多的设备。采用这种分层的方式,可以让要求高性能的设备离CPU更近一些,低性能设备离CPU远一些。
标准设备
标志设备不是真实存在的,它是包含两个重要组件的设备。第一部分是向系统其他部分展现的硬件接口(interface)。第二部分是它的内部结构(internal structure)。包含设备相关定点特定实现,负责具体实现宿舍吧展示给系统的抽象接口。

标准协议
一个简化的设备接口包括3个寄存器:一个状态(state)寄存器,可以读取并查看设备的当前状态;一个命令(command)寄存器,用于通知设备执行某个具体任务;一个任务寄存器,将数据传给设备或从设备接收数据。
操作系统与该设备交互协议如下:
该协议分为四部:
- OS 反复读取状态寄存器,等待设备进入可以接受命令的状态。称为轮询(polling)设备。
- OS 下发数据到数据寄存器。
- OS 将命令写入命令寄存器
- OS 再次通过不断轮询寄存器,等待并判断设备是否执行完成命令。
这个协议的轮询过程比较低效,在等待设备执行完成命令时浪费大量 CPU 时间,如果此时操作系统可以切换执行下一个就绪进程,就可以大大提高 CPU 的利用率。
利用中断减少CPU开销
有了中断后,CPU不需要不断轮询设备,而是向设备发出一个请求,然后就可以让对应进程睡眠,切换执行其他任务。当设备完成了自身操作,会抛出一个硬件中断,引发 CPU 跳转执行操作系统预先定义好的中断服务例程(Interrupt Service Routine,ISR),或更为简单的中断处理程序(interrupt handler)。中断处理程序会结束之前的请求并且唤醒等待 I/O的进程继续执行。
中断允许计算与 I/O 重叠(overlap),这是提高CPU利用率的关键。

上图,进程1 在CPU上运行一段时间,然后发出一个读取数据的I/O请求给磁盘。、如果没有中断,那么操作系统就会简单自旋,不断轮询设备状态,直到设备完成 I/O 操作(对应其中的 p)。当设备完成请求的操作后,进程 1 又可以继续运行。
当我们运行进程重叠:

磁盘处理进程1的请求时,操作系统在CPU上运行进程2.磁盘处理完成后,触发一个中断,然后操作唤醒进程1继续运行。无论是CPU还是磁盘都可以有效地利用。
中断并非总是比 PIO(Programmed I/O) 好
尽管中断可以做到计算与 I/O 的重叠,但这仅在慢速设备上有意义。如果短时间内出现大量的中断,可能会使得系统过载并且引发活锁。
利用DMA 进行更高级的数据传输
使用DMA(Direct Memory Access)来减少 PIO 的开销。DMA 是一种特殊设备,可以协调完成内存和设备间的数据传递,不需要CPU介入。其工作过程如下:
为了能将数据传送给设备,OS会通过编程告诉 DMA 引擎数据在内存的位置,要拷贝的大小以及要拷贝哪个设备。之后,OS 就可以处理其他请求了。当DMA 的任务完成后,DMA 控制器会抛出一个中断来告诉操作系统自己已经完成数据传输。修改后的时间先如下:

由上图知,数据的拷贝工作都是由 DMA 控制器来完成的,因为 CPU 在此时是空闲的,所以操作系统可以让它做一些其他事情。
设备交互方法
随着设备的发展,主要有两种方式来实现与设备的交互。
- 用明确的 I/O指令。这些指令规定了操作系统将数据发送到特定设备寄存器的方法,从而允许构造上文提到的协议。
- 内存映射 I/O (memory-mapped I/O)。通过这种方式,硬件将设备寄存器作为内存地址提供。
设备启动器
如何实现一个设备无关的操作系统 如何保持操作系统的大部分与设备无关,从而对操作系统的主要子系统隐藏设备交互的细节?
抽象(abstraction)技术:在最底层,OS 知道设备如何工作,将这部分软件称为设备驱动器(device drive),所有设备的交互细节都封装在其中。
在Unix 的文件系统栈中,文件系统完全不清楚使用的何种类型的磁盘。它只需要简单地向通用块备层发送读写请求即可,块设备层会将这些请求路由给对应的设备驱动,然后设备驱动来完成真正的
底层操作。

小结
中断和 DMA,用于提高设备效率。
访问设备寄存器的两种方式:I/O 指令和内存映射 I/O
- Author:Uonlra
- URL:https://www.uonlra.blog//article/1d654775-fb6a-806e-a50e-cd9c346f748e
- Copyright:All articles in this blog, except for special statements, adopt BY-NC-SA agreement. Please indicate the source!