13.3.4 命名

操作系统使用的最长久的数据结构具有某种类型的名字或标识符,通过名字或标识符就可以引用这些数据结构。显而易见的例子有注册名、文件名、设备名、进程ID等。在操作系统的设计与实现中,如何构造和管理这些名字是一个重要的问题。

为人们的使用而设计的名字是ASCII或Unicode形式的字符串,并且通常是层次化的。目录路径,例如/usr/ast/books/mos2/chap-12,显然是层次化的,它指出从根目录开始搜索的一个目录序列。URL也是层次化的。例如,www.cs.vu.nl/~ast/表示一个特定国家(nl)的一所特定大学(vu)的一个特定的系(cs)内的一台特定的机器(www)。斜线号后面的部分指出的是目标机器上的一个特定的文件,在这种情形中,按照惯例,该文件是ast主目录中的www/index.html。注意URL(以及一般的DNS地址,包括电子邮件地址)是“反向的”,从树的底部开始并且向上走,这与文件名有所不同,后者从树的顶部开始并且向下走。看待这一问题的另一种方法是从头写这棵树是从左开始向右走,还是从右开始向左走。

命名经常在外部和内部两个层次上实现。例如,文件总是具有字符串名字供人们使用。此外,几乎总是存在一个内部名字由系统使用。在UNIX中,文件的实际名字是它的i节点号,在内部根本就不使用ASCII名字。实际上,它甚至不是惟一的,因为一个文件可能具有多个链接指向它。在Windows Vista中,相仿的内部名字是MFT中文件的索引。目录的任务是在外部名字和内部名字之间提供映射,如图13-4所示。

广告:个人专属 VPN,独立 IP,无限流量,多机房切换,还可以屏蔽广告和恶意软件,每月最低仅 5 美元

阅读 ‧ 电子书库
图 13-4 目录用来将外部名字映射到内部名字上

在许多情况下(例如上面给出的文件名的例子),内部名字是一个无符号整数,用作进入一个内部表格的索引。表格-索引名字的其他例子还有UNIX中的文件描述符和Windows Vista中的对象句柄。注意这些都没有任何外部表示,它们严格地被系统和运行的进程所使用。一般而言,对于当系统重新启动时就会丢失的暂时的名字,使用表格索引是一个很好的主意。

操作系统经常支持多个名字空间,既在内部又在外部。例如,在第11章我们了解了Windows Vista支持的三个外部名字空间:文件名、对象名和注册表名(并且还有我们没有考虑的活动目录名)。此外,还存在着使用无符号整数的数不清的内部名字空间,例如对象句柄、MFT项等。尽管外部名字空间中的名字都是Unicode字符串,但是在注册表中查寻一个文件名是不可以的,正如在对象表中使用MFT索引是不可以的。在一个良好的设计中,相当多的考虑花在了需要多少个名字空间,每个名字空间中名字的语法是什么,怎样分辨它们,是否存在抽象的和相对的名字,如此等等。