文件系统中数据结构介绍
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节点。关系如下图所示:
i节点如何管理文件
i节点通过i_zone结构来管理文件数据块的,i_zone结构如下图所示。
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个数据块。