吉林大学 现代操作系统 期末复习 第五章 输入/输出

5.1 硬件原理

5.1.1 I/O设备

I/O设备大致可以分为两类:块设备和字符设备。
块设备

  • 块设备把信息存储在固定大小的块中,每个块有自己的地址
  • 传输以一个或多个完整的块为单位
  • 每个块都能独立于其他块而读写
  • 硬盘、蓝光光盘、USB盘都是最常见的块设备

字符设备

  • 字符设备以一个字符为单位发送或接收一个字符流
  • 字符设备不可寻址,不考虑任何块设备
  • 打印机,鼠标,以及大多数与磁盘不同的设备

5.2.2设备控制器

I/O设备一般由机械部件和电子部件两部分组成,电子部件称作设备控制器(device controller)或适配器(adapter)常常以芯片或印刷电路板形式出现,而机械部件则是设备本身。

控制器的任务时把串行的位流转换为字节块,并进行必要的错误校正工作。字节块通常首先在控制器内部的一个缓冲区中按位进行组装,然后再对校验和进行校验并证明字节快没有错误后,将它复制到主存。

5.2.3 内存映射I/O

设备控制器有几个寄存器和可以读写的缓冲区。cpu与设备的控制寄存器和数据进行通信的方式有两种。

  • I/O空间与内存空间分离: 给每个寄存器分配一个I/O端口,所有的I/O端口形成I/O端口空间
  • 内存映射I/O,将所有的控制器映射到内存空间。

在这里插入图片描述

内存空间的优点

  • I/O设备驱动可以完全用c 写
  • 不需要特殊的保护机制来阻止用户进程执行I/O操作
  • 可以引用内存的每一条指令引用控制寄存器

5.1.4 直接存储器存取

无论一个CPU是否具有内存映射I/O,它都需要寻址设备控制器以便与设备交换数据。CPU可以从I/O控制器每次请求一个字节的数据,但是这样做浪费CPU时间,所以经常用到一种称为直接存储器存取(Direct Memory Access,DMA) 的方案。它可以使得设备在 CPU 不参与的情况下,能够⾃⾏完成把设备 I/O 数据放⼊到内存。那要实现 DMA 功能要有 「DMA 控制器」硬件的⽀持。

在这里插入图片描述

当没有DMA时的工作方式

  • 控制器从磁盘驱动器串行的一位一位读一个块,直到将整个块信息放入控制器的内部缓存中
  • 检验后,没有错误控制器产生一个中断。
  • 重复地从控制区的缓冲区中一次一个字节或一个字地读取该块的信息,后其存入内存。

有DMA时的工作方式

  • CPU通过设置DMA控制器的寄存器对它进行编程,通知它要读多少数据,要读到什么位置;
  • DMA 控制器会向磁盘控制器发出指令,通知它从磁盘读数据到其内部的缓冲区中,接着磁盘控制器将缓冲区的数据传输到内存;
  • 当写操作完成时,磁盘控制器在总线上发出一个应答信号到DMA控制器,DMA控制器检查是否完成所有内容的写,如果没有继续重复上述过程;
  • 经过检查发现传送工作完成了之后,DMA 控制器发中断通知 CPU 指令完成,CPU 就可以直接⽤内存⾥⾯现成的数据了;

5.1.5重温中断

请添加图片描述
中断的工作原理如下:

当一个IO设备完成交给它的工作时,就会产生一个中断(假设操作系统以及放开中断),它是通过分配给它第一条总线信号线上置其的信号而产生中断的。该信号被主板上的中断控制器芯片监测到,由中断控制器芯片决定做什么。

中断信号导致CPU停止当前正在做的工作并且开始做其它的事情。地址线上的数字被用作指向一个称为中断向量的表格的索引,以便读取一个新的程序计数器。

在开始服务程序之前,硬件总是要保存一定的信息。作为最低限度,必须保存程序计数器,而另一个极端,所有可见的寄存器和许多内部寄存器都要保存。

5.2I/O软件原理

5.2.1 I/O软件的目标

  • 设备独立性:它可以访问任意I/O设备而无需事先指定设备,与独立性密切相关的事文件和设备统一命名
  • 错误处理:错误应该尽可能地在接近硬件的层面得到处理。在许多情况下,错误恢复可以在可以在低层透明地的得到接近,而高层软件甚至不知道存在这一错误。
  • 同步和异步:大多数物理IO是异步的——CPU启动传输时就去做其它工作,直到中断发生。如果IO操作是阻塞的,那么程序更容易编写。只是操作系统使实际上是终端驱动的操作变成来用户看来
    是阻塞式的操作。
  • 缓冲(buffering):数据离开一个设备之后通常并不能直接存取到其最终的目的地,需要缓冲区。
  • 共享与独占

5.2.2 程序控制I/O

使用程序控制 I/O 又被称为 可编程I/O。

  • 它是指由 CPU 在驱动程序软件控制下启动的数据传输,来访问设备上的寄存器或者其他存储器。
  • CPU 在等待时会采用轮询(polling)或者 忙等(busy waiting) 的方式。

实现简单,但是占用CPU时间

5.2.3 中断控制I/O

进行I/O时CPU可以进行其他运算,准备好下一次IO操作时,产生一个中断。

缺点是,例如打印机打印中断会发生在每一个字符上,频繁中断浪费CPU时间。

5.2.4 DMA的I/O

通过DMA给IO设备提供数据,而不需要打扰CPU。
将中断次数从每个字符一次减少到每个缓冲区一次。

5.3 I/O软件层次

I/O软件通常被分为四个层次。
请添加图片描述

5.3.1 中断处理程序

当中断发生时,中断处理程序将做它必须要做的全部工作以便对中断进行处理。

以下这些步骤是硬件中断完成之后必须在软件中执行的

  • 保存没有被中断硬件保存的所有寄存器。
  • 为中断服务过程设置上下文。(包括TLB、MMU、页表)
  • 为中断服务过程设置堆栈。
  • 应答中断控制器,如果不存在集中的中断控制器,则再次开放中断。
  • 将寄存器从它们被保存的地方复制到进程表中。
  • 运行中断服务过程,从发出中断的设备控制器的寄存器提取信息
  • 选择下一次运行哪个进程。
  • 为下一次运行的进程设置MMU上下文。
  • 装入新进程的寄存器。
  • 开始运行新进程。

5.3.2 设备驱动程序

每个连接到计算机上的IO设备都需要某些设备特定的代码来对其进行控制,即设备驱动程序。

每个设备驱动程序通常处理一种类型的设备,不过在有时候,极其不同的设备却基于相同的底层技术,如USB。

为了访问设备的硬件,设备驱动程序通常必须是操作系统内核的一部分。请添加图片描述

5.3.3 与设备无关的I/O设备

设备驱动程序和与设备无关的软件之间的确切界限依赖于具体系统。

与设备无关的软件的基本功能是执行对所有设备公共的IO功能,并且向用户软件一个统一的接口。
设备驱动程序的统一接口
在这里插入图片描述
缓冲

请添加图片描述

  • 无缓冲的输入:每个到来的字符,都得启动用户进程。缺点:效率低
  • 用户空间的缓冲:用户进程在用户空间提供一个包含n个字符的缓冲区。缺点:当字符到来时,缓冲区又可能被调出分页。
  • 内核空间缓冲 + 用户空间缓冲:在内核空间创建一个缓冲区,将字符放到这个缓冲区。当内核缓冲区满时,复制到用户缓冲区
  • 双缓冲:第一个缓冲区填满之后,在它清空之前,使用第二个缓冲区。
  • 循环缓冲区,一个指针指向缓冲区数据中第一个字,另一个指向下一个空闲的字。
    错误报告
    当错误发生时,操作系统必须尽最大努力对它们进行处理。许多错误时特定设备是特定的并且必须有适当的驱动程序来处理,但是错误处理的框架是设备无关的。
  • 编程类型的错误:这些错误发生在一个进程请求某些不可能的事情时,例如写一个输入设备。处理此问题,返回错误报告即可
  • 实际I/O错误,试图写一个被破坏的磁盘块。在这种情形下,应该有驱动程序决定做什么。如果驱动程序不知道怎么做,应该向上传递。

分配与释放专用设备
某些设备,比如打印机,在任意给定的时刻只能由一个进程使用。这就要求操作系统对设备使用的方式进行检查,并且根据请求的设备是否可用来接受或拒绝这些请求。
与设备无关的块大小
不同的磁盘可能具有不同的扇区。应该由与设备无关的软件来隐藏这一事实并且向高层提供统一大小的块。

5.3.4用户空间的I/O软件

尽管大部分I/O软件都在操作系统内部,但是仍然有一小部分在用户空间,包括与用户程序连接在一起的库,甚至完全运行于内核之外的程序。比如scanf,printf。
假脱机技术

并非所有的用户层I/O软件都是有库函数,另一个重要类别假脱机系统。假脱机是多道程序设计系统处理独占I/O设备的方式。
创建一个进程守护进程,以及特殊目录(假脱机目录)。一个进程要打印一个文件时,首先要生成要打印的整个文件,并且放在假脱机目录中。

I/O系统的工作方式
请添加图片描述

5.4 盘

5.4.1 盘硬件

磁盘请添加图片描述

请添加图片描述
磁盘控制器在今天来看,更像是一个微处理器,它可以接受一组高级指令,可以对数据缓存,坏块重映射等工作。对于磁盘驱动程序有一个很有意义的指标就是,磁盘控制器能否一次控制两个或多个驱动器(马达)进行寻道。这被称为重叠寻道。一个控制器可以在让某个驱动器读取数据的时候,命令另一个驱动器去寻道。不过,一般而言一个控制器只会和主存有一次传输,因为多次传输会降低平均速率。

请添加图片描述
为了提高利用率,现代磁盘被划分为环带,外层的环带比内层的环带扇区数要多,但此改变对操作系统是透明的,因为磁盘给都有一个虚拟几何规格。

5.4.2 磁盘格式化

当然,在低级初始化时,可能会进行柱面斜进,因为每次进行连续读取时,当前磁道读完了,可能需要读取下一个磁道,如果磁道起始终止位置一样的话,那么大概率在把磁头移过去时,第0号扇区已经过去了,因为移动磁头需要时间。所以可以把下一个磁道的0号扇区后移几个,这就叫做柱面斜进。
请添加图片描述

当然了,也存在磁头斜进,不过他的时间远小于一个柱面斜进的时间。
当控制器读取到扇区上的数据时,进行ECC校检之后,会把数据写回到主存,这个过程需要时间,所以可能下一个扇区就在磁头下溜走了,所以可以错开一个存放,给控制器一点时间,或者错开两个,前者是单交错,后者是双交错。
请添加图片描述
低级格式完成后,要对磁盘进行分区,逻辑上,每个分区就是一个独立的磁盘。一般来说,0号分区是主引导记录,现代操作系统也支持GPT,即GUID分区表,以实现更大的分区。
分区完毕后,对每个分区进行高级格式化。这一操作会设置引导块,空闲分区管理(空闲列表或位图),根目录,和一个空的文件系统。还要把一个代码设置在分区表的对应项里,用以表明在此分区中使用的是哪个文件系统。
当电源打开,BIOS运行,读入主引导记录,并进行跳转,然后这一引导程序试图找到活动的分区,接着找到存放操作系统内核的文件系统,载入OS。

5.4.3 磁盘臂调度算法

  • 先来先服务算法(FCFS),组织一个链表,把所有请求按照到达顺序组织起来,依次处理,但是时间消耗比较严重。
  • 最短寻道优先算法(SSF),每次处理与当前磁头最近的请求,这一算法会导致请求分配不公平,边缘的请求被执行的机会会少很多。
  • 电梯算法,此算法维护一个方向位,每次处理完一个请求,检查方向位是UP还是DOWN,如果是UP,则上移处理更高位置的请求,如果没有更高位置的请求,则方向位取反,然后重复刚刚的操作。如果没有请求,就停在此处。

5.4.4 错误处理

磁盘可能出现坏扇区的情况,那么需要进行ECC修复,这是在错误仅有几位的情况下,如果扇区无法通过校检修复,就只能使用备用扇区以及重映射了。
一般有两个方法处理坏块,在控制器中对他们进行处理或者在OS中对他们进行处理。前一个方法是使用备用扇区进行替代,这是在出厂前进行的处理,有两种方法实现这个:

请添加图片描述
对于第一种修复方法,需要维护一张表格,记录坏块的替换块是谁,每个磁道一张表;对于第二种方法,则是通过设置前导码实现,不过这种方法需要坏块后面全部的前导码,好处就是性能好一些,不需要旋转一圈来找到坏块的备用块。
如果已经开始运行了,发生了坏块,那么使用第一种方法更好一些,因为第二种方法还要进行数据的复制,可能比较耗时,引起系统卡顿。

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值