2.2.4 The Filesystems (文档系统)
象 Unix 相同,在 Linux 里,系统对单独的文档系统不是用设备标示符来存取(比如驱动器编号或驱动器名称),而是连接成为一个树型结构。 Linux 在安装新的文档系统时,把他安装到指定的安装目录,比如 /mnt/cdrom ,从而合并到这个单一的文档系统树上。 Linux 的一个重要特征是他支持多种不同的文档系统。这使他很灵活而且能够和其他操作系统良好共存。 Linux 最常用的文档系统是 EXT2 ,大多数 Linux 发布版都支持。
文档系统将存放在系统硬盘上的文档和目录用能够理解的统一的形式提供给用户,让用户不必考虑文档系统的类型或底层物理设备的特性。 Linux 透明的支持多种文档系统(如 MS-DOS 和 EXT2 ),将任何安装的文档和文档系统集合成为一个虚拟的文档系统。所以,用户和进程通常无需确切知道所使用的文档所在的文档系统的类型,用就是了。
块设备驱动程式掩盖了物理块设备类型的区别(如 IDE 和 SCSI )。对于文档系统来讲,物理设备就是线性的数据块的集合。不同设备的块大小可能不同,如软驱一般是 512 字节,而 IDE 设备通常是 1024 字节,同样,对于系统的用户,这些区别又被掩盖。 EXT2 文档系统不管他用什么设备,看起来都是相同的。
2.3 Kernet Data Structures (核心数据结构)
操作系统必须纪录关于系统当前状态的许多信息。假如系统中发生了事情,这些数据结构就必须相应改变以反映当前的实际情况。例如:用户登录到系统中的时候,需要创建一个新的进程。核心必须相应地创建表示此新进程的数据结构,并和表示系统中其他进程的数据结构联系在一起。
这样的数据结构多数在物理内存中,而且只能由核心和他的子系统访问。数据结构包括数据和指针(其他数据结构或例程的地址)。乍一看, Linux 核心所用的数据结构可能很混乱。其实,每一个数据结构都有其目的,虽然有些数据结构在多个的子系统中都会用到,但是实际上他们比第一次看到时的感觉要简单的多。
理解 Linux 核心的关键在于理解他的数据结构和核心处理这些数据结构所用到的大量的函数。本书以数据结构为基础描述 Linux 核心。论及每一个核心子系统的算法,处理的方式和他们对核心数据结构的使用。
2.3.1 Linked Lists (连接表)
Linux 使用一种软件工程技术将他的数据结构连接在一起。多数情况下他使用链表数据结构。假如每一个数据结构描述一个物体或发生的事件的单一的实例,比如一个进程或一个网络设备,核心必须能够找出任何的实例。在链表中,根指针包括第一个数据结构或单元的地址,列表中的每一个数据结构包含指向列表下一个元素的指针。最后元素的下一个指针可能使 0 或 NULL ,表示这是列表的结尾。在双向链表结构中,每一个元素不但包括列表中下一个元素的指针,还包括列表中前一个元素的指针。使用双向链表能够比较容易的在列表中间增加或删除元素,但是这需要更多的内存存取。这是典型的操作系统的两难情况:内存存取数还是 CPU 的周期数。
2.3.2 Hash Tables
链接表是常用的数据结构,但是游历链接表的效率可能并不高。假如您要寻找指定的元素, 可能必须查找完整个表才能找到。 Linux 使用另一种技术: Hashing 来解决这种局限。 Hash table 是指针的数组或说向量表。数组或向量表是在内存中依次存放的对象。书架能够说是书的数组。数组用索引来访问,索引是数组中的偏移量。再来看书架的例子,您能够使用在书架上的位置来描述每一本书:比如第 5 本书。
Hash table 是个指向数据结构的指针的数组,他的索引来源于数据结构中的信息。假如您用一个数据结构来描述一个村庄的人口,您能够用年龄作为索引。要找出一个指定的人的数据,您能够用他的年龄作为索引在人口散列表中查找,通过指针找到包括周详信息的数据结构。不幸的是,一个村庄中可能很多人年龄相同,所以散列表的指针指向另一个链表数据结构,每一个元素描述同龄人。即使这样,查找这些较小的链表仍然比查找任何的数据结构要快。
Hash table 可用于加速常用的数据结构的访问,在 Linux 里常用 hash table 来实现缓冲。缓冲是需要快速存取的信息,是全部可用信息的一个子集。数据结构被放在缓冲区并保留在那里,因为核心经常访问这些结构。使用缓冲区也有副作用,因为使用起来比简单链表或散列表更加复杂。假如数据结构能够在缓冲区找到(这叫做缓冲命中),那么一切很完美。但是假如数据结构不在缓冲区中,那么必须查找所用的相关的数据结构,假如找到,那么就加到缓冲区中。增加新的数据结构到缓冲区中可能需要废弃一个旧的缓冲入口。 Linux 必须决定废弃那一个数据结构,风险在于废弃的可能使 Linux 下一个要访问的数据结构。
2.3.3 Abstract Interfaces (抽象接口)
Linux 核心经常将他的接口抽象化。接口是以特定方式工作的一系列例程和数据结构。比如:任何的网络设备驱动程式都必须提供特定的例程来处理特定的数据结构。用抽象接口的方式能够用通用的代码层来使用底层特别代码提供的服务(接口)。例如网络层是通用的,而他由底层符合标准接口的同设备相关的代码提供支持。
通常这些底层在启动时向高一层登记。这个登记过程常通过在链接表中增加一个数据结构来实现。例如,每一个连结到核心的文档系统在核心启动时进行登记(或假如您使用模块,在文档系统第一次使用时向核心登记)。您能够查看文档 /proc/filesystems 来检查那些文档系统进行了登记。登记所用的数据结构通常包括指向函数的指针。这是执行特定任务的软件函数的地址。再一次用文档系统登记的例子,每一个文档系统登记时传递给 Linux 核心的数据结构都包括一个和具体文档系统相关的例程地址,在安装文档系统时必须调用。
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!




