除了提供抽象之外(进程、地址空间和文件),操作系统还要控制计算机的所有I/O(输入和输出)设备。
5.1 I/O硬件原理
对于电子工程师来言,I/O硬件就是芯片、导线、电源、电机和其他组成硬件的物理部件。对于程序员来言,则只注意I/O硬件提供给软件的接口。
5.1.1 I/O设备
I/O设备大致可分为两类:块设备和字符设备。
- 块设备:块设备把信息存储在固定大小的块中,每个块有自己的地址。,每个块都独立于其他块读写。块可寻址设备与其他设备之间并没有严格的界限。
- 字符设备:字符设备以字符为单位发送或接受一个字符流,而不考虑任何块结构,是不可寻址的,也没有任何寻道操作。
5.1.2 设备控制器
I/O设备一般由机械部件和电子部件两部分组成,电子部件称为设备控制器或适配器,机械部分则是设备本身。 控制器和设备之间的接口一般是很低层次的接口。
控制器的任务是将串行的位流转换为字节块,并进行必要的错误矫正工作。
5.1.3 内存映射I/O
每个控制器有几个寄存器用来与CPU进行通信。通过写入这些寄存器,操作系统可以命令设备发送数据、接受数据、开启或关闭,或者执行某些其他操作。
那么CPU如何与设备控制寄存器和数据缓冲区进行通信:
- 每个控制寄存器被分配一个I/O端口号,形成I/O端口空间,只有操作系统可以访问。
- 将所有的寄存器映射到内存空间(内存映射I/O) 。每个控制寄存器都被分配唯一一个内存地址,并且不会有内存被分配到这一地址。
- 混合实现方案
工作原理:CPU将需要的地址放到总线地址线-》在总线的一条控制线上设置一个read信号-》第二条信号线表明是IO空间还是内存空间,如果只是内存空间,看该地址落在的地址范围确定是IO还是内存模块。
内存映射I/O 优点:
- 对于内存映射I/O, I/O设备驱动程序可以完全用C语言编写,避免了汇编的使用 。
- 对于内存映射I/O,不需要特殊的保护机制来阻止用户进程执行I/O操作。
- 对于内存映射I/O,可以引用内存的每一条指令也可以引用控制寄存器。
内存映射I/O 缺点:
- 对于内存映射I/O,硬件必须针对每个页面禁用高速缓存。
- 对于内存映射I/O,I/O设备没有办法查看内存地址,因为内存地址旁路到内存总线上,所以没有办法响应。
5.1.4 直接存储器存取
CPU需要寻址设备控制器以便于他们进行交换数据。CPU可以从I/O控制器每次请求一个字节的数据,但是这样做浪费了CPU 时间,所以经常使用到的是一种称为直接存储器存取(DMA)的方案。
在使用正常磁盘读取时控制器从磁盘驱动器串行地一位一位读取一个块,知道整块信息放入控制器的内部缓冲区。紧接着,校验,然后产生中断。当操作系统开始允许时,它重复地从控制器的缓冲区中一次一个字节或一个字得区域该块信息,并存入内存。
DMA的工作原理:
- CPU通过设置DMA控制器的寄存器对它进行编程,所以DMA控制器知道将生命数据传送到什么地方。DMA控制器还要向磁盘控制器发出一个命令,通知它从磁盘读取数据到内部缓冲区中,并且对校验和进行校验。如果磁盘控制器的缓冲区的数据是有效的,那么DMA就可以开始了
- DMA控制器通过总线上发出一个读请求到磁盘控制器而发出DMA传送。
- 磁盘控制器将数据传送到内存中。
- 当写操作完成时,磁盘控制器在总线上发出一个应答到DMA控制器上。
DMA控制器的数据发送三种模式:
- 每次一字模式:DMA每次请求传送一字,若CPu也想用总线,则必须等待。这一机制称为周期窃取,因为设备控制器偶尔从CPU偷走一个临时的总线周期,从而轻微延迟CPU。
- DMA每次一块模式:在块模式中,DMA控制器通知设备获得总线,发起一连串的传送,然后释放总线。这一操作模式称为突发模式,这种方法比周期窃取效率更高。而缺点在于,如果正在进行长时间突发操作,有可能将CPU和其他设备阻塞相当长的时间。
- 飞越模式:DMA通知设备寄存器直接将数据传送到主存,某些DMA则是让设备先将数据传送到DMA控制器,然后DMA发起第二个总线周期,缺点是效率低,优点是灵活。
控制器从磁盘读取数据后为什么不立即将其存储在主存中?
- 通过进行内部缓存,磁盘控制器可以在开始传送数据之前进行校验和。
- 一旦磁盘传送开始工作,从磁盘读取数据都是以固定速率到达的,而不论控制器是否准备好接受数据。
5.1.5 重温中断
中断的工作原理如下:当一个IO设备完成交给它的工作时,就会产生一个中断(假设操作系统以及放开中断),它是通过分配给它第一条总线信号线上置其的信号而产生中断的。该信号被主板上的中断控制器芯片监测到,由中断控制器芯片决定做什么。
中断信号导致CPU停止当前正在做的工作并且开始做其它的事情。地址线上的数字被用作指向一个称为中断向量的表格的索引,以便读取一个新的程序计数器。
在开始服务程序之前,硬件总是要保存一定的信息。作为最低限度,必须保存程序计数器,而另一个极端,所有可见的寄存器和许多内部寄存器都要保存。
5.2 I/O 软件原理
在设计IO软件时一个关键的概念是设备独立性。其意思是可以访问任意IO设备而无须实现指明设备。
与设备独立性密切相关的是统一命名——一个文件或设备的名字应该是一个简单的字符串或一个证书,不应该原来设备。
IO软件另外的一个重要问题是错误处理。一般来货,错误应该尽可能地在接近硬件的层面得到处理。在许多情况下,错误恢复可以在可以在低层透明地的得到接近,而高层软件甚至不知道存在这一错误。
另一个关键问题是同步(即阻塞)和异步(中断驱动)传输。大多数物理IO是异步的——CPU启动传输时就去做其它工作,直到中断发生。如果IO操作是阻塞的,那么程序更容易编写。只是操作系统使实际上是终端驱动的操作变成来用户看开是阻塞式的操作。
IO软件另一个问题是缓冲。数据离开一个设备之后通常并不能直接存放其最终的目的地,因此需要缓冲。缓冲涉及大量的复制工作,并且经常对IO性能有重大影响。
在I/O操作中科研采用三种根本上不同的方式实现。分别是程序控制I/O、中断驱动I/O、使用DMA的I/O。
5.2.2 程序控制I/O
该方法首先在用户空间的一个缓冲区组装字符串。然后操作系统(通常)将字符串缓冲区复制到内核空间中国年的一个数组中,在这里访问更加容易(内核可能要通过修改内存映射才能到达用户空间)。一旦打印机可用,操作系统就复制第一个自负到打印机的数据寄存器中。一旦将第一个字符复制到打印机,操作系统就要查看打印机是否就绪准备接收另一个字符。打印机一般有第二个寄存器用户表明状态。将字符写到数据寄存器的操作导致状态变为非就绪。当打印机完成当前字符时,则通过在状态寄存器中设置某一位或将某个值放在其中来表示可用。
在输出一个字符之后,CPu要不断地查询设备以了解它是否就绪准备接收另一个字符。这哦一行为通常称为轮询或忙等待。
5.2.3 中断驱动I/O
这种允许CPU在等待打印机变为就绪的同时做某些其他事情的方式就是使用中断。
CPU要调用调度程序,并且某个其他进程将允许,请求打印字符串的进程将被阻塞,直到整个字符串打印完。
当打印机将字符打印完并且准备好接收下一个字符时,它将长恨恶搞一个中断。这一中断将停止当前进程并且保存其状态。
5.2.4 使用DMA的I/O
此处的思路是让DMA控制器一次给打印机提供一个字符,而不打扰CPU。本质上,DMA是程序控制IO,只是由DMA控制器而不是主CPU做全部工作。这一策略需要特殊的硬件(DMA控制器),但是CPU获得自由从而可以在I/O期间做更多的工作。
5.3 I/O 软件层次
IO软件通常组织成四个层次,每一层具有一个要执行的定义明确的功能和一个定义明确的与邻近层次的接口。
5.3.1 中断处理程序
应当将中断隐藏在操作系统内部:将启动一个IO操作的驱动程序阻塞起来,直到IO操作完成并产生一个中断。
当中断发生时,中断程序将做它必须要做的全部工作以便对中断进行处理,然后,他可以启动中断的驱动程序以解除阻塞。中断的最终结果是使先前被阻塞的程序能够继续运行。
5.3.2 设备驱动程序
每个连接到计算机上的IO设备都需要某些设备特定的代码来对其进行控制,即设备驱动程序。
每个设备驱动程序通常处理一种类型的设备,不过在有时候,极其不同的设备却基于相同的底层技术,如USB。
为了访问设备的硬件,设备驱动程序通常必须是操作系统内核的一部分。
操作系统通常将驱动程序分类:块设备(磁盘)和字符设备(键盘)
大多数操作系统定义了标准接口(块设备或字符设备)
驱动程序的功能:
- 接受上方与设备无关的读写请求,并且目睹执行
- 启动时检查参数
- 检查设备是否在被使用
控制设备意味着向设备发出一系列命令,根据设备必须要做的工作,由驱动程序处确定命令序列。
命令发出后,会牵扯到两种情况:阻塞(可以被中断唤醒)和不阻塞。
驱动程序必须是重入的,即一个正在运行的驱动程序必须预料到在第一次调用完成之前第二次被调用。
5.3.3 与设备无关的I/O软件
设备驱动程序和与设备无关的软件之间的确切界限依赖于具体系统。
与设备无关的软件的基本功能是执行对所有设备公共的IO功能,并且向用户软件一个统一的接口。
1. 设备驱动程序的统一接口
所有设备都有主设备号(定位驱动程序)、次设备号(作为参数传递给驱动程序,确定要读写的具体单元)。
设备保护:设备是作为命名对象出现在文件系统中的,这意味着针对文件的常规保护规则也适用于IO设备。
2. 缓冲
方案一的问题:用户进程运行多次效率较低。
方案二的问题:分页问题
方案三的问题:调页面时新字符的到来问题,使用双缓冲(方案四)解决。
缓冲的另一种形式:循环缓冲区。
3.错误报告
错误在I/O上下文比其他上下文中要常见的多。当错误发生的时候,操作系统必须尽最大的努力对他们进行处理。许多错误都是特定的并且必须由适当的驱动程序来处理,但是错误的处理如设备无关。
- 编程错误。
- 实际的I/O错误
4.分配与释放专有设备
5. 与设备无关的块大小
5.3.4 用户空间的I/O软件
大部分IO软件都在操作系统内部,但是仍有一小部分在用户空间,包括与用户进程连接在一起的库,甚至完全运行于内核之外的程序。
- 系统调用通常由库的形式实现。
- 假脱机系统,是多道程序设计系统中处理独占IO设备的一种方法。
- 特殊进程,称为守护进程,以及一个特殊目录,称为假脱机目录。一个进程要打印一个文件的时候,并且将其放在假脱机目录下。由守护进程打印这个目录下的文件,该进程是允许使用打印机特殊文件的唯一进程。
接下来我们对整个I/O系统进行总结,给出所有层次以及每一个层次的功能。从底部开始,这些层次分别是硬件、中断处理程序、设备驱动程序、与设备无关的软件、最后是用户进程。
当一个用户进程从一个文件中毒一个快的时候,操作系统被调用以实现这一请求。与设备无关的软件在缓冲区中高速缓存中查找有无要读的块。如果需要的块不在其中,则调用设备驱动程序,向硬件发出一个请求,让他从磁盘中获取该块。然后,进程被阻塞直到磁盘操作完成并且数据在调用者的缓冲区中安全可用。
5.4 盘
5.4.1 盘硬件
磁盘具有读写速度同样快的特点,这使得它们适合作为辅助存储器。这些盘的阵列有时用来提供高可靠性的存储器。
1. 磁盘
扇区-》磁道(与垂直堆叠的磁头个数相同)-》柱面-》磁盘
重叠寻道:控制器同时控制多个驱动器进行寻道。
硬盘可以可以在多个驱动器上同时读写,软盘不能
现代磁盘被划分为环带,外层的环带比内层的环带拥有更多的扇区。
为了隐藏每个磁道有多少扇区,大多数现代磁盘都有一个虚拟几何规格呈现给操作系统。
2. RAID
由于CPU和磁盘性能差距越来越大,找寻特殊磁盘组织来改进磁盘性能。并行IO操作来提高CPU性能。
RAID:将一个装满了磁盘(SCSI)的盒子安装到计算机,用RAID控制器替换磁盘控制器卡,而软件看起来就是一个磁盘。,将所有数据分布在全部驱动器上,这样就可以并行操作。
RAID的七种标准配置(0级到6级)
5.4.2 磁盘格式化
在磁盘能够使用之前,每个盘片必须经受由软件完成的低级格式化。
扇区:前导码+数据+ECC(恢复读错误)
柱面斜进:第0扇区位置与前一个磁道存在偏移,便于读取多个磁道的数据。
磁头斜进
低级格式化的结果是磁盘容量减少,所以一般买的磁盘容量不等于可用的磁盘容量。
格式化还对性能产生影响
交错方式编号扇区:单交错双交错 解决连续读,缓冲不够大的问题。
低级格式化完成之后,要对磁盘分区,逻辑上每个分区是一个独立的磁盘
0扇区包含主引导记录(MBR):包含某些引导代码以及处在扇区末尾的分区表(CDEF)
新系统支持GPT(因为磁盘容量在变大)
准备一块磁盘可用的最后一步是 高级格式化
打开电源-》bios读入主引导记录并跳转到主引导记录-》这一引导程序进行检查了解哪个分区是活动的-》引导扇区中的引导程序搜索文件系统以找到操作系统内核-》该程序被装入内存并执行
5.4.3 磁盘臂调度算法
读写磁盘块需要的时间:寻道时间(主导地位)+旋转延迟+实际数据传输时间
先来先服务(FCFS):每个磁盘驱动程序都维护一张表,每一个柱面未完成的请求组成一个链表,链表头存放在相应表目中。
最短寻道优先(SSF):下一次总是处理与磁头距离最近的请求以使寻道时间最小化
缺点:远离中部区域的请求得到的服务很差,有失公平。
电梯算法
某些磁盘控制器提供了一种方法供软件检查磁头下方的当前扇区号。由此有多种优化。
许多磁盘控制器总是读出多个扇区并对其进行高速缓存。完全独立于操作系统的高速缓存
5.4.4 错误处理
坏扇区处理办法:在控制器中对它们进行处理或者在操作系统中
控制器中处理坏块的办法:
5.4.5 稳定存储器
稳定存储器:要么正确写,要么什么也不做,保证数据绝对正确
可能发生的错误:ECC正确概率低、扇区可能自发变坏、CPU可能出故障
稳定存储器使用一对完全相同的磁盘,无差错时,两者完全相同。
稳定写、稳定读、崩溃恢复
稳定写期间CPU崩溃的五种可能性:
优化和改进:在稳定写期间跟踪(非易失性RAM)被写的是哪个块,这样在恢复的时候必须被检验的块只有一个
每天都要扫描两个磁盘,防止两者同时变坏。
5.5 时钟
时钟又称为定时器,负责维护时间,防止一个进程垄断CPU。
5.5.1 时钟硬件
有两种类型:比较简单的、可编程时钟
可编程时钟的几种操作模式: 一次完成模式、方波模式(产生时钟滴答)
优点:中断频率可以由软件控制
为了防止计算机的电源被切断时丢失时间,有备份时钟或者开机网络同步。
5.5.2 时钟软件
除了中断由时间硬件完成,其他功能实现都由时钟软件实现
- 维护日时间
- 防止进程超时运行
- 对CPU的使用情况记账
- 处理用户进程提出的alarm系统调用
5. 为系统本身的各个部分提供监视定时器
6. 完成概要剖析、监视和统计信息收集
5.5.3 软件定时器
管理IO的两种方法:中断和轮询
软定时器避免了中断,该定时器是主系统定时器以外的。
软定时器随着其他原因进入内核的频率而脉动
5.6 用户界面:键盘、鼠标和监视器
5.6.1 输入软件
1. 键盘软件
IO端口中的每个数字是键的编号,称为编号码,一共128个键,所以只需7个位
原始模式(面向字符) 加工模式(面向行)
回显(刚刚键入的字符出现在屏幕上)
回车:回到第一列 换行:到下一行 Enter键是回车换行
2. 鼠标软件
鼠标步:计算机有反应的最小移动距离,大约是0.1mm
发到计算机的三个项目:Δx、Δy、按钮
5.6.2 输出软件
1.文本窗口
移动光标的方法:1.转义序列 2. termcap
标准化转义序列:ANSI标准
2.X窗口系统
X服务器(在本机内部):采集输入并输出在屏幕上的软件,与X客户(可能在远方服务器上)进行通信.
从程序到工作站的命令不面向连接,当需要来自工作站的信息时,是面向连接的
X是高度事件驱动的
X中一个关键概念是资源
3.图形用户界面(GUI)
输入使用键盘鼠标,输出使用图形适配器,包含有视频RAM
屏幕上的基本项目:窗口
Windows是面向消息的,而linux是面向事件的
GDI:屏幕的实际绘图,绘制之前,要先获取一个设备上下文。
4. 位图
复制图的方法:windows元文件、位图(每一个网格方块的平均红、绿、蓝取值被采样并且保存为一个像素的值)
DIB:便于在不同设备之间移动位图
5.字体
TrueType字体:不是位图而是轮廓,通过围绕其周界的一系列点来定义
首先缩放然后栅栏化。
###6.触摸屏
电阻屏(不支持多点触控)、电容屏
5.7 瘦客户机
主流计算范式一直在中心化计算和分散化计算之间震荡。
大部分用户想要高性能的交互式计算,但是实在不想管理一台计算机,于是分时系统使用的瘦客户机出现了(Chromebook)
5.8 电源管理
减少能量消耗的一般方法:1.某些部件(IO)不用时操作系统关闭他们 2.应用程序使用较少的能量
5.8.1 硬件问题
电池:1.一次性 2.可再充电的
耗能:工作>睡眠>休眠>关机
5.8.2 操作系统问题
找到算法和启发式方法,让操作系统对关于关闭什么设备以及何时关闭做出良好的决策。
1.显示器
定期关闭屏幕
2.硬盘
一个停止的磁盘是休眠而不是睡眠,重启会消耗相当多的时间与能量,设定一个特征时间来决定是否停转。
或者在RAM中拥有一个大容量磁盘高速缓存。
或者操作系统通过发送信息或信号保持磁盘的状态通知给正在运行的程序。
3.CPU
CPU电压、时钟周期、电能损耗之间存在关系
慢速运行比快速运行具有更高的能量效率
放慢CPU核不总是意味着性能的下降
4.内存
节能方法:1.刷新然后关闭高速缓存(睡眠状态) 2.将主存的内容写到磁盘上,然后关闭主存本身(休眠)
5.无线通信
由用户或者周期性关闭无线电设备
6.热量管理
风扇问题、周期性接入点问题、
7.电池管理
智能电池
8.驱动程序接口
ACPI(高级配置与电源接口):操作系统让设备报告当前状态、命令驱动程序削减能耗或正常运转
5.8.3 应用程序问题
指示程序使用较少的能量