设备独立性软件

5.1.3 已经给出了这一层的六项职责,5.2 这一整节就是把这六项逐个展开:本节讲”设备独立性”这个核心思想与逻辑名到物理名的映射,5.2.2 讲缓冲管理,5.2.3 讲设备分配与回收。

机制

设备独立性的含义

设备独立性(设备无关性)指:用户程序中使用的是逻辑设备名,而系统在实际执行时将其转换为物理设备名。

这与文件系统的”按名存取”是完全相同的思路——用户说”打印机”,不说”3 号 LPT 端口上那台惠普”;正如用户说”我的论文.docx”,不说”第 38912 号盘块”。

这样做带来三个好处:

① 方便用户编程。 用户不必了解物理设备的具体细节,也不必知道系统里到底装了几台打印机。

② 使程序运行不受具体机器环境的限制。 若程序里写死了”3 号打印机”,一旦那台机器坏了或换了编号,程序就跑不起来;用逻辑名则由系统在运行时挑一台可用的。

③ 便于程序移植。 同一个程序拿到另一台配置完全不同的机器上,不需要修改任何一行代码。

逻辑设备表

实现映射靠的是逻辑设备表(LUT),表中每个表项包含三项内容:逻辑设备名、物理设备名、设备驱动程序的入口地址。

第三项值得注意:LUT 不只回答”这个逻辑名对应哪台设备”,还直接给出了这台设备的驱动程序在哪。这样一次查表就同时解决了”用哪台”和”怎么驱动”两个问题,后续调用不必再查。

LUT 有两种设置方式:

① 整个系统只设置一张 LUT。 所有进程的逻辑设备名都记在这一张表里,因此不同进程不允许使用相同的逻辑设备名。这一限制在多用户环境下很不方便。

② 为每个用户设置一张 LUT。 每个用户一张表,于是不同用户可以使用相同的逻辑设备名(都叫”打印机”,各自映射到不同的物理设备),互不冲突。

这组对照与单级目录与两级目录的演进完全同构:一张全局表导致不允许重名,按用户分表才解决重名问题。

设备的两种编号

绝对号是系统为每台设备统一编的号,作为区分硬件、识别设备的代号。它由系统使用,用户程序不用。

相对号(用户设备号)是用户在自己的程序中定义的设备号,属于逻辑层面。

两者的关系正是设备独立性的另一种表述:用户用相对号,系统靠 LUT 把它换算成绝对号。

疑问点:设备统一编号的名称

  1. 将系统中的每台设备按某种原则统一进行编号,这些编号作为区分硬件和识别设备的代号,该编号称为设备的( )。 A. 绝对号 B. 相对号 C. 类型号 D. 符号

答案 A。

题干的三个关键词各自指向”绝对号”:“每台设备”说明编号是一台一个而非一类一个(排除 C 类型号);“统一进行编号”说明这是系统层面的全局行为(排除 B 相对号,相对号是用户自己在程序里定义的);“区分硬件和识别设备”说明它面向的是物理设备。

记法:“绝对”对应物理、系统、全局唯一;“相对”对应逻辑、用户、程序内部。

边界

设备独立性不等于”所有设备用起来都一样”

这是对这个名字最常见的误读。

设备独立性说的是”用户程序不依赖于具体是哪一台设备”,而不是”块设备和字符设备可以用同一套操作”。磁盘能 seek、键盘不能,这个差别永远存在,见 5.1.4 的三类接口。

准确表述:独立的是”哪一台”,不是”哪一类”。

逻辑设备表与文件系统的目录

两者做的是同一件事——把名字翻译成实体——但翻译的终点不同:

目录把文件名翻译成 FCB / inode,终点是文件的元数据。

LUT 把逻辑设备名翻译成物理设备名 + 驱动程序入口,终点是设备与驱动它的代码。

共同点是两者都实现了”按名存取”,都因此获得了位置无关性。 这也是 UNIX 能把设备做成 /dev 下的特殊文件、让两套命名合二为一的基础。

设备独立性软件与设备驱动程序的分工

5.1.3 那条判据在这里再用一次:换一台设备还成不成立。

“把逻辑名映射成物理名”这件事,换任何一台设备做法都一样(都是查 LUT),因此属于设备独立性软件。

“用这个驱动程序去操作这台设备”则完全取决于是哪台设备,因此属于驱动程序。

LUT 中的”驱动程序入口地址”这一项,恰好是两层的交接点:设备独立性软件查到它,然后把控制权交给驱动程序。

对照速查

设备独立性的三个好处
①方便用户编程(不必了解物理细节)
②不受具体机器环境限制(设备坏了系统可另选)
③便于程序移植
逻辑设备表 LUT 表项三项
逻辑设备名
物理设备名
设备驱动程序的入口地址
LUT 设置方式后果
整个系统一张不同进程不允许使用相同的逻辑设备名
每个用户一张不同用户可以使用相同的逻辑设备名
绝对号相对号
谁编的系统统一编用户在程序中定义
面向物理设备逻辑设备
谁使用系统用户程序

考点

  • 设备独立性 = 用户用逻辑设备名,系统转换为物理设备名
  • 三个好处:方便编程、不受机器环境限制、便于移植
  • LUT 三项,注意第三项是驱动程序入口地址
  • 一张 LUT 则不允许重名;每用户一张则允许重名
  • 绝对号由系统统一编、面向物理设备;相对号是用户程序里的逻辑号
  • 独立的是”哪一台”,不是”哪一类”

链接