操作系统 :文件系统

1,405 阅读6分钟

在磁盘,内存中的文件系统

两个位置

在磁盘中

文件系统通常将文件数据放在不同的区块:

  • inode:记录文件的权限(rwx等)与属性(拥有者、用户组等),同时记录此文件的数据所有的数据区块号码。一个文件占用一个inode,innode中会有多个区块号码,同时由于文件大小问题,有多级区块号

  • 数据区块:实际记录文件内容的地方。若文件太大时,会占用多个区块

  • 超级区块:记录此文件系统的整体信息,包括inode与数据区块的总量、使用量、剩余量,自己文件系统的格式与相关信息等

在内存中

  • fd :文件描述符
  • file结构体是和inode的作用是不一样的,inode是更多的是存储文件的一些持久化的数据,比如大小,时间、属主,数据块位置等。inode是存在硬盘中的。在操作的文件的时候才会加载到内存。如果有修改,需要回写硬盘。file存储的是文件临时的元数据,他只存在内存里。比如一个文件当前读写位置,打开模式等等。关闭文件后就会丢失这些数据。
  • 在文件系统中,每一个文件都对应一个inode结构体。inode保存了一个文件的元数据,包括大小,时间,属主,块号等等。inode存在于硬盘和内存,内存的inode叫m_inode,他的部分属性和硬盘inode一一对应(硬盘inode叫d_inode),还有一些是只存在内存中的属性。

创建文件的过程

  1. 根据路径找到最后一级目录对应的inode节点。目录其实也是文件,他和一般文件的区别是,一般文件存储的是用户数据,目录文件存储的是文件信息。目录文件里存储的数据就是一个对象数组,每个元素保存了文件名和inode节点号。
// 目录项结构
struct dir_entry {
    // inode号
    unsigned short inode;
    // 文件名
    char name[NAME_LEN];
};

假设我们找/a/b/hello.txt这个文件。因为/是根文件系统的根路径,他在文件系统初始化的时候,根文件系统会从固定的位置(第一个inode节点),把他对应的inode结构体加载到内存中。我们根据根inode,就知道根目录下面有多少dir_entry,然后逐个比较找到目录a对应的dir_entry,从dir_entry中得到目录a的inode号,再根据a的inode号把inode结构体从硬盘中加载到内存,继续这个过程,直到最后找到hello.txt。

  1. 所以我们从一个目录下找一个目录或者文件的时候,其实就是遍历这个数组,对比name是否一样,是的话根据inode号取出inode结构体,从而取得文件数据。

  2. 因为我们是创建文件,所以是肯定找不到的。

  3. 上面已经解释过,一个文件对应一个inode。现在我们创建一个文件,那自然,我们就要先在硬盘中申请一个inode,并且修改文件系统的元数据inode位图,即这个inode被使用了。然后再在内存中申请一个m_inode。供用户操作文件的。至此,创建文件就完成了。我们发现,创建一个文件,底层发生的事情其实就是在硬盘申请一个inode就可以了。

  4. 当我们开始操作m_inode对应的文件的时候。比如写入。回归上面的inode结构体可以发现,这时候文件其实是没有被分配硬盘空间的。现在需要写入,那首先就要先在硬盘中申请一块空间。并修改块位图信息。然后申请一块和该硬盘块关联的内存块,用户写入的数据就存在该内存块中,系统会定时回写到硬盘中对应的块。

FCB:文件控制块,文件描述符

为了实现“按名存取”,系统必须为每个文件设置用于描述和控制文件的数据结构,它至少要包括文件名和存放文件的盘物理地址,这个数据结构称为文件控制块FCB,文件控制块的有序集合称为文件目录,即一个文件控制块FCB就是一个文件目录项。文件控制块FCB中包含的信息有以下三类:

  • 基本信息类 文件名:标识一个文件的符号名,在每个系统中文件必须具有唯一的名字。 文件的物理地址:这由于文件的物理结构不同而不同。对于连续文件就是文件的起始块号和文件总块数;对于MS-DOS是文件的起始簇号和文件总字节数;对于UNIX S V是文件所在设备的设备号、13个地址项、文件长度和文件块数等。
  • 存取控制信息类 文件的存取权限,象UNIX用户分成文件主、同组用户和一般用户三类,这三类用户的读写执行(RWX)的权限。
  • 使用信息类 文件建立日期、最后一次修改日期、最后一次访问的日期;当前使用的信息:打开文件的进程数,在文件上的等待队列等。文件控制块的信息因OS而不同。

FCB(文件描述符)与inonde的区别

原博客

FCBiNode
基本信息:如文件名、文件的物理位置、文件的逻辑结构、文件的物理结构等1. 文件描述信息
存取控制信息:如文件存取权限等2. i结点【在文件目录中的每个目录项仅由文件名和指向该文件所对应的i结点的指针构成】
使用信息:如文件建立时间、修改时间等
检索目录文件(FCB的集合)时只用到了文件名。仅当找到一个目录项时才需要从该目录项(FCB)中读出该文件的物理地址。即:检索目录时文件的其他描述信息用不到,也因此不必调入内存。那么我们是否可以考虑,把文件名和文件的描述信息(FCB-文件名)分开,文件的描述信息单独形成一个数据结构,这个被称作索引结点。简称为i结点。
这样就可以简化目录结构为:文件名对应i结点指针。
比如在UNIX系统中,文件目录项(FCB)占16B,其中14B是文件名,2B是i结点指针。
注意到设计i结点的设计思路是怎么得到的,就很容易理解FCB和i结点包含的信息大部分是相同的,i结点只是抽出了文件名。每个文件对应一个文件名,则一个文件也只要一个i结点。

文件目录由FCB(目录项)组成

  • FCB = 文件名 + inode
  • inode包含了文件物理地址信息
  • 物理地址信息的组成主要是主索引表