输入输出
除了提供抽象(例如,进程(和线程)、地址空间和文件)以外,操作系统还要控制计算机的所有I/O(输入/输出)设备。
(向设备发送命令、捕捉中断,处理设备的各种错误。)
1 I/O硬件原理
1.1 I/O设备
I/O设备大致可以分为两类:
块设备(block device)
字符设备(character device)
块设备
块设备把信息存储在固定大小的块中,每个块有自己的地址。块设备的基本特征是每个块都能独立于其他块而读写。(硬盘、CD-ROM和USB盘是最常见的块设备。)
字符设备
字符设备以字符为单位发送或接收一个字符流,而不考虑任何块结构。字符设备是不可寻址的,也没有任何寻道操作。(打印机、网络接口、鼠标)
文件系统只处理抽象的块设备,而把与设备相关的部分留给较低层的软件。
1.2 设备控制器
I/O设备一般由机械部件和电子部件两部分组成。
电子部件称作设备控制器(device controller)或适配器(adapter)。在个人计算机上,它经常以主板上的芯片的形式出现,或者以插入(PCI)扩展槽中的印刷电路板的形式出现。机械部件则是设备本身。
控制器的任务是把串行的位流转换为字节块,并进行必要的错误校正工作。
1.3 内存映射I/O
每个控制器有几个寄存器用来与CPU进行通信。通过写入这些寄存器,操作系统可以命令设备发送数据、接收数据、开启或关闭,或者执行某些其他操作。通过读取这些寄存器,操作系统可以了解设备的状态,是否准备好接收一个新的命令等。
除了这些控制寄存器以外,许多设备还有一个操作系统可以读写的数据缓冲区。
CPU如何与设备的控制寄存器和数据缓冲区进行通信?
1)每个控制寄存器被分配一个I/O端口(I/O port)号,这是一个8位或16位的整数。所有I/O端口形成I/O端口空间(I/O port space),并且受到保护使得普通的用户程序不能对其进行访问(只有操作系统可以访问)。
2)内存映射:将所有控制寄存器映射到内存空间中,每个控制寄存器被分配惟一的一个内存地址,并且不会有内存被分配这一地址。
3)混合方案:具有内存映射I/O的数据缓冲区,而控制寄存器则具有单独的I/O端口。
内存映射的优点:
1)、对于内存映射I/O,设备控制寄存器只是内存中的变量,在C语言中可以和任何其他变量一样寻址。因此,对于内存映射I/O,I/O设备驱动程序可以完全用C语言编写。如果不使用内存映射I/O,就要用到某些汇编代码。
2)第二,对于内存映射I/O,不需要特殊的保护机制来阻止用户进程执行I/O操作。
3)可以引用内存的每一条指令也可以引用控制寄存器。
内存映射的缺点:
1)首先,现今大多数计算机都拥有某种形式的内存字高速缓存。对一个设备控制寄存器进行高速缓存可能是灾难性的。
2)如果只存在一个地址空间,那么所有的内存模块和所有的I/O设备都必须检查所有的内存引用,以便了解由谁做出响应。
1.4 直接存储器存取
无论一个CPU是否具有内存映射I/O,它都需要寻址设备控制器以便与它们交换数据。CPU可以从I/O控制器每次请求一个字节的数据,但是这样做浪费CPU的时间,所以经常用到一种称为直接存储器存取(Direct Memory Access,DMA)的不同方案。
1.5 重温中断
在硬件层面,中断的工作如下所述。当一个I/O设备完成交给它的工作时,它就产生一个中断(假设操作系统已经开放中断),它是通过在分配给它的一条总线信号线上置起信号而产生中断的。该信号被主板上的中断控制器芯片检测到,由中断控制器芯片决定做什么。
中断信号导致CPU停止当前正在做的工作并且开始做其他的事情。
中断分为精确中断和不精确中断
将机器留在一个明确状态的中断称为精确中断(precise interrupt)。
精确中断
精确中断具有4个特性:
1)PC(程序计数器)保存在一个已知的地方。
2)PC所指向的指令之前的所有指令已经完全执行。
3)PC所指向的指令之后的所有指令都没有执行。
4)PC所指向的指令的执行状态是已知的。
2 I/O软件原理
2.1 I/O软件的目标
1)统一命名
2)错误处理:错误应该尽可能地在接近硬件的层面得到处理。
3)是同步(synchronous)(即阻塞)和异步(asynchronous)(即中断驱动)传输。大多数物理I/O是异步的——CPU启动传输后便转去做其他工作,直到中断发生。如果I/O操作是阻塞的,那么用户程序就更加容易编写——在read系统调用之后,程序将自动被挂起,直到缓冲区中的数据准备好。正是操作系统使实际上是中断驱动的操作变为在用户程序看来是阻塞式的操作。
4)是缓冲(buffering)。数据离开一个设备之后通常并不能直接存放到其最终的目的地。
5)共享设备和独占设备
2.2 程序控制I/O
IO的三种实现方式
1)程序控制I/O:I/O的最简单形式是让CPU做全部工作,这一方法称为程序控制I/O(programmed I/O)。程序控制I/O十分简单但是有缺点,即直到全部I/O完成之前要占用CPU的全部时间。
2)中断驱动I/O
3)使用DMA的I/O
3 I/O软件层次
I/O软件通常组织成四个层次,每一层具有一个要执行的定义明确的功能和一个的定义明确的与邻近层次的接口。功能与接口随系统的不同而不同。
3.1 中断处理程序
当中断发生时,中断处理程序将做它必须要做的全部工作以便对中断进行处理。然后,它可以将启动中断的驱动程序解除阻塞。
3.2 设备驱动程序
每个连接到计算机上的I/O设备都需要某些设备特定的代码来对其进行控制。这样的代码称为设备驱动程序(device driver),它一般由设备的制造商编写并随同设备一起交付。因为每一个操作系统都需要自己的驱动程序,所以设备制造商通常要为若干流行的操作系统提供驱动程序。
设备驱动程序具有若干功能。最明显的功能是接收来自其上方与设备无关的软件所发出的抽象的读写请求,并且目睹这些请求被执行。除此之外,还有一些其他的功能必须执行。例如,如果需要的话,驱动程序必须对设备进行初始化。它可能还需要对电源需求和日志事件进行管理。
3.3 与设备无关的I/O软件
1)设备驱动程序的统一接口
2)缓冲
3)错误报告
4)分配与释放专用设备
5)与设备无关的块大小
3.4 用户空间的I/O软件
尽管大部分I/O软件都在操作系统内部,但是仍然有一小部分在用户空间,包括与用户程序连接在一起的库,甚至完全运行于内核之外的程序。系统调用(包括I/O系统调用)通常由库过程实现。
并非所有的用户层I/O软件都是由库过程组成的。另一个重要的类别是假脱机系统。假脱机(spooling)是多道程序设计系统中处理独占I/O设备的一种方法。考虑一种典型的假脱机设备:打印机。
另一种方法是创建一个特殊进程,称为守护进程(daemon),以及一个特殊目录,称为假脱机目录(spooling directory)。
4 盘
4.1 盘的硬件
盘具有多种多样的类型。最为常用的是磁盘(硬盘和软盘),它们具有读写速度同样快的特点,这使得它们成为理想的辅助存储器(用于分页、文件系统等)。
1.磁盘
磁盘被组织成柱面,每一个柱面包含若干磁道,磁道数与垂直堆叠的磁头个数相同。磁道又被分成若干扇区,软盘上大约每条磁道有8~32个扇区,硬盘上每条磁道上扇区的数目可以多达几百个。
2.RAID
RAID背后的基本思想是将一个装满了磁盘的盒子安装到计算机(通常是一个大型服务器)上,用RAID控制器替换磁盘控制器卡,将数据复制到整个RAID上,然后继续常规的操作。
所有的RAID都具有同样的特性,那就是将数据分布在全部驱动器上,这样就可以并行操作。
3.CD-ROM
光盘比传统的磁盘具有更高的记录密度。
4.2 磁盘格式化
在磁盘能够使用之前,每个盘片必须经受由软件完成的低级格式化(low-level format),一个扇区的格式如图:
4.3 磁盘臂调度算法
考虑读或者写一个磁盘块需要多长时间。这个时间由以下三个因素决定:
1)寻道时间(将磁盘臂移动到适当的柱面上所需的时间)。
2)旋转延迟(等待适当扇区旋转到磁头下所需的时间)。
3)实际数据传输时间。
调度算法
1)先到先服务(FCFS)
2)最短寻道优先(SSF)
3)电梯算法(elevator algorithm)
4.4 错误处理
对于坏块存在两种一般的处理方法:在控制器中对它们进行处理或者在操作系统中对它们进行处理。
4.5 稳定存储器
磁盘有时会出现错误。好扇区可能突然变成坏扇区,整个驱动器也可能出乎意料地死掉。RAID可以对几个扇区出错或者整个驱动器崩溃提供保护。然而,RAID首先不能对将坏数据写下的写错误提供保护,并且也不能对写操作期间的崩溃提供保护,这样就会破坏原始数据而不能以更新的数据替换它们。
当一个写命令发给它时,磁盘要么正确地写数据,要么什么也不做,让现有的数据完整无缺地留下。这样的系统称为稳定存储器(stable storage),并且是在软件中实现的(Lampson和Sturgis,1979)。目标是不惜一切代价保持磁盘的一致性。
稳定存储器使用一对完全相同的磁盘,对应的块一同工作以形成一个无差错的块。当不存在错误时,在两个驱动器上对应的块是相同的,读取任意一个都可以得到相同的结果。为了达到这一目的,定义了下述三种操作:
1)稳定写:稳定写首先将块写到驱动器1上,然后将其读回以校验写的是正确的。
2)稳定读(stable read)。稳定读首先从驱动器l上读取块。如果这一操作产生错误的ECC,则再次尝试读操作,一直到n次。如果所有这些操作都给出错误的ECC,则从驱动器2上读取对应的数据块。
3)崩溃恢复:崩溃之后,恢复程序扫描两个磁盘,比较对应的块。如果一对块都是好的并且是相同的,就什么都不做。如果其中一个具有ECC错误,那么坏块就用对应的好块来覆盖。
5 时钟
6 用户界面:键盘、鼠标和监视器
每台通用计算机都配有一个键盘和一个监视器(并且通常还有一只鼠标),使人们可以与之交互。
6.1 输入软件
每当一个键被按下的时候都会产生一个中断,并且每当一个键被释放的时候还会产生第二个中断。在发生每个这样的键盘中断时,键盘驱动程序都要从与键盘相关联的I/O端口提取信息,以了解发生了什么事情。
7 瘦客户机
大多数用户想要高性能的交互式计算,但是实在不想管理一台计算机。
此处的基本思想是从客户机剥离一切智能和软件,只是将其用作一台显示器,使所有计算(包括建立待显示的位图)都在服务器端完成。客户机和服务器之间的协议只是通知显示器如何更新视频RAM,再无其他。两端之间的协议中使用了五条命令,