《UNIX操作系统设计》讲述了UNIX系统的整体结构,如果对本书进行划分的话,这本书其实就讲了两个东西:文件系统,进程.UNIX系统也是由这两方面的内容组成.文件系统用户存储内容,而进程,则用于实现任务.
程序的本质是”数据结构 算法”,操作系统也不例外,UNIX的文件系统是由一系列的数据结构实现的,这些数据结构之间相互关联,实现文件的抽象表示,以及文件的操作管理.
一.文件系统.
1.三个表.
下面介绍内存中与文件相关的三个表:用户文件描述符表,文件表,索引节点表.三个表的关系为:用户文件描述符表中的每一项中,都指向文件表的某一项,同时,文件表中的每一项,也指向索引节点表的某一项.即:
用户文件描述符表 ---> 文件表 ---> 索引节点表
进程每次打开一个文件,系统就会在该进程的用户文件描述符表中分配一个相应的表项,表项的索引返回给该进程,用于标志该文件,找个索引就是常说的文件描述符.同理,在进程中如果复制一个文件的文件描述符,也会在表中分配一个项.用户文件描述符表是进程级的,每一个进程都有一个单独的用户文件描述符表.
文件表是一个全局性的结构,系统中每一个打开的文件都在表中占有一项,文件表中不同项代表的可能是同一文件(即指向索引节点表中的同一项).同理,用户文件描述符表中的不同项也可能指向同一文件表项,上面提到的文件描述符复制就属于这一情况,这种复制的一个典型案例就是子进程,子进程生成时,会复制父进程的所有文件描述符.
对文件系统而言,索引节点是最核心的内容,索引节点记录了文件的磁盘分布,以及文件所有者和存取权限.每个文件都对应唯一的一个索引节点,对文件的访问最终都会变为对索引节点的操作.在内存中有一个索引节点表,当进程对文件进行读取时,会将该文件的索引节点放到内存索引节点表中.
2.文件的内部表示.
(1)正规文件.前面的内容主要讲了如何标识一个文件及文件的不同状态.这节主要讲一下文件是如何存储在一个硬盘上的.
UNIX系统中,磁盘被分成了大小相同的块,同时文件也被分割成相应的块,存在磁盘块中,在这里,文件可以存放在不连续的磁盘块上.
每一个文件的索引节点中都包含一个地址明细表,该表记录了文件的存放地址.在UNIX中,该表含有13个项,其中前10项被成为直接索引,它们直接指向存放文件的磁盘块;后三项分别被成为一级间接索引、二级间接索引、三级间接索引,间接索引的意思指该项指向的不是存放文件的磁盘块,而是指向一个存放地址的磁盘块,该磁盘块存放的就是存放文件的磁盘块的地址(一级间接索引).设一个数据块的大小为N,每一个项的大小为m,则系统中可存放的最大文件为:
10N N*(N/m) N*(N/m)(N/m) N(N/m)(N/m)(N/m)
(2)目录文件. UNIX系统的理念是"把一切视为文件",因此在UNIX系统中,目录也是一种文件,也有相应的索引节点,只不过目录文件的内容是一系列的目录表项.每个目录表项包含两个内容:索引节点号,该目录下文件的文件名.系统进行路径名解析时,检查该目录的目录表项中是否有对应的子目录名称,如果有,则继续寻找下一目录,直到找到路径名的一项.
3.新文件的创建.
当系统创建一个新的文件时,系统会通过下面两个步骤完成对新文件的创建:分配索引节点,分配磁盘块.在系统中有一个超级块结构,里面存放系统中的空闲块表和空闲索引节点表,当为新创建的文件分配索引节点时,系统同过系统调用从超级块中寻找一个空闲索引节点分配给文件.磁盘块的分配与索引节点类型.
二.进程
1.进程结构
进程是一个动态的概念,是程序的执行过程.系统中的每个进程都包含三个字段:正文段,数据段,栈.在UNIX中,使用命令size可以查看每个可执行文件各段的大小.系统将这三个字段分成多个大小独立的区,每个区又被分为多个页.在进程中存在虚地址和物理地址两个概念,进程的各区对进程来说是以虚地址存在的,在每个进程中都存在一个本进程区表,当进程被装载到内存,该表记录分配给进程的每个区的内存区号.
系统中存在一个全局性的区表结构,每个在系统中活动的区对应于表中的一个表项,表项包含以下内容:指向文件索引节点的指针,区类型,区的大小和物理地址等.每个区中都包含一个页表,当进程进行物理地址映射时,会先计算需要计算的虚拟地址属于进程的哪个区,接着找到区表中相应的表项,然后通过虚地址的偏移量计算该地址对应的页表项,找到该页表项的物理地址.
每个进程都有一个私有u区,同时在系统中存在一个全局性的变量,称为u区变量,内存通过该变量来指向不同进程的u区,系统看起来只有一个u区(即运行进程的u区).这种机制实现了进程的上下文切换,使系统能同时运行多个进程(同一时间段内).
2.进程上下文
进程上下文是指当进程进行系统调用或其他原因进入内核态运行时,此时内核代表进程在内核空间中运行,把此时的内核空间的周围环境称为进程上下文.
进程上下文一般都三部分内容构成:用户级上下文 寄存器上下文 系统级上下文.当进程执行系统调用时,库函数执行一个成为”操作系统陷入”的指令,使系统由用户态转为核心态.库函数是用户程序和系统调用之间的媒介,用户进行系统调用时,调用相应的同名库函数,库函数传递给内核一个系统调用编号,内核根据该编号执行相应的系统调用.如果该调用需要参数,内核就将用户地址空间的相应参数拷贝到u区,内核从操作系统陷入返回时,返回到相应的库函数中,库函数再把结果返回给用户程序.程序中常用的open,close就属于库函数. 本文出自 “莫等老去,空怀念梦想” 博客,谢绝转载!
|