📄 linuxkernel.htm
字号:
<P ALIGN="JUSTIFY">PID TTY STAT TIME COMMAND</P>
<P ALIGN="JUSTIFY">158 pRe 1 0:00 -bash</P>
<P ALIGN="JUSTIFY">174 pRe 1 0:00 sh /usr/X11R6/bin/startx</P>
<P ALIGN="JUSTIFY">175 pRe 1 0:00 xinit /usr/X11R6/lib/X11/xinit/xinitrc --</P>
<P ALIGN="JUSTIFY">178 pRe 1 N 0:00 bowman</P>
<P ALIGN="JUSTIFY">182 pRe 1 N 0:01 rxvt -geometry 120x35 -fg white -bg black</P>
<P ALIGN="JUSTIFY">184 pRe 1 < 0:00 xclock -bg grey -geometry -1500-1500 -padding 0</P>
<P ALIGN="JUSTIFY">185 pRe 1 < 0:00 xload -bg grey -geometry -0-0 -label xload</P>
<P ALIGN="JUSTIFY">187 pp6 1 9:26 /bin/bash</P>
<P ALIGN="JUSTIFY">202 pRe 1 N 0:00 rxvt -geometry 120x35 -fg white -bg black</P>
<P ALIGN="JUSTIFY">203 ppc 2 0:00 /bin/bash</P>
<P ALIGN="JUSTIFY">1796 pRe 1 N 0:00 rxvt -geometry 120x35 -fg white -bg black</P>
<P ALIGN="JUSTIFY">1797 v06 1 0:00 /bin/bash</P>
<P ALIGN="JUSTIFY">3056 pp6 3 < 0:02 emacs intro/introduction.tex</P>
<P ALIGN="JUSTIFY">3270 pp6 3 0:00 ps</P>
<P ALIGN="JUSTIFY">$</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">如果我的系统拥有多个</FONT><FONT SIZE=3>CPU</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>那么每个进程可能(至少在理论上如此)都在不同的</FONT><FONT SIZE=3>CPU</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>上运行。不幸的是,只有一个,所以操作系统又使用技巧,在短时间内依次运行每一个进程。这个时间段叫做时间片。这种技巧叫做多进程或调度,它欺骗了每一个进程,好像它们是唯一的进程。进程相互之间受到保护,所以如果一个进程崩溃或不能工作,不会影响其他进程。操作系统通过给每一个进程一个独立的地址空间来实现保护,进程只能访问它自己的地址空间。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.2.3 Device Drivers</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>(设备驱动程序)</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">设备驱动程序组成了</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>核心的主要部分。象操作系统的其他部分一样,它们在一个高优先级的环境下工作,如果发生错误,可能会引发严重问题。设备驱动程序控制了操作系统和它控制的硬件设备之间的交互。比如:文件系统向</FONT><FONT SIZE=3>IDE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>磁盘写数据块是使用通用块设备接口。驱动程序控制细节,并处理和设备相关的部分。设备驱动程序和它驱动的具体的控制器芯片相关,所以,如果你的系统有一个</FONT><FONT SIZE=3>NCR810</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的</FONT><FONT SIZE=3>SCSI</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>控制器,那么你需要</FONT><FONT SIZE=3>NCR810</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的驱动程序。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.2.4 The Filesystems</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>(文件系统)</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">象</FONT><FONT SIZE=3>Unix</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>一样,在</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>里,系统对独立的文件系统不是用设备标示符来存取(比如驱动器编号或驱动器名称),而是连接成为一个树型结构。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>在安装新的文件系统时,把它安装到指定的安装目录,比如</FONT><FONT SIZE=3>/mnt/cdrom</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,从而合并到这个单一的文件系统树上。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的一个重要特征是它支持多种不同的文件系统。这使它非常灵活而且可以和其他操作系统良好共存。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>最常用的文件系统是</FONT><FONT SIZE=3>EXT2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,大多数</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>发布版都支持。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">文件系统将存放在系统硬盘上的文件和目录用可以理解的统一的形式提供给用户,让用户不必考虑文件系统的类型或底层物理设备的特性。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>透明的支持多种文件系统(如</FONT><FONT SIZE=3>MS-DOS</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>EXT2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>),将所有安装的文件和文件系统集合成为一个虚拟的文件系统。所以,用户和进程通常不需要确切知道所使用的文件所在的文件系统的类型,用就是了。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">块设备驱动程序掩盖了物理块设备类型的区别(如</FONT><FONT SIZE=3>IDE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>和</FONT><FONT SIZE=3>SCSI</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>)。对于文件系统来讲,物理设备就是线性的数据块的集合。不同设备的块大小可能不同,如软驱一般是</FONT><FONT SIZE=3>512</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>字节,而</FONT><FONT SIZE=3>IDE</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>设备通常是</FONT><FONT SIZE=3>1024</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>字节,同样,对于系统的用户,这些区别又被掩盖。</FONT><FONT SIZE=3>EXT2</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>文件系统不管它用什么设备,看起来都是一样的。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.3 Kernet Data Structures</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>(核心数据结构)</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">操作系统必须纪录关于系统当前状态的许多信息。如果系统中发生了事情,这些数据结构就必须相应改变以反映当前的实际情况。例如:用户登录到系统中的时候,需要创建一个新的进程。核心必须相应地创建表示此新进程的数据结构,并和表示系统中其他进程的数据结构联系在一起。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">这样的数据结构多数在物理内存中,而且只能由核心和它的子系统访问。数据结构包括数据和指针(其他数据结构或例程的地址)。乍一看,</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>核心所用的数据结构可能非常混乱。其实,每一个数据结构都有其目的,虽然有些数据结构在多个的子系统中都会用到,但是实际上它们比第一次看到时的感觉要简单的多。</P>
<P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">理解</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>核心的关键在于理解它的数据结构和核心处理这些数据结构所用到的大量的函数。本书以数据结构为基础描述</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>核心。论及每一个核心子系统的算法,处理的方式和它们对核心数据结构的使用。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.3.1 Linked Lists</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>(连接表)</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>使用一种软件工程技术将它的数据结构连接在一起。多数情况下它使用链表数据结构。如果每一个数据结构描述一个物体或者发生的事件的单一的实例,比如一个进程或一个网络设备,核心必须能够找出所有的实例。在链表中,根指针包括第一个数据结构或单元的地址,列表中的每一个数据结构包含指向列表下一个元素的指针。最后元素的下一个指针可能使</FONT><FONT SIZE=3>0</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>或</FONT><FONT SIZE=3>NULL</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>,表示这是列表的结尾。在双向链表结构中,每一个元素不仅包括列表中下一个元素的指针,还包括列表中前一个元素的指针。使用双向链表可以比较容易的在列表中间增加或删除元素,但是这需要更多的内存存取。这是典型的操作系统的两难情况:内存存取数还是</FONT><FONT SIZE=3>CPU</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>的周期数。</P>
<P ALIGN="JUSTIFY"> </P>
</FONT><FONT SIZE=3><P ALIGN="JUSTIFY">2.3.2 Hash Tables</P>
</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3><P ALIGN="JUSTIFY"> </P>
<P ALIGN="JUSTIFY">链接表是常用的数据结构,但是游历链接表的效率可能并不高。如果你要寻找指定的元素,</FONT><FONT SIZE=3> </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>可能必须查找完整个表才能找到。</FONT><FONT SIZE=3>Linux</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>使用另一种技术:</FONT><FONT SIZE=3>Hashing </FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>来解决这种局限。</FONT><FONT SIZE=3>Hash table</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>是指针的数组或者说向量表。数组或向量表是在内存中依次存放的对象。书架可以说是书的数组。数组用索引来访问,索引是数组中的偏移量。再来看书架的例子,你可以使用在书架上的位置来描述每一本书:比如第</FONT><FONT SIZE=3>5</FONT><FONT FACE="宋体" LANG="ZH-CN" SIZE=3>本书。</P>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -