一、体系结构
二、系统核心框图
UNIX系统使人感觉到文件系统有“位置”而进程有“生命”。文件和进程这两类实体是UNIX系统模型中的两个中心概念。
三、文件子系统
一个文件的内部表示由一个索引节点给出,索引节点描述了文件数据在硬盘上的布局,并且包含诸如文件所有者、存取许可权及存取时间等其他信息。索引节点被存储在文件系统中,当操纵文件时,核心把它们读到内存的索引节点表中。
核心还包含文件表和用户文件描述符表。文件表是一个全程核心结构,保存着文件中的字节偏移量和对打开的进程所允许的存取权限。用户文件描述符表对每个进程分配一个,当一个进程打开或建立一个文件时,贺欣在每个表中都相应于该文件的索引节点分配一个表项。
一个文件系统具有如下结构:1,引导块占据文件系统的开头,典型地,是一个扇区。它可以含有被读入机器中起引导或初启操作系统作用的引导代码。2,超级块描述了文件系统的状态--它有多大,它能储存多少文件,在文件系统的何处可找到空闲空间,以及其他信息。3,索引节点表是一张索引节点的表,它在文件系统中跟在超级块的后面,当配置一个文件系统时,管理人员应指明索引节点表的大小。有一个索引节点是文件系统的根索引节点,在执行mount后,该文件系统的目录结构就可以从这个根索引节点开始进行存取了。4,数据块在索引节点表结构结束后开始,并且包含文件数据与管理数据。
四、进程
一个进程是一个程序的执行,它是由一系列有格式字节组成的,这些有格式字节被解释成机器指令(“正文”),数据和栈。一个进程循着一个严格的指令序列执行,这个指令序列是自包含的,并且不跳转到别的进程的指令序列上,它读、写自己的数据和栈区,但它不能读或写其他进程的数据和栈,通过系统调用于其他进程及外界进行通信。
可执行文件由以下几部分组成:1,描述文件属性的一组“头标”;2,程序正文;3,数据的机器语言表示,它给出程序开始执行时的初值;一个空间指示,指出核心应该被称为bss(block started by symbol)的未初始化数据分配多大的空间;4,其他段,诸如符号表信息。
在系统调用exec期间,核心把一个可执行文件装入主存中,被装入的进程至少由正文区、数据区及栈区的三部分组成。正文区和数据区相应于可执行文件的正文段和数据bss段。但是栈区是自动创建的,而且它的大小在运行期间是被核心动态调节的。栈由逻辑栈桢组成,当调用一个函数时栈桢被压入,当返回时栈桢被弹出。一个称为栈指针的特殊寄存器指示出当前栈深度。一个栈桢包含着用于函数调用的参数、它的逻辑变量及为恢复先前的栈桢所需要的数据--其中包括函数调用时程序计数器的值及栈指针的值。程序代码包含管理栈增长的指令序列,并且当需要时核心为栈分配空间。
UNIX系统中核心栈与用户栈是分开的。用户栈含有在用户态下执行时函数调用的参数、局部变量及其他数据。核心栈中含有在核心态下执行的函数的栈桢。核心蘸上的函数及数据项涉及的是核心中的而不是用户程序中的函数和数据,但它的构成与用户栈的构成相同。当一个程序在用户态下执行时,它的核心栈为空的。
每个进程在核心进程表中都有一个登记项,并且每个进程都被分配一个u区(ublock),u区包含仅被核心操纵的私有数据。进程表指向一个本进程区表,本进程区表的登记项指向区表中的登记项。一个区是进程地址空间中的连续的区域,如正文区、数据区及栈区等。区表登记项描述区的属性,诸如它是否包含正文或数据,它是共享的还是私用的,以及区的“数据”位于主存的何处,等等。进程表登记项及u区包含进程的控制信息和状态信息。核心能直接存取正在执行的进程的u区的字段,但不能存取其他的进程的u区字段。
一个进程的上下文包括被进程正文所定义的进程状态,进程的全程用户变量和数据结构的值,它使用的机器寄存器的值,存储在它的进程表项与u区的值以及它的用户栈和核心栈的内容。当执行一个进程时,系统被说成在该进程的上下文中执行。当核心决定它应该执行另一个进程时,它做一个上下文切换以使系统在另一个进程的上下文中执行。
一个进程的生存周期能被划分为一组状态。每个状态都具有一定的用来描述该进程的特点。诸进程按照明确定义的规则连续地在各种状态间移动。这个规则如下图所示,也称为状态转换图。
在核心态下运行的进程不能被其他进程所抢占。核心通过仅当一个进程使自己进入睡眠时才允许上下文切换,以及通过禁止一个进程改变另一个进程的状态来保护它的一致性。它还在代码临界区周围提高处理机执行级,以封锁其他能引起非一致性的中断。进程调度程序定期地抢占用户态下的进程执行,以使进程不能垄断CPU的使用。
进程会因为它们正在等待某些事件的发生而进入睡眠。诸如:等待来自外围设备的I/O完成;等待一个进程退出;等待获得系统资源等。当一个进程被换行时,它完成一个从“睡眠”状态到“就绪”状态的状态转换,对于随后的调用来说,该进程是个合格者了,但它并不立即执行。核心并不时经常地去查看一个进程是否仍处于睡眠状态,而是等待事件的发生,那时把进程唤醒。
大多数核心数据结构都占据固定长度的表而不是动态地分配空间,这一方法的优点是核心代码简单。
管理进程可非严格地归入为用户团体的公共福利提供各种功能的那类进程,包括磁盘格式化、新文件系统的创建、修复被破坏的文件系统、核心调试及其他。它们仅在被允许的权限与特权上区别于一般用户进程。