Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1420416
  • 博文数量: 842
  • 博客积分: 12411
  • 博客等级: 上将
  • 技术积分: 5772
  • 用 户 组: 普通用户
  • 注册时间: 2011-06-14 14:43
文章分类

全部博文(842)

文章存档

2013年(157)

2012年(685)

分类: LINUX

2012-03-06 15:58:48

文件描述符相关 
一.文件系统。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就属于库函数。

阅读(1039) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~