5.4缓冲技术为了改善中央处理器与外围设备之间速度不配的矛盾,以及协调逻辑记录大小与物理记录大小不一致的问题,提高 CPU
和 I/O设备的并行性,在操作系统中普遍采用了缓冲技术 。
缓冲技术实现基本思想如下:
当一个进程执行写操作输出数据时,先向系统申请一个主存区域 ──缓冲区,然后,将数据高速送到缓冲区 。 若为顺序写请求,则不断把数据填到缓冲区,直到它被装满为止 。 此后,
进程可以继续它的计算,同时,系统将缓冲区内容写到 I/O设备上 。 当一个进程执行操作输入数据时,先向系统申请一个主存区域 ──缓冲区,系统将一个物理记录的内容读到缓冲区域中,然后根据进程要求,把当前需要的逻辑记录从缓冲区中选出并传送给进程 。
常用的缓冲技术有:单缓冲、
双缓冲、多缓冲。
5.4.1 单缓冲对于块设备,单缓冲机制如下工作对于字符设备,单缓冲机制如下工作
5.4.2 双缓冲输入数据时,首先填满缓冲区 1,操作系统可从缓冲区 1把数据送到用户进程区,用户进程便可对数据进行加工计算 ;与此同时,
输入设备填充缓冲区 2。当缓冲区 1空出后,输入设备再次向缓冲区 1输入。操作系统又可以把缓冲区 2的数据传送到用户进程区,用户进程开始加工缓冲 2的数据。
对于块设备,处理或传输一块的时间为
max(C,T),如果 C<T,可以保证块设备连续工作 ;如果 C>T,使得进程不必要等待 I/O。 双缓冲使 `效率提高了,但复杂性也增加了 。
5.4.3 多缓冲操作系统从自由主存区域中分配一组缓冲区组成循环缓冲,每个缓冲区的大小可以等于物理记录的大小。多缓冲的缓冲区是系统的公共资源,可供各个进程共享,并由系统统一分配和管理。缓冲区可用途分为:输入缓冲区,处理缓冲区和输出缓冲区。
Unix I/O字符缓存队列
5.5 驱动调度技术作为操作系统的辅助存储器,用来存放文件的磁盘一类高速大容量旋转型存储设备,在繁重的输入输出负载之下,同时会有若干个输入输出请求来到并等待处理 。 系统必须采用一种调度策略,使能按最佳次序执行要求访问的诸请求,这就叫驱动调度,使用的算法叫驱动调度算法 。
驱动调度能减少为若干个输入输出请求服务所需的总时间,从而提高系统效率,除了输入输出请求的优化排序外,信息在辅助存储器上的排列方式,存储空间的分配方法都能影响存取访问速度 。
5.5.1 存储设备的物理结构顺序存取存储设备是严格依赖信息的物理位置进行定位和读写的存储设备具有存储容量大、稳定可靠、卷可装卸和便于保存等优点
■
始点块
1
间隙块
2
间隙块
3
间隙块
i
间隙块
i+1
■
末点… …
… …
磁头 (正走,反走,正读,反读,正写,反写,到带 )
直接存取存储设备磁盘是一种直接存取存储设备,又叫随机存取存储设备。它的每个物理记录有确定的位置和唯一的地址,存取任何一个物理块所需的时间几乎不依赖于此信息的位置。
访问磁盘上的一个物理记录,必须给出三个参数:柱面号、磁头号、块号磁盘机根据柱面号控制臂作机械的横向移动,
带动读写磁头到达指定柱面,这个动作较慢,
一般称作 ‘ 查找时间 ’,平均需 20毫秒左右 。
下一步从磁头号可以确定数据所在的盘,然后等待被访问的信息块旋转到读写头下时,按块号进行存取,这段等待时间称为,搜索延迟,,
平均要 10毫秒 。
磁盘机实现些操作 的通道命令是:查找,搜索,
转移和读写 。
5.5.2循环排序考虑每一磁道保存 4个记录的旋转型设备,
假定收到以下四个输入输出请求并且存在一条到该设备的可用道路 。
请示次序 记录号
( 1) 读记录 4
( 2) 读记录 3
( 3) 读记录 2
( 4) 读记录 1
对这些输入输出请求有多种排序方法
l方法 1:如果调度算法按照输入输出请求次序读记录 4,3,2,1,假定平均要用 1/2的周来定位,再加上 1/4周读出记录,则总的处理时间等于 3周,即 60毫秒 。
l 方法 2:如果调度算法决定的读入次序为读记录 1,2,3,4。 那么,总的处理时间等于 1.5周,即 30毫秒 。
l方法 3:如果我们知道当前读位置是记录 3,
则调度算法采用的次序为读记录 4,1,2,3
会更好 。 总的处理时间等于1周,即 20毫秒 。
5.5.3 优化分布信息在存储空间的排列方式也会影响存取等待时间 。 考虑 10 个逻辑记录 A,
B……,J被存于旋转型设备上,每道存放 10个记录,可安排如下:
物理块 逻辑纪录
1-10 A-J
处理 10个记录的总时间为:
10毫秒 (移动到记录 A的平均时间 )+ 2毫秒 (读记录 A)+4毫秒 (处理记录 A)+9× [16毫秒 (访问下一记录 ) +2毫秒 (读记录 )+4毫秒 (处理记录 )]= 214毫秒按照下面方式对信息分布优化:
物理块 逻辑纪录
1 A
2 H
3 E
4 B
5 I
6 F
7 C
8 J
9 G
10 D
处理 10个记录的总时间为:
10毫秒 (移动到记录 A的平均时间 )+10× [2毫秒 ( 读记录 ) × 4毫秒 ( 处理记录 ) ]=70
毫秒
5.5.4 交替地址
5.5.5 搜查定位移臂调度有若干策略
,电梯调度,算法
,最短查找时间优先,算法
,扫描,算法
,分步扫描,算法
,单向扫描,算法第 1和第 2两种算法,在单位时间内处理的输入输出请求较多即吞吐量较大,但是请求的等待时间较长,第 1种算法使等待时间更长一些 。
一般说来,扫描,算法较好,但它不分具体情况而扫过所有柱面造成性能不够好 。,分步扫描,算法使得各个输入输出请求等待时间之间的差距最小,而吞吐量适中 。,单向扫描,仅适应有不断大批量输入输出存取请求,且磁道上存放记录数量较大的情况 。
5.5.6 独立磁盘冗余阵列独立磁盘冗余阵列它是利用一台磁盘阵列控制器统一管理和控制一组磁盘驱动器,组成一个速度块,可靠性高,性能价格比好的大容量磁盘系统 。
RAID的提出填补了 CPU速度快与磁盘设备速度慢之间的间隙,其策略是,用一组较小容量的,独立的,可并行工作的磁盘驱动器组成阵列来代替单一的大容量磁盘,再加进冗余技术,数据能用多种方式组织和分布存储,于是,独立的 I/O请求能被并行处理,数据分布的单个 I/O请求也能并行地从多个磁盘驱动器同时存取数据,从而,改进了 I/O性能和系统可靠性 。
RAID样式共有 6级组成
RAID0至 RAID5,最新又扩充了 RAID6和 RAID7,
它们之间并不隐含层次关系,而是标明了不同的设计结构,
有三个共同特性,① RAID是一组物理磁盘驱动器,
可以被操作系统看作是单一的逻辑磁盘驱动器 ;
② 数据被分布存储在阵列横跨的物理驱动器上 ;
③ 冗余磁盘的作用是保存奇偶校验信息,当磁盘出现失误时它能确保数据的恢复。
RAID0不支持第三个特性,采用把大块数据分割成数据子块 (strip),交替间隔地分布存储,但未引入冗余磁盘,适用于性能要求高,但非要害数据这类应用 。
DAID1采用镜像技术,适用于做系统驱动器,存放关键的系统文件 。
RAID2和 RAID3主要采用了并行存取技术,分别还引入海明 (Hamming code) 校验码和位扦入 (bit
interleaved)奇偶校验码改进可靠性,适用于大数据量 I/O请求,如图像和 CAD这类的应用 。
RAID4和 RAID5主要采用了独立存取技术,分别还引入块扦入 (block interleaved) 奇偶校验码和块扦入分布式 (block interleaved distributed)奇偶校验码改进可靠性,适用于 I/O请求频繁的事务处理 。
RAID level 0
用户和系统的数据划成子块被分布存储在横跨阵列中的所有磁盘上,
逻辑上连续的数据子块,在物理上可被依次存储在横向相邻的磁盘驱动器上,
通过一个阵列管理软件进行逻辑地址空间到物理地址空间的映射。
与单个大磁盘相比有着明显优点,它能并行地处理要求位于不同磁盘上数据的不同 I/O请求。 RAID
level0 并不能真正划入 RAID家族,因为它没有引入冗余校验来改进性能,导致磁盘系统的可靠性差,
容易丢失数据,故己较少使用。
RAID level 1
RAID1简单地采用双份所有数据的办法,数据划成子块被分布存储在横跨阵列中的所有磁盘上,但是,每个数据子块被存储到两个独立的物理磁盘上,故阵列中的每个盘都有一个包含相同数据的它的镜像盘 。
这种数据组织方法的主要可取之处在于:
① 读请求能通过包含相同请求数据中的任何一个磁盘来提供服务,其中的一个所化查找和搜索时间最少 ;
② 写操作时,要求改写对应的两个数据子块,但这一点可采用并行操作实现,写操作的性能由并行操作中较慢的一个决定 ;
③ 出现故障后的恢复很简单,当一个驱动器出现故障,数据可以从镜像盘获得 。
RAID1缺点是价格太贵,空间利用率仅有一半,往往作为存放系统软件,关键数据和要害文件的驱动器 ;但是当磁盘故障时,它提供了一个实时的数据备份,所有的数据信息立即可用 。
RAID level 2
RAID2采用了并行存取技术 。 在并行存取阵列中,所有的磁盘参与每个 I/O请求的执行,且每个驱动器的移动臂同步工作,使得任何时刻每个磁盘的磁头都在相同的位置 。 RAID2
和 RAID3的数据子块非常小,常常小到单个字节或一个字 。
对于 RAID2纠错码按照横跨的每个数据盘的相应位进行计算,
并存储在多只奇偶校验盘的相应位的位置 。 典型地使用海明校验码,它能纠正单位错,发现双位错 。
虽然 RAID2所需磁盘数少于 RAID1,但价格仍然很贵 。 所需奇偶校验磁盘的数量与数据盘的多少成比例 。 在执行单个读操作时,所有的磁盘要被同时存取,请求的数据和关联的纠错码都提交给阵列控制器,如果发现有一个二进位错,阵列控制器能立即确认和纠正错误,所以读操作时间并未变慢 ;
在执行单个写请求时,所有的数据盘和奇偶校验盘必须被存取 。
RAID level 3
RAID3的组织与 RAID2相似,其差别是它仅使用一只冗余盘,而不论是多大的磁盘阵列。
当出现磁盘故障时,要使用奇偶校验盘的信息,数据可以用剩下的磁盘中的信息来重新构造,考虑有五个磁盘驱动器组成的阵列,若 X0到 X3存放数据,X4为奇偶校验盘,
对于第 i位的奇偶校验位可如下计算,
X4(i)=X3(i)⊕ X2(i)⊕ X1(i)⊕ X0(i)
假定驱动器 X1出故障,如果把 X4(i) X1(i)加到上面等式的两边,
得到
X1(i)=X4(i)⊕ X3(i)⊕ X2(i)⊕ X0(i)
因此,在阵列中的任何一只数据盘上的任一数据子块的内容,都能从阵列中剩余下来的其它磁盘的对应数据子块的内容来重新生成,这个原理适用于 RAID3,RAID4和
RAID5。
RAID level 4
RAID4和 RAID5使用了独立存取技术,在一个独立存取的磁盘阵列中,每个驱动器都可以独立地工作,所以,独立的 I/O
请求可以被并行地得到满足。因此独立存取阵列适合于有频繁 I/O请求的应用。
每当执行一个小数据量写操作时,阵列管理软件不旦要修改用户数据,而且也要修改对应的奇偶校验位 。 考虑有五个驱动器组成的一个阵列,X0
到 X3存储数据,X4是奇偶校验磁盘 。 假如执行一个仅仅涉及磁盘 X1上数据的写操作 。 开始的时候,
对每一个二进位 i,有下列关系式,
X4(i)=X3(i)⊕ X2(i)⊕ X1(i)⊕ X0(i)
在数据修改之后,对于改变了的二进位用 ’ 符号来指出,得到,
X4’(i)=X3(i)⊕ X2(i)⊕ X1’(i)⊕ X0(i)
=X3(i)⊕ X2(i)⊕ X1’(i)⊕ X0(i)⊕ X1(i)⊕ X1(i)
=X4(i)⊕ X1(i)⊕ X1’(i)
为了计算新的奇偶校验位,陈列管理软件必须读出老的用户数据子块和老的奇偶校验码,因此每个数据写操作包含了两次读操作和两次写操作 。
RAID level 5
RAID5的组织形式与 RAID4类似,差别仅奇偶校验码是分布横跨存放在所有的磁盘上,典型的存放方法为轮转法,设有 n
个磁盘的一个阵列,则开头的 n个奇偶校验码螺旋式地位于 n个磁盘上 (即每个盘上有一个奇偶校验码 ),接着按这个模式再次重复。采用螺旋式把奇偶校验码分布横跨存放在所有的磁盘上,能避免 RAID4
中发生的奇偶校验盘湖瓶颈口问题。
RAID level 6和 RAID level 7
这是增强型 RAID。 RAID6中设置了专用快速的异步校验磁盘,具有独立的数据访问通路,比低级 RAID性能更好,但价格昂贵 。 RAID7对 RAID6作了改进,该阵列中的所有磁盘都有较高传输速率,性能优异,但价格也很高 。
5.5.7提高磁盘 I/O速度的一些方法提前读 。 用户经常采用顺序方式访问文件的各个盘块上的数据,在读当前盘块时已能知道下次要读出的盘块的地址,因此,可在读当前盘块的同时,提前把下一个盘块数据也读入磁盘缓冲区 。 这样一来,当下次要读盘块中的那些数据时,由于已经提前把它们读入了缓冲区,
便可直接使用数据,而不必再启动磁盘 I/O,从而,减少了读数据的时间,也就相当于提高了磁盘 I/O速度 。,提前读,功能已被许多操作系统如 Unix,Windows等广泛采用 。
延迟写 。 在执行写操作时,磁盘缓冲区中的数据本来应该立即写回磁盘,但考虑到该缓冲区中的数据不久之后再次被输出进程或其它进程访问,
因此,并不马上把缓冲区中数据写盘,而是把它挂在空闲缓冲区队列的末尾 。 随着空闲缓冲区的使用,存有输出数据的缓冲区也不停地向队列头移动,直至移动到空闲缓冲区队列之首 。 当再有进程申请缓冲区,且分到了该缓冲区时,才把其中的数据写到磁盘上,于是这个缓冲区可作为空闲缓冲区分配了 。 只要存有输出数据的缓冲区还在队列中,任何访问该数据的进程,可直接从中读出数据,不必再去访问磁盘 。 这样做,可以减少磁盘的 I/O时间,相当于提高了 I/O速度 。 同样,
在 Unix和 Windows中也采用了这一技术 。
5.6 设备分配
5.6.1设备独立性通常用户不指定特定的设备,而指定逻辑设备,使得用户作业和物理设备独立开来,再通过其它途径建立逻辑设备和物理设备之间的对应关系,我们称这种特性为,设备独立性,
设备独立性带来的好处用户与物理的外围设备无关,系统增减或变更外围设备时程序不必修改;易于对付输入输出设备的故障
5.6.2 设备分配从设备的特性来看,可以把设备分成独占设备、共享设备和虚拟设备三类,
相应的管理和分配外围设备的技术可分成:独占方式、共享方式和虚拟方式,
操作系统中,对 I/O设备的分配算法常用的有:
先请求先服务,优先级高者先服务等 。
此外,在多进程请求 I/O设备分配时,应防止因循环等待对方所占用的设备而产生死锁,应预先进行性检查 。
实现 I/O设备的分配系统中应设有设备分配的数据结构:设备类表和设备表 。
系统中拥有一张设备类表,每类设备对应于设备表中的一栏,其包括的内容通常有:设备类,
总台,空闲台数和设备表起始地址等 。
每一类设备,如输入机,行式打印机等都有各自的设备表,该表用来登记这类设备中每一台设备的状态,其包含的内容通常有:物理设备名,逻辑设备名,占有设备的进程号,已分配 /
未分配,好,坏等 。 按照上述分配使用的数据结构,不难设计出 I/O设备的分配流程 。
5.7 虚拟设备静态分配方式是不利于提高系统效率的采用脱机外围设备操作联机同时外围设备操作 (又称作假脱机操作 )
5.7.2 斯普林系统的设计和实现
“井,是用作缓冲的存储区域,采用井的技术能调节供求之间的矛盾,消除人工干预带来的损失 。
,预输入程序,;能将信息从辅助存储器输出缓冲区域输出到输出设备的,缓输出程序,以及控制作业和辅助存储器缓冲区域之间交换信息的,井管理程序,。
预输入程序作业 1信息
…
作业 n信息输入井作业 1结果
…
作业 n结果输出井缓输出程序井管理程序运行作业输入设备输出设备作业调度程序输入井中的作业有四种状态:
l 输入状态:作业的信息正从输入设备上预输入 。
l 收容收态:作业预输入结束但未被选中执行 。
l 执行状态:作业已被选中,它可从输入井读取信息可向输出井写信息 。
l 完成状态:作业已经撤离,该作业的执行结果等待缓输出 。
作业表用来登记进入系统的所有作业的作业名,状态,预输入表位置等信息 。
每个用户作业拥有一张预输入表用来登记该作业的各个文件的情况,包括设备类,信息长度及存放位置等 。
每个用户作业拥有一张 缓输出表的格式包括作业名、作业状态、文件名、设备类、数据起始位置、数据当前位置等项。
井文件空间的管理第一种方式是连接方式,输入的信息被组织成连接文件,文件的第一块信息的位置登记在预输入表中,以后各块用指针连起来,读出 n
块后,由连接指针就可找到第 n+1块数据的位置 。 这种方式的优点是数据信息可以不连续存放,文件空间利用率高 。
第二种是计算方式,假定从读卡机上读入信息并存放到磁盘的井文件空间,每张卡片为 80个字节,每个磁道可存放 100个 80字节的记录,
若每个柱面有 20个磁道,则一个柱面可以存放 2000张卡片信息 。 如果把 2000张卡片作为一叠存放在一个柱面上,于是输入数据在磁盘上的位置为:第一张卡片信息是0号磁道的第1个记录,第二张卡片信息是 0号第 2个记录,第 101张卡片信息是1号磁道的第 1个记录,
那么,第 n张卡片信息被存放在:
磁道号=卡片号 n /100
记录号= ( 卡片号 n) mod100
用卡片号 n除以 100的整数和余数部分分别为其存放的磁道号和记录号 。
5.8实例研究,Windows2000
的设备管理
5.8.1 Windows NT4的设备管理
Windows NT4设备管理 ( I/O系统 ) 的设计目标如下:
l加快单处理器或多处理器系统的 I/O处理 。
l使用标准的 Windows2000安全机制保护共享资源 。
l满足 WIN32,OS2和 POSIX子系统指定的 I/O服务的需要 。
l 提供服务,使得设备驱动程序的开发尽可能简单 。
l 允许在系统中动态地添加和删除设备驱动程序 。
l 支持 FAT,NTFS和 CDFS等多种可安装的文件系统 。
l 为映像活动,文件高速缓存和应用程序提供映射文件 I/O的能力 。
5.8.1.2 I/O系统结构和模型
I/O子系统( Ntxxx)
I/O管理器( Ioxxx)
核心态设备驱动程序
HAL I/O访问例程
I/O端口和寄存器驱动程序支持例程
l I/O子系统 API是内部的执行体系统服务,子系统 DLL调用它们来实现子系统的文档化的
I/O函数 。
l I/O管理器负责驱动 I/O请求的处理 。
l 核心态设备驱动程序把 I/O请求转化为对硬件设备的特定的控制请求 。
l 驱动程序支持例程被设备驱动程序调用来完成它们的 I/O请求 。
l 硬件抽象层 HAL I/O访问例程把设备驱动程序与各种各样的硬件平台隔离开来,是它们在给定的体系结构家族中是二进制可移植的,
并且在 Windows2000支持的硬件体系结构中是源代码可移植的 。
5.8.1.3设备驱动程序
Windows NT4支持以下三类设备驱动程序:
l虚拟设备驱动程序 VDD:用于模拟 16位 DOS应用程序,它们俘获 DOS应用程序对 I/O端口的引用,并将它们转化为本机 WIN32 I/O函数 。 所以
DOS应用程序不能直接访问硬件,必须通过一个真正的核心态设备驱动程序 。
lWIN32子系统显示驱动程序和打印驱动程序
( 总称核心态图形驱动程序 ),用于将与设备无关的图形 GDI请求转化为设备专用请求 。
l核心态设备驱动程序:它们是能够直接控制和访问硬件设备的唯一驱动程序类型 。
核心态设备驱动程序的类型有:
l低层硬件设备驱动程序:它直接访问和控制硬件设备 。
l类驱动程序:为某一类设备执行 I/O处理,例如磁盘,
磁带,光盘 。
l端口驱动程序:实现了对特定于某一种类型的 I/O端口的 I/O请求的处理,如 SCSI。
l小端口驱动程序:把对端口类型的一般的 I/O请求映射到适配器类型,如一个特定的 SCSI适配器 。
l文件系统驱动程序:接受到文件的 I/O请求,并通过发布它们自己的,更明确的请求给物理设备驱动程序来满足该请求 。
l文件系统过滤器驱动程序:截取 I/O请求,执行另外的处理,并且将它们传递给更低层的驱动程序,例如容错磁盘驱动程序 FTDISK.SYS。
核心态设备驱动程序之间的关系
Windows2000 I/O系统接口
CDFS FATNTFS
CDROM
类驱动程序其他类驱动程序
FTDISK
驱动程序磁盘类驱动程序端口驱动程序小端口驱动程序
5个主要的设备驱动程序例程:
l初始化例程,I/O系统加载驱动程序后首先执行,以创建系统对象 。
l调度例程集:提供设备驱动调度函数 。
l启动 I/O例程:初始化与设备之间的数据传输 。
l中断服务例程:处理设备中断 。
l中断服务 DPC例程:在 ISR执行以后的设备中断处理 。
另外,设备驱动程序还可能有以下一些例程:
l 完成例程:用来告知分层驱动程序一个较低层的驱动程序何时完成一个 IRP处理 。
l取消 I/O例程:用来取消一个可以被取消的 I/O操作 。
l 卸载例程:用于释放驱动程序正在使用的系统资源,使得 I/O管理器可以从内存当中删除它们 。
l系统关闭通知例程:用于在系统关闭时做清理工作 。
l 错误纪录例程:用于在错误发生时纪录发生的事情 。
5.8.2Windows 2000设备管理的扩展
5.8.2.1 即插即用和电源管理即插即用和电源管理是硬件和软件支持的结合,这种结合使得计算机只需要极少的用户干预或完全不需要用户干预就能识别和适应硬件配置的更改 。
设计目标
Windows2000即插即用结构的设计目标有两个:
l在支持用于即插即用工业硬件标准的同时,为了实现即插即用和电源管理,扩展原有的 NT输入输出底层结构 。
l实现通用设备驱动程序接口,这些接口在 Windows98 和
Windows 2000下支持许多设备类的即插即用和电源管理 。
Windows2000提供以下的即插即用支持:
l已安装硬件的自动和动态识别 。
l 硬件资源的分配和再分配 。
l 加载适当的驱动程序 。
l 与即插即用系统相互作用的驱动程序接口 。
l 与电源管理的相互作用 。
l 设备通知事件的登记 。
驱动程序的更改
Windows2000为了能够支持即插即用和电源管理,
设备程序的初始化较 NT4作了很大修改 。 这些修改如下:
l 总线驱动程序从 HAL中分离 。 在新的构造中,为了与现有的核心态组件如执行体,驱动程序和 HAL的更改和扩展一致,总线驱动程序从 HAL中分离出去 。
l支持设备安装和设备配置的新方法和新功能 。 新的设计包括对 NT4中用户态组件的更改和扩展,如:假脱机,类安装程序,控制面板应用程序和安装程序 。 另外系统增加了新的核心态和用户态即插即用组件 。
l从注册表重读写信息的新的即插即用 API。 在新的设计中,
对注册表结构进行了更改和扩展,其结构支持即插即用,
同时具备向后兼容功能 。
5.8.2.4 即插即用结构类安装程序 控制面板程序 假脱机程序 其他即插即用组件枚举控制 硬件事件管理安装应用程序用户态核心态执行体 I/O接口 即插即用接口 电源管理器接口
I/O管理器即插即用管理器 电源管理器 其他执行体组件
WDM接口其他接口
WDM即插即用总线驱动程序
ACPI PC卡 USB PCI
WDM设备驱动程序 2000即插即用驱动程序硬件抽象层 HAL
功能部件的作用是:
l用户态即插即用组件:用于控制和配置设备的用户态 API。
lI/O管理器:负责驱动 I/O请求的处理,为设备驱动程序提供核心服务 。 它把用户态的读写转化为 I/O请求包
IRP。 其工作方式和工作原理与 NT4相同 。
l核心态即插即用管理器:指导总线驱动程序执行枚举和配置,执行添加设备和启动设备操作,同时还负责协调即插即用程序的用户态部分来暂停或删除可用于这类操作的设备 。 即插即用管理器维护着一棵设备树,
驱动程序管理器可以查看该设备树,跟踪系统中活动驱动程序及其与活动设备有关的信息 。 当系统添加和删除设备或进行资源再分配时,即插即用管理器便更新设备树 。
l电源管理器和策略管理器:电源管理器是核心态组件,它和策略管理器一起工作,处理电源管理 API,协调电源事件并生成电源管理 IRP。 策略管理器监控系统中的活动,将用户状态,应用程序状态和设备管理程序状态集成为电源策略,在特定环境或请求条件中生成更改电源状态的 IRP。
l即插即用 WDM接口,I/O系统为驱动程序提供了分层结构,这一结构包括 WDM驱动程序,驱动程序层和设备对象 。 WDM驱动程序可以分为三类:
总线驱动程序,功能驱动程序和筛选驱动程序 。
每一个设备都含有两个以上的驱动程序层:用于支持它所基于的 I/O总线的总线驱动程序,用于支持设备的功能驱动程序,以及可选的对总线,设备或设备类的 I/O请求进行分类的筛选驱动程序 。
另外,驱动程序为它所控制的每一个设备创建设备对象 。
lWDM总线驱动程序:它控制总线电源控制和即插即用 。 在即插急用描述表中,任何枚举其他设备的设备都被看作是一个总线 。 总线驱动程序的主要任务是:枚举总线上的设备,标志它们病危它们创建设备对象;向操作系统报告总线上的动态事件;响应即插即用和电源管理 IRP;对总线的多路复用;管理总线上的设备 。
lWDM驱动程序:包括功能驱动程序 /小功能驱动程序对和筛选驱动程序 。 在驱动程序对中,类驱动程序 ( 一般由操作系统提供 ) 提供所有这一类设备所需要的功能,小功能驱动程序 ( 一般由厂家提供 ) 提供一个特定设备所需要的功能 。 功能驱动程序除了为设备提供操作接口以外,还提供电源管理功能和执行操作的有关信息,该操作与休眠和满负荷工作状态之间的转换有关 。
5.9实例研究,Linux的设备管理
5.9.1 Linux的设备管理概述在 Linux操作系统中,输入输出设备可以分为字符设备,块设备和网络设备 。
块设备把信息存储在可寻址的固定大小的数据块中,数据块均可以被独立地读写,建立块缓冲,
能随机访问数据块 。
字符设备可以发送或接收字符流,通常无法编址,
也不存在任何寻址操作 。
网络设备在 Linux中是一种独立的设备类型,有一些特殊的处理方法 。 也有一些设备无法利用上述方法分类,如时钟,他们也需要特殊的处理 。
在 Linux中,所有的硬件设备均当作特殊的设备文件处理,可以使用标准的文件操作 。
对于字符设备和块设备,其设备文件用
mknod命令创建,用主设备号和次设备号标识,同一个设备驱动程序控制的所有设备具有相同的主设备号,并用不同的次设备号加以区别 。
网络设备也是当作设备文件来处理,不同的是这类设备由 Linux创建,并由网络控制器初始化 。
Linux核心具体负责 I/O设备的操作,这些管理和控制硬件设备控制器的程序代码称为设备驱动程序,它们是常驻内存的底层硬件处理子程序,
具体控制和管理 I/O设备 。 虽然设备驱动程序的类型很多,它们都有以下的共同特性:
l 核心代码 。 设备驱动程序是 Linux核心的重要组成部分,在内核运行 。
如果出现错误,则可能造成系统的严重破坏 。
l 核心接口 。 设备驱动程序提供标准的核心接口,供上层软件使用 。
l 核心机制和服务 。 设备驱动程序使用标准的核心系统服务,如内存分配,中断处理,进等待队列等待 。
l 可装载性 。 绝大多数设备驱动程序可以根据需要以核心模块的方式装入,在不需要是可以卸装 。
l可配置性 。 设备驱动程序可以编译并链接进入 Linux核心 。 当编译 Linux
核心时,可以指定并配置你所需要的设备驱动程序 。
l动态性 。 系统启动时将监测所有的设备,当一个设备驱动程序对应的设备不存在时,该驱动程序将被闲置,仅占用了一点内存而己 。
设备输入输出
Linux 的设备驱动程序可以通过查询
(polling),中断和直接内存访问等多种形式来控制设备进行输入输出 。
查询方式,Linux专门引入了系统定时器,以便每隔一段时间才查询一次设备的状态,从而解决忙式查询带来的效率下降问题 。 Linux的软盘驱动程序就是以这样一种方式工作的 。 即便如此,查询方式依然存在着效率问题 。
中断 I/O控制方式,在中断方式下,Linux核心能够把中断传递到发出 I/O命令的设备驱动程序 。 为了做到这一点,设备驱动程序必须在初始化时向 Linux核心注册所使用的中断编号和中断处理子程序入口地址,/proc/interrupts文件列出了设备驱动程序所使用的中断编号 。
硬盘设备,SCSI设备等高速 I/O设备,Linux采用 DMA方式进行 I/O控制,这是稀有资源一共只有 7个 。 DMA控制器不能使用虚拟内存,且由于其地址寄存器只有 16位 ( 加上页面寄存器 8位 ),它只能访问系统最低端的 16M内存 。
DMA也不能被不同的设备驱动程序共享,因此一些设备独占专用的 DMA,另一些设备互斥使用 DMA。 Linux使用
dma_chan数据结构跟踪 DMA的使用情况,它包括拥有者的名字和分配标志两个字段,可以使用 cat /proc/dma命令列出 dma_chan的内容 。
5.9.2 Linux的硬盘管理一个典型的 Linux系统一般包括一个 DOS分区、
一个 EXT2分区( Linux主分区)、
一个 Linux交换分区、
以及零个或多个扩展用户分区。
在 Linux系统中,IDE系统 (Inergrated Disk Electronic,
一种磁盘接口 )和 SCSI系统 (Small Computer System
Interface,一种 I/O总线 )的管理有所不同 。 Linux系统使用的大多数硬盘都是 IDE硬盘,每一个 IDE
控制器可以挂接两个 IDE硬盘,一个称为主硬盘,
一个称为从硬盘 。 一个系统可以有多个 IDE控制器,第一个称为主 IDE控制器,第二个称为从
IDE控制器 。 Linux系统最多支持 4个 IDE控制器,
每一个控制器用 ide_hwif_t数据结构描述,所有这些描述集中存放在 ide_hwifs向量中 。 每一个
ide_hwif_t包括两个 ide_drive_t数据结构,分别用于描述主 IDE硬盘和从 IDE硬盘 。
源设备和目标设备间的数据传输步骤最多可以有 8个不同的阶段:
1) BUS FREE:没有设备在总线的控制下,总线上无事务发生 。
2) ARBITRATION:一个 SCSI设备试图获得 SCSI总线的控制权,这时它把自己的 SCSI标识符放到地址引脚上 。 具有最高 SCSI标识符编号的设备将获得总线控制权 。
3) SELECTION:当设备成功地获得了对 SCSI总线的控制权之后,必须向它准备发送命令的那个 SCSI设备发出信号 。 具体做法是将目标设备的 SCSI标识符放置到地址引脚上 。
4) RESELECTION:在一个请求的处理过程中,SCSI设备可能会断开连接 。 目标设备将再次选择源设备 。 不是所有的 SCSI设备都支持这个阶段 。
5) COMMAND:源设备向目标设备发送 6B,10B或 12B命令 。
6) DATA IN,DATA OUT:数据在源设备和目标设备之间传输 。
7) STATUS:所有命令执行完毕后允许目标设备向源设备发送状态信息,以指示操作是否成功 。
8) MESSAGE IN,MESSAGE OUT:信息在源设备和目标设备之间传输 。
5.9.3 Linux的网络设备网络设备是传送和接收数据的一种硬件设备,
如以太网卡,与字符设备和块设备不一样,网络设备文件在网络设备被检测到和初始化时由系统动态产生。在系统自举或网络初始化时,
网络设备驱动程序向 Linux内核注册。网络设备用 device数据结构描述,该数据结构包含一些设备信息以及一些操作例程,这些例程用来支持各种网络协议,可以用于传送和接收数据包。
Device数据结构包括以下几个方面的内容:
1) 名称 。 网络设备名称是标准化的,每一个名字都能表达设备的类型,同类设备从 0开始编号,如,/dev/ethN( 以太网设备 ),/dev/seN
( SLIP设备 ),/dev/pppN( PPP设备 ),/dev/lo( 回路测试设备 ) 。
2) 总线信息 。 总线信息被设备驱动程序用来控制设备,包括设备使用的中断 irq,设备控制和状态寄存器的基地址 base address,设备所使用的 DMA通道编号 DMA channel。
3) 接口标志 。 接口标志用来描述网络设备的特性和能力,如是否点到点连接,是否接收 IP多路广播帧等 。
4) 协议信息 。 协议信息描述网络层如何使用设备,其中,mtu表示网络层可以传输的最大数据包尺寸;协议表示设备支持的协议方案,如
internet地址方案为 AF_INET;类型表示所连接的网络介质的硬件接口类型,Linux支持的介质类型有以太网,令牌环,X.25,SLIP,PPP,以及
Apple Localtalk;地址包括域网络设备有关的地址信息 。
5) 包队列 。 等待由该网络设备发送的数据包队列,所有的网络数据包用 sk_buff数据结构描述,这一数据结构非常灵活,可以方便地添加或删除网络协议信息头 。
6) 支持函数 。 指向每个设备的一组标准子程序,包括设置,帧传输,
添加标准数据头,收集统计信息等子程序 。
和 I/O设备的并行性,在操作系统中普遍采用了缓冲技术 。
缓冲技术实现基本思想如下:
当一个进程执行写操作输出数据时,先向系统申请一个主存区域 ──缓冲区,然后,将数据高速送到缓冲区 。 若为顺序写请求,则不断把数据填到缓冲区,直到它被装满为止 。 此后,
进程可以继续它的计算,同时,系统将缓冲区内容写到 I/O设备上 。 当一个进程执行操作输入数据时,先向系统申请一个主存区域 ──缓冲区,系统将一个物理记录的内容读到缓冲区域中,然后根据进程要求,把当前需要的逻辑记录从缓冲区中选出并传送给进程 。
常用的缓冲技术有:单缓冲、
双缓冲、多缓冲。
5.4.1 单缓冲对于块设备,单缓冲机制如下工作对于字符设备,单缓冲机制如下工作
5.4.2 双缓冲输入数据时,首先填满缓冲区 1,操作系统可从缓冲区 1把数据送到用户进程区,用户进程便可对数据进行加工计算 ;与此同时,
输入设备填充缓冲区 2。当缓冲区 1空出后,输入设备再次向缓冲区 1输入。操作系统又可以把缓冲区 2的数据传送到用户进程区,用户进程开始加工缓冲 2的数据。
对于块设备,处理或传输一块的时间为
max(C,T),如果 C<T,可以保证块设备连续工作 ;如果 C>T,使得进程不必要等待 I/O。 双缓冲使 `效率提高了,但复杂性也增加了 。
5.4.3 多缓冲操作系统从自由主存区域中分配一组缓冲区组成循环缓冲,每个缓冲区的大小可以等于物理记录的大小。多缓冲的缓冲区是系统的公共资源,可供各个进程共享,并由系统统一分配和管理。缓冲区可用途分为:输入缓冲区,处理缓冲区和输出缓冲区。
Unix I/O字符缓存队列
5.5 驱动调度技术作为操作系统的辅助存储器,用来存放文件的磁盘一类高速大容量旋转型存储设备,在繁重的输入输出负载之下,同时会有若干个输入输出请求来到并等待处理 。 系统必须采用一种调度策略,使能按最佳次序执行要求访问的诸请求,这就叫驱动调度,使用的算法叫驱动调度算法 。
驱动调度能减少为若干个输入输出请求服务所需的总时间,从而提高系统效率,除了输入输出请求的优化排序外,信息在辅助存储器上的排列方式,存储空间的分配方法都能影响存取访问速度 。
5.5.1 存储设备的物理结构顺序存取存储设备是严格依赖信息的物理位置进行定位和读写的存储设备具有存储容量大、稳定可靠、卷可装卸和便于保存等优点
■
始点块
1
间隙块
2
间隙块
3
间隙块
i
间隙块
i+1
■
末点… …
… …
磁头 (正走,反走,正读,反读,正写,反写,到带 )
直接存取存储设备磁盘是一种直接存取存储设备,又叫随机存取存储设备。它的每个物理记录有确定的位置和唯一的地址,存取任何一个物理块所需的时间几乎不依赖于此信息的位置。
访问磁盘上的一个物理记录,必须给出三个参数:柱面号、磁头号、块号磁盘机根据柱面号控制臂作机械的横向移动,
带动读写磁头到达指定柱面,这个动作较慢,
一般称作 ‘ 查找时间 ’,平均需 20毫秒左右 。
下一步从磁头号可以确定数据所在的盘,然后等待被访问的信息块旋转到读写头下时,按块号进行存取,这段等待时间称为,搜索延迟,,
平均要 10毫秒 。
磁盘机实现些操作 的通道命令是:查找,搜索,
转移和读写 。
5.5.2循环排序考虑每一磁道保存 4个记录的旋转型设备,
假定收到以下四个输入输出请求并且存在一条到该设备的可用道路 。
请示次序 记录号
( 1) 读记录 4
( 2) 读记录 3
( 3) 读记录 2
( 4) 读记录 1
对这些输入输出请求有多种排序方法
l方法 1:如果调度算法按照输入输出请求次序读记录 4,3,2,1,假定平均要用 1/2的周来定位,再加上 1/4周读出记录,则总的处理时间等于 3周,即 60毫秒 。
l 方法 2:如果调度算法决定的读入次序为读记录 1,2,3,4。 那么,总的处理时间等于 1.5周,即 30毫秒 。
l方法 3:如果我们知道当前读位置是记录 3,
则调度算法采用的次序为读记录 4,1,2,3
会更好 。 总的处理时间等于1周,即 20毫秒 。
5.5.3 优化分布信息在存储空间的排列方式也会影响存取等待时间 。 考虑 10 个逻辑记录 A,
B……,J被存于旋转型设备上,每道存放 10个记录,可安排如下:
物理块 逻辑纪录
1-10 A-J
处理 10个记录的总时间为:
10毫秒 (移动到记录 A的平均时间 )+ 2毫秒 (读记录 A)+4毫秒 (处理记录 A)+9× [16毫秒 (访问下一记录 ) +2毫秒 (读记录 )+4毫秒 (处理记录 )]= 214毫秒按照下面方式对信息分布优化:
物理块 逻辑纪录
1 A
2 H
3 E
4 B
5 I
6 F
7 C
8 J
9 G
10 D
处理 10个记录的总时间为:
10毫秒 (移动到记录 A的平均时间 )+10× [2毫秒 ( 读记录 ) × 4毫秒 ( 处理记录 ) ]=70
毫秒
5.5.4 交替地址
5.5.5 搜查定位移臂调度有若干策略
,电梯调度,算法
,最短查找时间优先,算法
,扫描,算法
,分步扫描,算法
,单向扫描,算法第 1和第 2两种算法,在单位时间内处理的输入输出请求较多即吞吐量较大,但是请求的等待时间较长,第 1种算法使等待时间更长一些 。
一般说来,扫描,算法较好,但它不分具体情况而扫过所有柱面造成性能不够好 。,分步扫描,算法使得各个输入输出请求等待时间之间的差距最小,而吞吐量适中 。,单向扫描,仅适应有不断大批量输入输出存取请求,且磁道上存放记录数量较大的情况 。
5.5.6 独立磁盘冗余阵列独立磁盘冗余阵列它是利用一台磁盘阵列控制器统一管理和控制一组磁盘驱动器,组成一个速度块,可靠性高,性能价格比好的大容量磁盘系统 。
RAID的提出填补了 CPU速度快与磁盘设备速度慢之间的间隙,其策略是,用一组较小容量的,独立的,可并行工作的磁盘驱动器组成阵列来代替单一的大容量磁盘,再加进冗余技术,数据能用多种方式组织和分布存储,于是,独立的 I/O请求能被并行处理,数据分布的单个 I/O请求也能并行地从多个磁盘驱动器同时存取数据,从而,改进了 I/O性能和系统可靠性 。
RAID样式共有 6级组成
RAID0至 RAID5,最新又扩充了 RAID6和 RAID7,
它们之间并不隐含层次关系,而是标明了不同的设计结构,
有三个共同特性,① RAID是一组物理磁盘驱动器,
可以被操作系统看作是单一的逻辑磁盘驱动器 ;
② 数据被分布存储在阵列横跨的物理驱动器上 ;
③ 冗余磁盘的作用是保存奇偶校验信息,当磁盘出现失误时它能确保数据的恢复。
RAID0不支持第三个特性,采用把大块数据分割成数据子块 (strip),交替间隔地分布存储,但未引入冗余磁盘,适用于性能要求高,但非要害数据这类应用 。
DAID1采用镜像技术,适用于做系统驱动器,存放关键的系统文件 。
RAID2和 RAID3主要采用了并行存取技术,分别还引入海明 (Hamming code) 校验码和位扦入 (bit
interleaved)奇偶校验码改进可靠性,适用于大数据量 I/O请求,如图像和 CAD这类的应用 。
RAID4和 RAID5主要采用了独立存取技术,分别还引入块扦入 (block interleaved) 奇偶校验码和块扦入分布式 (block interleaved distributed)奇偶校验码改进可靠性,适用于 I/O请求频繁的事务处理 。
RAID level 0
用户和系统的数据划成子块被分布存储在横跨阵列中的所有磁盘上,
逻辑上连续的数据子块,在物理上可被依次存储在横向相邻的磁盘驱动器上,
通过一个阵列管理软件进行逻辑地址空间到物理地址空间的映射。
与单个大磁盘相比有着明显优点,它能并行地处理要求位于不同磁盘上数据的不同 I/O请求。 RAID
level0 并不能真正划入 RAID家族,因为它没有引入冗余校验来改进性能,导致磁盘系统的可靠性差,
容易丢失数据,故己较少使用。
RAID level 1
RAID1简单地采用双份所有数据的办法,数据划成子块被分布存储在横跨阵列中的所有磁盘上,但是,每个数据子块被存储到两个独立的物理磁盘上,故阵列中的每个盘都有一个包含相同数据的它的镜像盘 。
这种数据组织方法的主要可取之处在于:
① 读请求能通过包含相同请求数据中的任何一个磁盘来提供服务,其中的一个所化查找和搜索时间最少 ;
② 写操作时,要求改写对应的两个数据子块,但这一点可采用并行操作实现,写操作的性能由并行操作中较慢的一个决定 ;
③ 出现故障后的恢复很简单,当一个驱动器出现故障,数据可以从镜像盘获得 。
RAID1缺点是价格太贵,空间利用率仅有一半,往往作为存放系统软件,关键数据和要害文件的驱动器 ;但是当磁盘故障时,它提供了一个实时的数据备份,所有的数据信息立即可用 。
RAID level 2
RAID2采用了并行存取技术 。 在并行存取阵列中,所有的磁盘参与每个 I/O请求的执行,且每个驱动器的移动臂同步工作,使得任何时刻每个磁盘的磁头都在相同的位置 。 RAID2
和 RAID3的数据子块非常小,常常小到单个字节或一个字 。
对于 RAID2纠错码按照横跨的每个数据盘的相应位进行计算,
并存储在多只奇偶校验盘的相应位的位置 。 典型地使用海明校验码,它能纠正单位错,发现双位错 。
虽然 RAID2所需磁盘数少于 RAID1,但价格仍然很贵 。 所需奇偶校验磁盘的数量与数据盘的多少成比例 。 在执行单个读操作时,所有的磁盘要被同时存取,请求的数据和关联的纠错码都提交给阵列控制器,如果发现有一个二进位错,阵列控制器能立即确认和纠正错误,所以读操作时间并未变慢 ;
在执行单个写请求时,所有的数据盘和奇偶校验盘必须被存取 。
RAID level 3
RAID3的组织与 RAID2相似,其差别是它仅使用一只冗余盘,而不论是多大的磁盘阵列。
当出现磁盘故障时,要使用奇偶校验盘的信息,数据可以用剩下的磁盘中的信息来重新构造,考虑有五个磁盘驱动器组成的阵列,若 X0到 X3存放数据,X4为奇偶校验盘,
对于第 i位的奇偶校验位可如下计算,
X4(i)=X3(i)⊕ X2(i)⊕ X1(i)⊕ X0(i)
假定驱动器 X1出故障,如果把 X4(i) X1(i)加到上面等式的两边,
得到
X1(i)=X4(i)⊕ X3(i)⊕ X2(i)⊕ X0(i)
因此,在阵列中的任何一只数据盘上的任一数据子块的内容,都能从阵列中剩余下来的其它磁盘的对应数据子块的内容来重新生成,这个原理适用于 RAID3,RAID4和
RAID5。
RAID level 4
RAID4和 RAID5使用了独立存取技术,在一个独立存取的磁盘阵列中,每个驱动器都可以独立地工作,所以,独立的 I/O
请求可以被并行地得到满足。因此独立存取阵列适合于有频繁 I/O请求的应用。
每当执行一个小数据量写操作时,阵列管理软件不旦要修改用户数据,而且也要修改对应的奇偶校验位 。 考虑有五个驱动器组成的一个阵列,X0
到 X3存储数据,X4是奇偶校验磁盘 。 假如执行一个仅仅涉及磁盘 X1上数据的写操作 。 开始的时候,
对每一个二进位 i,有下列关系式,
X4(i)=X3(i)⊕ X2(i)⊕ X1(i)⊕ X0(i)
在数据修改之后,对于改变了的二进位用 ’ 符号来指出,得到,
X4’(i)=X3(i)⊕ X2(i)⊕ X1’(i)⊕ X0(i)
=X3(i)⊕ X2(i)⊕ X1’(i)⊕ X0(i)⊕ X1(i)⊕ X1(i)
=X4(i)⊕ X1(i)⊕ X1’(i)
为了计算新的奇偶校验位,陈列管理软件必须读出老的用户数据子块和老的奇偶校验码,因此每个数据写操作包含了两次读操作和两次写操作 。
RAID level 5
RAID5的组织形式与 RAID4类似,差别仅奇偶校验码是分布横跨存放在所有的磁盘上,典型的存放方法为轮转法,设有 n
个磁盘的一个阵列,则开头的 n个奇偶校验码螺旋式地位于 n个磁盘上 (即每个盘上有一个奇偶校验码 ),接着按这个模式再次重复。采用螺旋式把奇偶校验码分布横跨存放在所有的磁盘上,能避免 RAID4
中发生的奇偶校验盘湖瓶颈口问题。
RAID level 6和 RAID level 7
这是增强型 RAID。 RAID6中设置了专用快速的异步校验磁盘,具有独立的数据访问通路,比低级 RAID性能更好,但价格昂贵 。 RAID7对 RAID6作了改进,该阵列中的所有磁盘都有较高传输速率,性能优异,但价格也很高 。
5.5.7提高磁盘 I/O速度的一些方法提前读 。 用户经常采用顺序方式访问文件的各个盘块上的数据,在读当前盘块时已能知道下次要读出的盘块的地址,因此,可在读当前盘块的同时,提前把下一个盘块数据也读入磁盘缓冲区 。 这样一来,当下次要读盘块中的那些数据时,由于已经提前把它们读入了缓冲区,
便可直接使用数据,而不必再启动磁盘 I/O,从而,减少了读数据的时间,也就相当于提高了磁盘 I/O速度 。,提前读,功能已被许多操作系统如 Unix,Windows等广泛采用 。
延迟写 。 在执行写操作时,磁盘缓冲区中的数据本来应该立即写回磁盘,但考虑到该缓冲区中的数据不久之后再次被输出进程或其它进程访问,
因此,并不马上把缓冲区中数据写盘,而是把它挂在空闲缓冲区队列的末尾 。 随着空闲缓冲区的使用,存有输出数据的缓冲区也不停地向队列头移动,直至移动到空闲缓冲区队列之首 。 当再有进程申请缓冲区,且分到了该缓冲区时,才把其中的数据写到磁盘上,于是这个缓冲区可作为空闲缓冲区分配了 。 只要存有输出数据的缓冲区还在队列中,任何访问该数据的进程,可直接从中读出数据,不必再去访问磁盘 。 这样做,可以减少磁盘的 I/O时间,相当于提高了 I/O速度 。 同样,
在 Unix和 Windows中也采用了这一技术 。
5.6 设备分配
5.6.1设备独立性通常用户不指定特定的设备,而指定逻辑设备,使得用户作业和物理设备独立开来,再通过其它途径建立逻辑设备和物理设备之间的对应关系,我们称这种特性为,设备独立性,
设备独立性带来的好处用户与物理的外围设备无关,系统增减或变更外围设备时程序不必修改;易于对付输入输出设备的故障
5.6.2 设备分配从设备的特性来看,可以把设备分成独占设备、共享设备和虚拟设备三类,
相应的管理和分配外围设备的技术可分成:独占方式、共享方式和虚拟方式,
操作系统中,对 I/O设备的分配算法常用的有:
先请求先服务,优先级高者先服务等 。
此外,在多进程请求 I/O设备分配时,应防止因循环等待对方所占用的设备而产生死锁,应预先进行性检查 。
实现 I/O设备的分配系统中应设有设备分配的数据结构:设备类表和设备表 。
系统中拥有一张设备类表,每类设备对应于设备表中的一栏,其包括的内容通常有:设备类,
总台,空闲台数和设备表起始地址等 。
每一类设备,如输入机,行式打印机等都有各自的设备表,该表用来登记这类设备中每一台设备的状态,其包含的内容通常有:物理设备名,逻辑设备名,占有设备的进程号,已分配 /
未分配,好,坏等 。 按照上述分配使用的数据结构,不难设计出 I/O设备的分配流程 。
5.7 虚拟设备静态分配方式是不利于提高系统效率的采用脱机外围设备操作联机同时外围设备操作 (又称作假脱机操作 )
5.7.2 斯普林系统的设计和实现
“井,是用作缓冲的存储区域,采用井的技术能调节供求之间的矛盾,消除人工干预带来的损失 。
,预输入程序,;能将信息从辅助存储器输出缓冲区域输出到输出设备的,缓输出程序,以及控制作业和辅助存储器缓冲区域之间交换信息的,井管理程序,。
预输入程序作业 1信息
…
作业 n信息输入井作业 1结果
…
作业 n结果输出井缓输出程序井管理程序运行作业输入设备输出设备作业调度程序输入井中的作业有四种状态:
l 输入状态:作业的信息正从输入设备上预输入 。
l 收容收态:作业预输入结束但未被选中执行 。
l 执行状态:作业已被选中,它可从输入井读取信息可向输出井写信息 。
l 完成状态:作业已经撤离,该作业的执行结果等待缓输出 。
作业表用来登记进入系统的所有作业的作业名,状态,预输入表位置等信息 。
每个用户作业拥有一张预输入表用来登记该作业的各个文件的情况,包括设备类,信息长度及存放位置等 。
每个用户作业拥有一张 缓输出表的格式包括作业名、作业状态、文件名、设备类、数据起始位置、数据当前位置等项。
井文件空间的管理第一种方式是连接方式,输入的信息被组织成连接文件,文件的第一块信息的位置登记在预输入表中,以后各块用指针连起来,读出 n
块后,由连接指针就可找到第 n+1块数据的位置 。 这种方式的优点是数据信息可以不连续存放,文件空间利用率高 。
第二种是计算方式,假定从读卡机上读入信息并存放到磁盘的井文件空间,每张卡片为 80个字节,每个磁道可存放 100个 80字节的记录,
若每个柱面有 20个磁道,则一个柱面可以存放 2000张卡片信息 。 如果把 2000张卡片作为一叠存放在一个柱面上,于是输入数据在磁盘上的位置为:第一张卡片信息是0号磁道的第1个记录,第二张卡片信息是 0号第 2个记录,第 101张卡片信息是1号磁道的第 1个记录,
那么,第 n张卡片信息被存放在:
磁道号=卡片号 n /100
记录号= ( 卡片号 n) mod100
用卡片号 n除以 100的整数和余数部分分别为其存放的磁道号和记录号 。
5.8实例研究,Windows2000
的设备管理
5.8.1 Windows NT4的设备管理
Windows NT4设备管理 ( I/O系统 ) 的设计目标如下:
l加快单处理器或多处理器系统的 I/O处理 。
l使用标准的 Windows2000安全机制保护共享资源 。
l满足 WIN32,OS2和 POSIX子系统指定的 I/O服务的需要 。
l 提供服务,使得设备驱动程序的开发尽可能简单 。
l 允许在系统中动态地添加和删除设备驱动程序 。
l 支持 FAT,NTFS和 CDFS等多种可安装的文件系统 。
l 为映像活动,文件高速缓存和应用程序提供映射文件 I/O的能力 。
5.8.1.2 I/O系统结构和模型
I/O子系统( Ntxxx)
I/O管理器( Ioxxx)
核心态设备驱动程序
HAL I/O访问例程
I/O端口和寄存器驱动程序支持例程
l I/O子系统 API是内部的执行体系统服务,子系统 DLL调用它们来实现子系统的文档化的
I/O函数 。
l I/O管理器负责驱动 I/O请求的处理 。
l 核心态设备驱动程序把 I/O请求转化为对硬件设备的特定的控制请求 。
l 驱动程序支持例程被设备驱动程序调用来完成它们的 I/O请求 。
l 硬件抽象层 HAL I/O访问例程把设备驱动程序与各种各样的硬件平台隔离开来,是它们在给定的体系结构家族中是二进制可移植的,
并且在 Windows2000支持的硬件体系结构中是源代码可移植的 。
5.8.1.3设备驱动程序
Windows NT4支持以下三类设备驱动程序:
l虚拟设备驱动程序 VDD:用于模拟 16位 DOS应用程序,它们俘获 DOS应用程序对 I/O端口的引用,并将它们转化为本机 WIN32 I/O函数 。 所以
DOS应用程序不能直接访问硬件,必须通过一个真正的核心态设备驱动程序 。
lWIN32子系统显示驱动程序和打印驱动程序
( 总称核心态图形驱动程序 ),用于将与设备无关的图形 GDI请求转化为设备专用请求 。
l核心态设备驱动程序:它们是能够直接控制和访问硬件设备的唯一驱动程序类型 。
核心态设备驱动程序的类型有:
l低层硬件设备驱动程序:它直接访问和控制硬件设备 。
l类驱动程序:为某一类设备执行 I/O处理,例如磁盘,
磁带,光盘 。
l端口驱动程序:实现了对特定于某一种类型的 I/O端口的 I/O请求的处理,如 SCSI。
l小端口驱动程序:把对端口类型的一般的 I/O请求映射到适配器类型,如一个特定的 SCSI适配器 。
l文件系统驱动程序:接受到文件的 I/O请求,并通过发布它们自己的,更明确的请求给物理设备驱动程序来满足该请求 。
l文件系统过滤器驱动程序:截取 I/O请求,执行另外的处理,并且将它们传递给更低层的驱动程序,例如容错磁盘驱动程序 FTDISK.SYS。
核心态设备驱动程序之间的关系
Windows2000 I/O系统接口
CDFS FATNTFS
CDROM
类驱动程序其他类驱动程序
FTDISK
驱动程序磁盘类驱动程序端口驱动程序小端口驱动程序
5个主要的设备驱动程序例程:
l初始化例程,I/O系统加载驱动程序后首先执行,以创建系统对象 。
l调度例程集:提供设备驱动调度函数 。
l启动 I/O例程:初始化与设备之间的数据传输 。
l中断服务例程:处理设备中断 。
l中断服务 DPC例程:在 ISR执行以后的设备中断处理 。
另外,设备驱动程序还可能有以下一些例程:
l 完成例程:用来告知分层驱动程序一个较低层的驱动程序何时完成一个 IRP处理 。
l取消 I/O例程:用来取消一个可以被取消的 I/O操作 。
l 卸载例程:用于释放驱动程序正在使用的系统资源,使得 I/O管理器可以从内存当中删除它们 。
l系统关闭通知例程:用于在系统关闭时做清理工作 。
l 错误纪录例程:用于在错误发生时纪录发生的事情 。
5.8.2Windows 2000设备管理的扩展
5.8.2.1 即插即用和电源管理即插即用和电源管理是硬件和软件支持的结合,这种结合使得计算机只需要极少的用户干预或完全不需要用户干预就能识别和适应硬件配置的更改 。
设计目标
Windows2000即插即用结构的设计目标有两个:
l在支持用于即插即用工业硬件标准的同时,为了实现即插即用和电源管理,扩展原有的 NT输入输出底层结构 。
l实现通用设备驱动程序接口,这些接口在 Windows98 和
Windows 2000下支持许多设备类的即插即用和电源管理 。
Windows2000提供以下的即插即用支持:
l已安装硬件的自动和动态识别 。
l 硬件资源的分配和再分配 。
l 加载适当的驱动程序 。
l 与即插即用系统相互作用的驱动程序接口 。
l 与电源管理的相互作用 。
l 设备通知事件的登记 。
驱动程序的更改
Windows2000为了能够支持即插即用和电源管理,
设备程序的初始化较 NT4作了很大修改 。 这些修改如下:
l 总线驱动程序从 HAL中分离 。 在新的构造中,为了与现有的核心态组件如执行体,驱动程序和 HAL的更改和扩展一致,总线驱动程序从 HAL中分离出去 。
l支持设备安装和设备配置的新方法和新功能 。 新的设计包括对 NT4中用户态组件的更改和扩展,如:假脱机,类安装程序,控制面板应用程序和安装程序 。 另外系统增加了新的核心态和用户态即插即用组件 。
l从注册表重读写信息的新的即插即用 API。 在新的设计中,
对注册表结构进行了更改和扩展,其结构支持即插即用,
同时具备向后兼容功能 。
5.8.2.4 即插即用结构类安装程序 控制面板程序 假脱机程序 其他即插即用组件枚举控制 硬件事件管理安装应用程序用户态核心态执行体 I/O接口 即插即用接口 电源管理器接口
I/O管理器即插即用管理器 电源管理器 其他执行体组件
WDM接口其他接口
WDM即插即用总线驱动程序
ACPI PC卡 USB PCI
WDM设备驱动程序 2000即插即用驱动程序硬件抽象层 HAL
功能部件的作用是:
l用户态即插即用组件:用于控制和配置设备的用户态 API。
lI/O管理器:负责驱动 I/O请求的处理,为设备驱动程序提供核心服务 。 它把用户态的读写转化为 I/O请求包
IRP。 其工作方式和工作原理与 NT4相同 。
l核心态即插即用管理器:指导总线驱动程序执行枚举和配置,执行添加设备和启动设备操作,同时还负责协调即插即用程序的用户态部分来暂停或删除可用于这类操作的设备 。 即插即用管理器维护着一棵设备树,
驱动程序管理器可以查看该设备树,跟踪系统中活动驱动程序及其与活动设备有关的信息 。 当系统添加和删除设备或进行资源再分配时,即插即用管理器便更新设备树 。
l电源管理器和策略管理器:电源管理器是核心态组件,它和策略管理器一起工作,处理电源管理 API,协调电源事件并生成电源管理 IRP。 策略管理器监控系统中的活动,将用户状态,应用程序状态和设备管理程序状态集成为电源策略,在特定环境或请求条件中生成更改电源状态的 IRP。
l即插即用 WDM接口,I/O系统为驱动程序提供了分层结构,这一结构包括 WDM驱动程序,驱动程序层和设备对象 。 WDM驱动程序可以分为三类:
总线驱动程序,功能驱动程序和筛选驱动程序 。
每一个设备都含有两个以上的驱动程序层:用于支持它所基于的 I/O总线的总线驱动程序,用于支持设备的功能驱动程序,以及可选的对总线,设备或设备类的 I/O请求进行分类的筛选驱动程序 。
另外,驱动程序为它所控制的每一个设备创建设备对象 。
lWDM总线驱动程序:它控制总线电源控制和即插即用 。 在即插急用描述表中,任何枚举其他设备的设备都被看作是一个总线 。 总线驱动程序的主要任务是:枚举总线上的设备,标志它们病危它们创建设备对象;向操作系统报告总线上的动态事件;响应即插即用和电源管理 IRP;对总线的多路复用;管理总线上的设备 。
lWDM驱动程序:包括功能驱动程序 /小功能驱动程序对和筛选驱动程序 。 在驱动程序对中,类驱动程序 ( 一般由操作系统提供 ) 提供所有这一类设备所需要的功能,小功能驱动程序 ( 一般由厂家提供 ) 提供一个特定设备所需要的功能 。 功能驱动程序除了为设备提供操作接口以外,还提供电源管理功能和执行操作的有关信息,该操作与休眠和满负荷工作状态之间的转换有关 。
5.9实例研究,Linux的设备管理
5.9.1 Linux的设备管理概述在 Linux操作系统中,输入输出设备可以分为字符设备,块设备和网络设备 。
块设备把信息存储在可寻址的固定大小的数据块中,数据块均可以被独立地读写,建立块缓冲,
能随机访问数据块 。
字符设备可以发送或接收字符流,通常无法编址,
也不存在任何寻址操作 。
网络设备在 Linux中是一种独立的设备类型,有一些特殊的处理方法 。 也有一些设备无法利用上述方法分类,如时钟,他们也需要特殊的处理 。
在 Linux中,所有的硬件设备均当作特殊的设备文件处理,可以使用标准的文件操作 。
对于字符设备和块设备,其设备文件用
mknod命令创建,用主设备号和次设备号标识,同一个设备驱动程序控制的所有设备具有相同的主设备号,并用不同的次设备号加以区别 。
网络设备也是当作设备文件来处理,不同的是这类设备由 Linux创建,并由网络控制器初始化 。
Linux核心具体负责 I/O设备的操作,这些管理和控制硬件设备控制器的程序代码称为设备驱动程序,它们是常驻内存的底层硬件处理子程序,
具体控制和管理 I/O设备 。 虽然设备驱动程序的类型很多,它们都有以下的共同特性:
l 核心代码 。 设备驱动程序是 Linux核心的重要组成部分,在内核运行 。
如果出现错误,则可能造成系统的严重破坏 。
l 核心接口 。 设备驱动程序提供标准的核心接口,供上层软件使用 。
l 核心机制和服务 。 设备驱动程序使用标准的核心系统服务,如内存分配,中断处理,进等待队列等待 。
l 可装载性 。 绝大多数设备驱动程序可以根据需要以核心模块的方式装入,在不需要是可以卸装 。
l可配置性 。 设备驱动程序可以编译并链接进入 Linux核心 。 当编译 Linux
核心时,可以指定并配置你所需要的设备驱动程序 。
l动态性 。 系统启动时将监测所有的设备,当一个设备驱动程序对应的设备不存在时,该驱动程序将被闲置,仅占用了一点内存而己 。
设备输入输出
Linux 的设备驱动程序可以通过查询
(polling),中断和直接内存访问等多种形式来控制设备进行输入输出 。
查询方式,Linux专门引入了系统定时器,以便每隔一段时间才查询一次设备的状态,从而解决忙式查询带来的效率下降问题 。 Linux的软盘驱动程序就是以这样一种方式工作的 。 即便如此,查询方式依然存在着效率问题 。
中断 I/O控制方式,在中断方式下,Linux核心能够把中断传递到发出 I/O命令的设备驱动程序 。 为了做到这一点,设备驱动程序必须在初始化时向 Linux核心注册所使用的中断编号和中断处理子程序入口地址,/proc/interrupts文件列出了设备驱动程序所使用的中断编号 。
硬盘设备,SCSI设备等高速 I/O设备,Linux采用 DMA方式进行 I/O控制,这是稀有资源一共只有 7个 。 DMA控制器不能使用虚拟内存,且由于其地址寄存器只有 16位 ( 加上页面寄存器 8位 ),它只能访问系统最低端的 16M内存 。
DMA也不能被不同的设备驱动程序共享,因此一些设备独占专用的 DMA,另一些设备互斥使用 DMA。 Linux使用
dma_chan数据结构跟踪 DMA的使用情况,它包括拥有者的名字和分配标志两个字段,可以使用 cat /proc/dma命令列出 dma_chan的内容 。
5.9.2 Linux的硬盘管理一个典型的 Linux系统一般包括一个 DOS分区、
一个 EXT2分区( Linux主分区)、
一个 Linux交换分区、
以及零个或多个扩展用户分区。
在 Linux系统中,IDE系统 (Inergrated Disk Electronic,
一种磁盘接口 )和 SCSI系统 (Small Computer System
Interface,一种 I/O总线 )的管理有所不同 。 Linux系统使用的大多数硬盘都是 IDE硬盘,每一个 IDE
控制器可以挂接两个 IDE硬盘,一个称为主硬盘,
一个称为从硬盘 。 一个系统可以有多个 IDE控制器,第一个称为主 IDE控制器,第二个称为从
IDE控制器 。 Linux系统最多支持 4个 IDE控制器,
每一个控制器用 ide_hwif_t数据结构描述,所有这些描述集中存放在 ide_hwifs向量中 。 每一个
ide_hwif_t包括两个 ide_drive_t数据结构,分别用于描述主 IDE硬盘和从 IDE硬盘 。
源设备和目标设备间的数据传输步骤最多可以有 8个不同的阶段:
1) BUS FREE:没有设备在总线的控制下,总线上无事务发生 。
2) ARBITRATION:一个 SCSI设备试图获得 SCSI总线的控制权,这时它把自己的 SCSI标识符放到地址引脚上 。 具有最高 SCSI标识符编号的设备将获得总线控制权 。
3) SELECTION:当设备成功地获得了对 SCSI总线的控制权之后,必须向它准备发送命令的那个 SCSI设备发出信号 。 具体做法是将目标设备的 SCSI标识符放置到地址引脚上 。
4) RESELECTION:在一个请求的处理过程中,SCSI设备可能会断开连接 。 目标设备将再次选择源设备 。 不是所有的 SCSI设备都支持这个阶段 。
5) COMMAND:源设备向目标设备发送 6B,10B或 12B命令 。
6) DATA IN,DATA OUT:数据在源设备和目标设备之间传输 。
7) STATUS:所有命令执行完毕后允许目标设备向源设备发送状态信息,以指示操作是否成功 。
8) MESSAGE IN,MESSAGE OUT:信息在源设备和目标设备之间传输 。
5.9.3 Linux的网络设备网络设备是传送和接收数据的一种硬件设备,
如以太网卡,与字符设备和块设备不一样,网络设备文件在网络设备被检测到和初始化时由系统动态产生。在系统自举或网络初始化时,
网络设备驱动程序向 Linux内核注册。网络设备用 device数据结构描述,该数据结构包含一些设备信息以及一些操作例程,这些例程用来支持各种网络协议,可以用于传送和接收数据包。
Device数据结构包括以下几个方面的内容:
1) 名称 。 网络设备名称是标准化的,每一个名字都能表达设备的类型,同类设备从 0开始编号,如,/dev/ethN( 以太网设备 ),/dev/seN
( SLIP设备 ),/dev/pppN( PPP设备 ),/dev/lo( 回路测试设备 ) 。
2) 总线信息 。 总线信息被设备驱动程序用来控制设备,包括设备使用的中断 irq,设备控制和状态寄存器的基地址 base address,设备所使用的 DMA通道编号 DMA channel。
3) 接口标志 。 接口标志用来描述网络设备的特性和能力,如是否点到点连接,是否接收 IP多路广播帧等 。
4) 协议信息 。 协议信息描述网络层如何使用设备,其中,mtu表示网络层可以传输的最大数据包尺寸;协议表示设备支持的协议方案,如
internet地址方案为 AF_INET;类型表示所连接的网络介质的硬件接口类型,Linux支持的介质类型有以太网,令牌环,X.25,SLIP,PPP,以及
Apple Localtalk;地址包括域网络设备有关的地址信息 。
5) 包队列 。 等待由该网络设备发送的数据包队列,所有的网络数据包用 sk_buff数据结构描述,这一数据结构非常灵活,可以方便地添加或删除网络协议信息头 。
6) 支持函数 。 指向每个设备的一组标准子程序,包括设置,帧传输,
添加标准数据头,收集统计信息等子程序 。