📄 00000003.htm
字号:
去。由于有另外一个技巧:多处理的存在,这些软件更加感觉不到系统中真实内存的 <BR>大小。 <BR> <BR>2.2.2 进程 <BR> <BR>进程可以认为是处于执行状态的程序,每个进程有一个特定的程序实体。观察以下 <BR>Linux系统中的进程,你会发现有比你想象的要多得多的进程存在。比如,在我的系 <BR>统中敲入ps命令,将得到以下结果: <BR> <BR>$ ps <BR> PID TTY STAT TIME COMMAND <BR> 158 pRe 1 0:00 -bash <BR> 174 pRe 1 0:00 sh /usr/X11R6/bin/startx <BR> 175 pRe 1 0:00 xinit /usr/X11R6/lib/X11/xinit/xinitrc -- <BR> 178 pRe 1 N 0:00 bowman <BR> 182 pRe 1 N 0:01 rxvt -geometry 120x35 -fg white -bg black <BR> 184 pRe 1 < 0:00 xclock -bg grey -geometry -1500-1500 -padding 0 <BR> 185 pRe 1 < 0:00 xload -bg grey -geometry -0-0 -label xload <BR> 187 pp6 1 9:26 /bin/bash <BR> 202 pRe 1 N 0:00 rxvt -geometry 120x35 -fg white -bg black <BR> 203 ppc 2 0:00 /bin/bash <BR> 1796 pRe 1 N 0:00 rxvt -geometry 120x35 -fg white -bg black <BR> 1797 v06 1 0:00 /bin/bash <BR> 3056 pp6 3 < 0:02 emacs intro/introduction.tex <BR> 3270 pp6 3 0:00 ps <BR>$ <BR> <BR>如果系统有许多个CPU,则每个进程可以运行在不同的CPU上。不幸的是,大多数系 <BR>统中只有一个CPU。这样操作系统将轮流运行几个程序以产生它们在同时运行的假 <BR>象。这种方式叫时间片轮转。同时这种方法还骗过了进程使它们都认为只有自己在 <BR>运行。进程之间被隔离开,以便某个进程崩溃或者误操作不会影响到别的进程。操 <BR>作系统通过为每个进程提供分立的地址空间来作到这一点。 <BR> <BR>2.2.3 设备驱动 <BR> <BR>设备驱动组成了Linux核心的主要部分。象操作系统的其他部分一样,它们运行在 <BR>高权限环境中且一旦出错将引起灾难性后果。设备驱动控制操作系统和硬件设备 <BR>之间的相互操作。例如当文件系统通过使用通用块设备接口来对IDE磁盘写入数据 <BR>块。设备驱动负责处理所有设备相关细节。设备驱动与特定的控制器芯片有关, <BR>如果系统中有一个NCR810 SCSI控制卡则需要有NCR810 SCSI的驱动程序。 <BR> <BR>2.2.4 文件系统 <BR> <BR>Linux和Unix一样,系统中的独立文件系统不是通过设备标志符来访问,而是通过 <BR>表示文件系统的层次树结构来访问。当Linux添加一个新的文件系统到系统中时, <BR>会将它mount到一个目录下,比如说/mnt/cdrom。 <BR>Linux的一个重要特征就是支持多种文件系统。这使得它非常灵活并且可与其他操 <BR>作系统并存。Linux中最常用的文件系统是EXT2文件系统,它在大多数Linux分发版 <BR>本中都得到了支持。 <BR>文件系统提供给用户一个关于系统的硬盘上文件和目录的总体映象,而不管文件的 <BR>类型和底层物理设备的特性。 <BR>Linux透明地支持多种文件系统并将当前安装的所有文件和文件系统集成到虚拟文 <BR>件系统中去。所以,用户和进程一般都不知道某个文件位于哪种文件系统中,他们 <BR>只是使用它。 <BR>块设备驱动将物理块设备类型(例如IDE和SCSI)和文件系统中的差别隐藏起来, <BR>物理设备只是数据块的线性存储集合。设备的不同导致块大小的不同,从软盘设 <BR>备的512字节到IDE磁盘的1024字节。这些都隐藏了起来,对系统用户来说这都是 <BR>不可见的。不管设备类型如何,EXT2文件系统看起来总是一样。 <BR> <BR>2.3 核心数据结构 <BR> <BR>操作系统可能包含许多关于系统当前状态的信息。当系统发生变化时,这些数据结 <BR>构必须做相应的改变以反映这些情况。例如,当用户登录进系统时将产生一个新的 <BR>进程。核心必须创建表示新进程的数据结构,同时将它和系统中其他进程的数据结 <BR>构连接在一起。 <BR>大多数数据结构存在于物理内存中并只能由核心或者其子系统来访问。数据结构包 <BR>括数据和指针;还有其他数据结构的地址或者子程序的地址。它们混在一起让Linux <BR>核心数据结构看上去非常混乱。尽管可能被几个核心子系统同时用到,每个数据结 <BR>构都有其专门的用途。理解Linux核心的关键是理解它的数据结构以及Linux核心中 <BR>操纵这些数据结构的各种函数。本书把Linux核心的描叙重点放在数据结构上,主 <BR>要讨论每个核心子系统的算法,完成任务的途径以及对核心数据结构的使用。 <BR> <BR>2.3.1 连接列表 <BR> <BR>Linux使用的许多软件工程的技术来连接它的数据结构。在许多场合下,它使用 <BR>linked或者chained数据结构。每个数据结构描叙某一事物,比如某个进程或网络 <BR>设备,核心必须能够访问到所有这些结构。在链表结构中,个根节点指针包含第一 <BR>个结构的地址,而在每个结构中又包含表中下一个结构的指针。表的最后一项必须 <BR>是0或者NULL,以表明这是表的尾部。在双向链表中,每个结构包含着指向表中前 <BR>一结构和后一结构的指针。使用双向链表的好处在于更容易在表的中部添加与删除 <BR>节点,但需要更多的内存操作。这是一种典型的操作系统开销与CPU循环之间的折中。 <BR> <BR>2.3.2 散列表 <BR> <BR>链表用来连接数据结构比较方便,但链表的操作效率不高。如果要搜寻某个特定内 <BR>容,我们可能不得不遍历整个链表。Linux使用另外一种技术:散列表来提高效率。 <BR>散列表是指针的数组或向量,指向内存中连续的相邻数据集合。散列表中每个指针 <BR>元素指向一个独立链表。如果你使用数据结构来描叙村子里的人,则你可以使用年 <BR>龄作为索引。为了找到某个人的数据,可以在人口散列表中使用年龄作为索引,找 <BR>到包含此人特定数据的数据结构。但是在村子里有很多人的年龄相同,这样散列表 <BR>指针变成了一个指向具有相同年龄的人数据链表的指针。搜索这个小链表的速度显 <BR>然要比搜索整个数据链表快得多。 <BR>由于散列表加快了对数据结构的访问速度,Linux经常使用它来实现Caches。Caches <BR>是保存经常访问的信息的子集。经常被核心使用的数据结构将被放入Cache中保存。 <BR>Caches的缺点是比使用和维护单一链表和散列表更复杂。寻找某个数据结构时,如 <BR>果在Cache中能够找到(这种情况称为cache命中),这的确很不错。但是如果没有 <BR>找到,则必须找出它,并且添加到Cache中去。如果Cache空间已经用完则Linux必 <BR>须决定哪一个结构将从其中抛弃,但是有可能这个要抛弃的数据就是Linux下次要 <BR>使用的数据。 <BR> <BR>2.3.3 抽象接口 <BR> <BR>Linux核心常将其接口抽象出来。接口指一组以特定方式执行的子程序和数据结构的 <BR>集合。例如,所有的网络设备驱动必须提供对某些特定数据结构进行操作的子程序。 <BR>通用代码可能会使用底层的某些代码。例如网络层代码是通用的,它得到遵循标准 <BR>接口的特定设备相关代码的支持。 <BR>通常在系统启动时,底层接口向更高层接口注册(Register)自身。这些注册操作包 <BR>括向链表中加入结构节点。例如,构造进核心的每个文件系统在系统启动时将其自 <BR>身向核心注册。文件/proc/filesysems中可以看到已经向核心注册过的文件系统。 <BR>注册数据结构通常包括指向函数的指针,以文件系统注册为例,它向Linux核心注册 <BR>时必须将那些mount文件系统连接时使用的一些相关函数的地址传入。 <BR> <BR>-- <BR>※ 来源:·BBS 水木清华站 bbs.net.tsinghua.edu.cn·[FROM: 202.114.2.2] <BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -