Linux0.11笔记——进程的文件管理

Linux0.11笔记——进程的文件管理
    进程与文件的关系如上图所示,操作系统根据用户进程的需求来操作文件。
    

    文件系统中数据结构介绍

    Linux0.11中每个物理盘有一个引导块,通过引导块可以找到除去引导块的其他部分(从超级块到数据块的部分),该部分每个逻辑盘一个,而逻辑盘就是平常我们所说的分区。通过超级块可以找到i节点位图和逻辑块位图。i节点位图和逻辑块位图的每个bit分别表示一个i节点和逻辑块,空该位置0,被占用用则为1。
     *filp[20]掌控一个进程可以打开的文件,既可以是打开多个不同的文件,也可以是同一个文件的多次打开,该进程每打开一次文件(无论是否是同一个文件),都会在*filp[20]中占用一项。所以一个进程可以同时打开的文件次数不能超过20次。  

    file_table[64]是管理所有进程打开文件的数据结构,不但记录了不同进程打开不同的文件,也记录了不同进程打开同一个文件,甚至记录了同一个进程多次打开同一个文件。只要打开一次文件,就要在file_table[64]中记录。

    文件的i节点是记载文件属性最关键的数据结构。在操作系统中i节点和文件是一一对应的,找到i节点就能唯一确定文件。内核通过inode_table[32]掌控正在使用的文件i节点,同一个文件的多次打开也仅占用inode_table的一项。    

    打开文件过程介绍

    打开文件的本质就是建立*filp[20], file_table[64], inode_table[32]三者间的关系。    

    过程分为三个步骤:

    1、将用户进程task_struct中的*filp[20]与内核中的file_table[64]进行挂接。

    2、以用户给定的路径名如”/mnt/user/user1/hello.txt”为线索找到hello.txt文件的I节点。Linux中无论是目录还是具体的某个文件都有对应的i节点。因此解析路径名的过程为寻找i节点,通过i节点找到目录文件,通过目录文件找到目录项,通过目录项找到目录文件的i节点....最终找到hello.txt文件的i节点从而找到hello.txt文件。

    3、将hello.txt对应的i节点在file_table[64]中进行登记。

    绑定关系建立后,操作系统把fd(在file_table[64]中的偏移量)返回给用户进程作为文件句柄,以后进程只要把fd告诉操作系统,操作系统就可以找到对应文件的i节点。关系如下图所示:

    Linux0.11笔记——进程的文件管理

   i节点如何管理文件

    i节点通过i_zone结构来管理文件数据块的,i_zone结构如下图所示。

Linux0.11笔记——进程的文件管理

    i_zone[9]中记录着文件数据块内容的分布情况,但毕竟只有9个表项,文件数据块如果多于9个就不够用。

    为此Linux0.11中采取一种策略:

    1、当数据总量小于等于7KB时,i_zone[9]的前7个成员已经足够用了,直接记录这7个数据块的块号。

    2、当数据量大于7KB时,利用一级间接管理方案。i_zone[9]第8个成员记录一个数据块的块号,这个块中存储的是该文件后续512个数据块在外设中的逻辑块号,通过这些块号就可以找到相应的数据块。由于一个数据块大小为1024字节,而每个块号占用2字节,所以一个数据块最多能存储512个块号。这样一级间接管理最多能管理7+512个数据块(7+512KB)。

    3、当数据量大于7+512KB时,就要启动二级间接管理方案。让第9个成员记录512个索引块的块号,而这512个数据块中仍然存储的是索引块的块号,因此能够管理的极限是7+512+512*512个数据块。