两个月学完《现代操作系统》(八)——I/O

两个月学完《现代操作系统》(八)——I/O

摘要:个人操作系统学习笔记

0x01 写在前面

前几天劳动假期颓废的很,操作系统的学习有所停滞,今天看完了I/O部分,把笔记都整理下。不多磨叽,直接莽。

0x02 引子

操作系统除了提供前三章所说的抽象,还会控制计算机的所有I/O。它向设备发送命令、捕捉中断、处理各种错误,并在设备和系统的其他部分提供接口,接口应该是具备设备无关性的。本章围绕着I/O硬件、I/O软件和磁盘、时钟、键盘和显示器这几种I/O设备展开。

0x03 I/O硬件原理

I/O设备

两类I/O设备:
块设备(block device):
存储信息在固定大小的块中,一块一地址,传输以块为单位
块大小在512字节到65536字节间
每个块独立于其他块而读写
硬盘、蓝光光盘、USB盘
字符设备(character device):
以字符为单位发送或接受字符流
不可寻址、无寻道操作
打印机、网络接口、鼠标、老鼠
该分类方法并不完美,有些设备没包括进去。比如时钟就既不是块可寻址也不产生或接受字符流。

设备控制器

I/O设备由机械部件电子部件两部分构成
电子部件被称为设备控制器(device controller)或者适配器(adapter)
控制器卡上有连接器,电缆插到这
一个控制器一般可以操作2、4、8个设备
设备与控制器间为低层次接口,传输的是比特流
磁盘是例子之一:前导符(preamble)+一个扇区+错误校正码(Error-Correcting Code)
控制器将串行的位流转化为字节块并进行错误矫正

内存映射I/O

控制器与CPU通信间有一个控制寄存器的存在
写入寄存器:控制设备发送数据、接收数据、开启或者关闭
读取寄存器:操作系统可以了解设备的状态
设备中存在数据缓冲区
控制寄存器被分配一个I/O端口号,构成I/O端口空间,普通用户不得进行访问
注意内存地址空间和I/O地址空间工作方式的不同
有三种I/O端口管理方案:

可以映射I/O端口到内存中,内存映射I/O(memory-mapped I/O)
内存映射优点:
1、方便C编写I/O设备驱动程序,因为C或C++中不存在操作IN或者OUT指令的方法;
2、不需要特殊的保护机制来组织用户执行I/O操作;
3、指令不需要单独再进行编写,可以引用内存的指令也可以引用控制寄存器;
缺点:
1、高速缓存问题

第一次引用失败,下一次还从高速缓存取值,从而总是失败。为此,硬件必须针对每个页面有选择性地禁用高速缓存,操作系统必须管理选择性高速缓存。
2、双总线内存提携结构问题

解决办法:一、先将内存引用发送到内存,相应失败再发送到总线,麻烦;二、在内存总线上放置探测设备,放过所有潜在地指向所关注的I/O设备的地址,I/O设备可能没那么快处理;三、在内存控制器中进行过滤。

直接存储器存取(Direct Memory Access, DMA)

DMA控制器独立于CPU,可以访问系统总线。其包含一个内存地址寄存器、一个字节记数寄存器、
一个或多个控制寄存器。控制寄存器指定要使用的I/O端口、传送方向(从I/O设备读或写到I/O设备)、传送单位以及再一次突发传送中要传送的字节数

周期窃取(cycle stealing):DMA控制器请求传送一个字并且得到这个字,偶尔偷偷流入并且从CPU偷走一个临时的总线周期;
突发模式(burst mode):DMA控制器通知设备获取总线,发起一连串传送,然后释放总线,效率高,但是如果是长突发,会让CPU和其他设备阻塞相当长时间;
飞跃模式(fly-by mode):DMA控制器通知设备控制器直接将数据传送到主存。
DMA控制器使用物理内存地址进行传送。
内部缓存存在的原因:
1、通过内部缓冲,在传送前检验校验和;
2、避免控制器因为没准备好接受数据而使得数据传输不完全。

重温中断

中断的结构如下:

中断信号导致CPU停下当前正在做的工作并且开始做其他的事情。中断向量(interrupt vector)是一个表格,它是一个索引,跟中断后获得一个新的程序计数器相关。
中断控制器,相当于一个中介
精确中断:将机器留在一个明确状态的中断
1、PC(程序计数器)保存在一个已知的地方
2、PC所指向的指令之前的所有指令已经完全执行
3、PC所指向的指令之后的所有指令都没有执行
4、PC所指向的指令的执行状态是已知的
非精准中断:不符合上述条件

不精准中断多由于超量标、流水线导致。
体会中断后硬件的一些信息的存储问题

0x04 I/O软件原理

I/O软件的目标

设备独立性(device independence):编写出一种程序,它可以访问任意I/O设备而无需事先指定设备。白话:对各种I/O设备都适用;
统一命名(uniform naming):文件或设备名应该是简单的字符串。路径名寻址,例如UNIX下/usr/ast/backup可以为一个mount上去的USB盘;
错误处理(error handling):当底层硬件处理不了错误时,就应该交由设备驱动程序处理了
同步(synchronous)异步(asynchronous)传输
缓冲(buffering)
网络包的传输、数字音频设备等具有严格的实时约束的设备需要考虑。

程序控制I/O

让CPU做全部的工作
例子,打印一串字符串:


优点:简单
缺点:存在轮询以及忙等待的过程,直到全部I/O完成之前要占用CPU的全部时间

中断驱动I/O


在等待打印的过程中利用阻塞请求打印的进程直到打印完成,打印完成后,产生中断,中断当前进程,恢复请求打印
缺点:中断操作发生在每个字符上,也需要耗费一定量的CPU时间

使用DMA的I/O


本质上是程序控制I/O但是他让CPU独立出来了。中断次数减少到了每块缓冲区一次而不是每个字符一次
缺点:需要一个特殊的硬件;比CPU慢得多,不能以全速驱动地话效率低

0x05 I/O软件层次

四个层次,每层有对应的功能以及更另外一层的接口,如下:

中断处理程序

处理的过程:

设备驱动程序

不同的I/O设备工作机理不同,需要不同的程序也就是设备驱动程序(Device driver)来控制。
也有些设备的驱动是通用的,比方说USB。USB驱动程序通常是堆栈式的
设备驱动程序通常必须是操作系统内核的一部分,也可以放在用户空间中,使用系统调用来读写设备,大概的逻辑定位如下:

为了方便管理,驱动程序分类:
块设备(block device)、字符设备(character device)操作系统为其定义了相应的接口。
原本的方案:UNIX的驱动需要计算机管理员自己编译到内核中;
现在的方案:MS-DOS开始,动态装载。
驱动程序应该是重入的(reentrant),即在第一次调用还没有完成前第二次被调用。
驱动程序不允许进行系统调用,但是对某些内核过程的调用是允许的,如需要调用内核管程来分配和释放硬接线的内存页面作为缓冲区等。

与设备无关的I/O软件

设备无关的I/O软件实现一些公共的I/O功能

1、设备驱动程序的统一接口

统一的接口能够更为方便。
实现:存在一张表,表中对应有OS定义的一组驱动程序必须支持的函数。
I/O设备命名:设备映射到对应的驱动上,如在linux系统中,/dev/disk0是一个设备名,唯一确定了一个特殊文件的inode。
设备保护:设置权限,禁止任意访问
2、缓冲
四种情况如下:

双缓冲区,如上图。
循环缓冲区,有两个指针的配合的缓冲区,一个标示下一个写入的位置一个标示下一个释放的位置
3、错误报告
4、分配和释放专用设备
5、与设备无关的块的大小
不同的磁盘拥有不同的扇区大小,由设备无关软件向上层隐藏这一事实。

用户空间的I/O软件与小结

虽然大部分I/O在操作系统内部,但是仍有一部分在用户空间中,包括与用户程序连接在一起的库。
假脱机(spooling)系统也是一种用户层I/O软件;假脱机(外部设备联机并行操作,SPOOL,Simultaneous Peripheral Operations On-line)是一种数据缓冲,指传输数据的过程中,将数据存放在临时工作区中。其它程序可以在之后的任意时间点对其存取。通常英语动词spool可以指储存设备的行为,具体表现为物理意义上的缠或卷,就比如说磁带机。最常见的假脱机的应用是打印缓存,即把打印任务加入到队列。
守护进程(daemon)+假脱机目录(spooling directory)

0x05 盘

盘硬件

1、磁盘
柱面-》磁道-》扇区
磁盘在磁道上的实际几何规格和OS看到的虚拟几何规格不一致
逻辑块寻址(Logical block addressing),扇区从0开始编号,不管磁盘的几何规格如何

2、RAID
RAID全称为Redundant Array of Inexpensive Disk 廉价磁盘冗余阵列
思想:将一个装满了磁盘的盒子安装到计算机上,用RAID控制器替换磁盘控制卡
可以并行操作
0级到6级RAID:
0级:

数据分布到多个驱动器上称之为划分条带(striping),0级RAID就是这么做的
但对每次请求一个扇区的OS工作性能糟糕;可靠性稍差
1级:

存在备份。同时写入两份数据,写性能稍差但读性能强。容错性高
2级:

前两者操作的是条带,2级工作在字的基础上。操作略微复杂,分割字、字节数据,加入汉明码和校验位。
要求驱动器的旋转必须是同步的,需要充裕的驱动型才行
3级:

2级的简化版,加入了一个奇偶校验位
4级:

使用条带,将条带对条带的奇偶校验写到一个额外的磁盘上。比方说全部一起异或,错了一个就可以通过其他的算出来。
对微小更新性能很差
5级:

通过循环地方式在磁盘上均匀分布奇偶校验位,减少压力
6级:

使用了额外的奇偶块,写的代价更高但是更可靠。

磁盘格式化

磁盘在可以使用前需要完成低级格式化(low-level format),格式如下:

前导码:一定的位模式开始包含柱面、扇区号。
数据:有低级格式化程序决定,大多数磁盘以512字节的大小为一个扇区
ECC:包含冗余信息,可以空来恢复读写错误
柱面斜进(cylinder skew):指每个磁道与前一个磁道的第一个扇区存在偏移。为了加快寻址速度,示意图如下:

格式化后实际存储量和显示存储量的区别:
后者会小一点,因为格式化前导符 ECC等原因
单交错(single interleaving)、双交错(double interleaving):解决缓冲区复制数据到主存需要一定时间的问题

控制器可以对整个磁道缓存避免交错
GPT(GUID Partition Table,GUID分区表)最大9.4ZB
高级格式化(high-level format)
设置引导块、空闲存储管理、位图、根目录、空文件系统

磁盘臂调度算法

读写时间影响三因素:
1、寻道时间(主导);
2、旋转延迟;
3、实际数据传输时间。
先来先服务算法(FCFS)难以优化
最短寻到优先磁盘调度算法(SSF)可能会使得对两端的柱面请求体验很差

电梯算法(elevator algorithm)

需要一个二进制位 表示上up或者下down
现代磁盘可能会一次性读出一个扇区和当前磁道多个或者剩余所有的扇区被读出 磁盘控制器的高速缓存完全独立于操作系统的高速缓存

错误处理

制造过程中可能存在几位的坏块

控制器中处理:
出厂前检测,制作成列表,用备用块替换
重映射替换或者所有区块移动替换
操作系统中处理:
软件层面进行重映射
控制器其实是一个专用的小计算机

稳定存储器

软件中实现,为了不惜一切代价保持磁盘的一致性
使用一对完全相同的磁盘实现,定义三种操作:
1、稳定写(stable write)
写完后传回校验
2、稳定读(stable read)
多次读一块数据,总是错误换备用的读
3、崩溃恢复(crash recovery)
比对对应的块,每天都要扫描保证两块磁盘相同

0x06 时钟

时钟(clock)又被称为定时器(timer)

时钟硬件

普通电源电压时钟,一个电压周期一个中断(全部工作也不过如此,即根据已知的时间间隔产生中断)
晶振时钟,由晶体振荡器、计数器和存储寄存器构成
可编程时钟操作模式:
1、一次完成模式(one-shot mode)
当时钟启动时,它把存储寄存器的值复制到计数器中,然后,来自晶体的每一个脉冲使计数器减1。当计数器变为0时产生一个中断并停止工作,知道软件再一次显式地启动它。
2、方波模式(square-wave mode)
当计数器变为0并且产生中断之后,存储寄存器的值自动复制到计数器中,并且整个过程无限期地再次重复下去
周期性的中断被称为时钟滴答(clock tick)
优点:中断的频率可以由软件自身决定

时钟软件

时钟驱动程序,功能:
1、维护日时间
日时间就是实际时间(real time)

2、防止进程超时运行
进程开启,调度程序将计数器初始化为以时钟滴答为单位的某个取值
3、对CPU使用情况记账
精确的记账,开另一个辅助定时器
不太精确的记账,全局变量维护一个指针,指向进程表项的一个域
4、处理用户进程提出的alarm系统调用
5、为系统本身的各个部分提供监视定时器
6、完成概要剖析、监视和统计信息收集

软定时器

为了解决程序高频率触发中断的问题

0x07 用户界面:键盘、鼠标和监视器

输入软件

1、键盘软件
I/O端口号中的数字是键的编号,叫做扫描码(scan code),只需要七位就可以表示所有键的编号。硬件只需要给出键被按下和释放的中断,其他的工作由软件完成
两种处理方法:
a.接受输入并且不加修改的向上传入,像下面这样:

b.面向行的处理方式。原始模式、加工模式。有缓存区。
特殊字符

2、鼠标软件
滚轮式
光学鼠标

输出软件

1、文本窗口
驱动程序移动光标的命令被称为转义序列(escape sequence)
termcap终端数据库,对用户的操作起到“翻译”“转换”的作用
转义序列的标准化:ANSI标准,有一张标准表如下:

2、X窗口系统
几乎所有的UNIX系统的用户界面都以X窗口系统(X Window System)为基础 流行的Gnome和KDE桌面环境就运行在X之上 拥有一个C-S模型

X服务器(X server)从键盘或鼠标采集输入并将输出写道屏幕上的软件
跟踪当前选择了哪个窗口
X客户(X client)X服务器将键盘和鼠标输入发给X服务器
X服务器总是位于计算机内部,X客户可能在远端的服务器上
X只是一个窗口系统,并不是一个完整的GUI,上层有一层Xlib,为一组库过程,用于访问X的功能;还有一个方便对X编程的工具包,名为Intrinsics(本征函数集),管理按钮、滚动条以及其他被称为窗口小组件(widget)的GUI元素;Motif等软件使得真正的GUI得以产生,拥有一致的外观和感觉。
窗口管理器(Window Manager)控制着屏幕上窗口的创建、删除以及移动。
资源(resource)是X中的一个关键概念,它是保存着一定信息的数据结构,资源可以在多个进程间共享。窗口、字体、颜色映射、像素映射、光标及图形上下文都是资源。
Windows系统下,窗口与GUI系统在GDI中混合在一起并且处于内核中。
3、GUI
WIMP四要素。窗口(Window)、图标(Icon)、菜单(Menu)、定点设备(Pointing Device)
GUI可以在用户级代码中实现、也可以在操作系统中实现(Windows那般的情况)
GUI输入使用硬盘鼠标;输出到特殊的硬件电路板,图形适配器(graphics adapter),其中包含特殊的内存,成为视频RAM(video RAM),保存出现在屏幕上的图像
窗口的大小与位置,通过给定的两个斜对角坐标唯一的决定。可以包含一个标题栏、菜单栏、工具栏和垂直滚动条和水平滚动条。
Windows程序时面向消息的,X是面向事件的
匈牙利表示法(Hungarian notation,匈牙利程序员发明的,挺难看懂的,,
Windows让程序做事情的方法:一、投递一条信息到其消息队列;发送一条消息到窗口
GDI(Graphics Device Interface,图形设备接口),对屏幕实际绘图的包含几百个过程的程序包。绘图前需要得到设备上下文(device context),其是一个数据结果,包含窗口属性。
4、位图
计算机处理图像可以通过GDI过程(矢量图形学),其调用可以聚集在一个被称为Windows元文件(metafile)的文件中。
另一种方法,位图(bitmap)。通过覆盖在图片及视频上的一个个网格为单位对颜色进行扫描,得到像素值,并保存在位图文件中。位图不可缩放。
设备无关位图(DIB,Device Independent Bitmap)
5、字体
位图表示的字符运用起来非常不方便。解决方式:TrueType字体,它是字符的轮廓,每个TrueType字符通过围绕其周界的一系列点来定义的,所有点都是相对于(0,0)原点。
栅格化,即以任何期望的分辨率将其转换成位图。
6、触摸屏
电阻屏(resistive screen)
电容屏(capactive screen)
电阻屏不适用于多点触控(multitouch)

瘦客户机

个人计算机与中心化的计算机各有好处与缺点。
瘦客户机(thin client)是使用专业嵌入式处理器、小型本地DOM电子盘、精简版操作系统的基于PC工业标准设计的小型行业专用商用PC。
例子:Chromebook。

0x08 电源管理

硬件问题

两种电池类型:一次性使用的和可再充电的
设备的关闭、休眠、睡眠、运行的一系列系列问题

能量消耗排前的是显示器、CPU、硬盘

操作系统问题

1、显示器
定时关闭功能
区块独立自主开启关闭,如下:

2、硬盘
方法一:特征时间点,良好的基于过去存取模式的预测进行关闭与开启
方法二:在RAM中拥有一个大容量的磁盘高速缓存
方法三:操作系统通过与程序的协调,决定写入数据的时机
3、CPU
CPU电压可以使用软件降低电压来降低能耗,例子如下:

放慢CPU核不总是意味着性能的下降,比方说精心地放慢(处理)网络(的CPU)核
4、内存
两种节省能量的可能:
一、刷新而后关闭高速缓存
二、将主存的内容写到磁盘上,然后关闭主存本身
5、无线通信
缓冲区的应用
6、热量管理
风扇问题,操作系统可以根据用户输入降低功率消耗
7、电池管理
智能电池可以与操作系统通信,操作系统得到最大电压、当前电压、最大负荷、当前负荷、最大消耗速率、当前消耗速率等
8、驱动程序接口
ACPI(Advanced Configuration and Power Interface,高级配置与电源接口)。操作系统可以要求驱动程序对应的设备提供设备性能及当前的状态,ACPI可以发送命令给驱动程序,命令他们削减功耗水平。

应用程序问题

退化性能。
视频播放器:舍弃色彩;降低帧速率;减少像素量;降低空间分辨率;让显示的图像更小
语音识别器:减少波形分析的词汇量或使用更为简单的声学模型
地图观察器:修剪低处尺寸;省略小道路
传送JPEG图像:质量退化

0x09 总结

该章学习了以下内容:I/O硬件(块设备、字符设备、I/O的三种实现方式)、I/O软件(I/O的四个层次)、硬盘、时钟、GUI、电源管理。


评论