目录

一、文件系统的层次模型

1、层次模型图示

 2、文件系统模型可以划分为三个层次

 3、文件存在两种形式的结构

(1)逻辑结构

(2)物理结构

4、 文件的存储空间管理

二、目录管理 

1、文件控制块FCB

2、索引节点

3、文件目录(目录文件)

4、BFD:基本文件目录表

5、SFD:符号文件目录表

三、 Linux中的文件系统

1、Linux系统的一级目录

2、Linux中采用文件存取控制表

3、 Linux采用两层结构

4、 文件系统操作的系统调用界面图

四、 Linux文件系统中的对象

1、超块对象

2、inode对象

3、file对象

4、dentry对象

5、查看文件的i节点信息

6、Linux文件系统中的缓冲区

五、Linux系统中的目录管理

1、Linux系统中的磁盘块管理

2、空闲盘块的组织

3、Linux中的文件访问 

4、Linux对i节点的管理 

 六、 Linux系统中的文件操作

1、Linux系统中的文件操作

2、文件分配过程

3、文件回收过程

4、 检索目录

一、文件系统的层次模型

1、层次模型图示

 2、文件系统模型可以划分为三个层次

(1)最高层是文件系统提供给用户的接口(GUI、cmd、System Call)。
(2)中间层是对对象进行操作和管理的软件集合(文件存储空间的管理,文件目录管理,地址转换,文件读写管理,文件的共享与保护。)
(3)最底层是对象(文件、目录、磁盘空间)及其属性。

 3、文件存在两种形式的结构

(1)逻辑结构

  • 流式文件(非记录文件):指文件中的数据是由一串字节组成的信息流序列,即字节流文件(是一种无结构的文件)。
  • 记录式文件:是一种有结构的文件,有若干逻辑记录信息所组成的记录流文件。
  • 文件的存取方法:顺序存取,直接存取(随机存取),索引存取(按键存取)。

(2)物理结构

  • 连续文件:把逻辑文件中的信息顺序地存储到连续的物理盘块中。文件的说明信息包括文件的起始块号和块的个数。不利于文件的动态变化。
  • 串连文件:用链接指针将存放文件信息的离散的物理盘块链接成一个队列。文件的长度可以动态变化,但是对文件记录的访问效率较低。
  • 索引文件:给每个文件分配一个索引表,记录每个记录的物理块。可以采用多级索引。

4、 文件的存储空间管理

  • (1) 空闲区表法
  • (2)空闲链表法
  • (3)位示图法
  • (4) 成组链接法

二、目录管理 

从管理角度看,一个文件包括两部分:文件体文件控制块

1、文件控制块FCB

文件控制块(FCB):包括文件名、物理地址、逻辑结构、物理结构、存取控制信息及使用信息等。

2、索引节点

文件名文件描述信息分开。

使文件描述信息单独形成一个称为索引节点的数据结构,简称i-节点。

3、文件目录(目录文件)

文件目录中的每个目录项,仅由文件名及指向该文件所对应的i-节点的指针所构成。

4、BFD:基本文件目录表

文件系统中提供所有文件的基本文件目录表,存放除了文件名之外的文件说明信息和文件标识符ID。

5、SFD:符号文件目录表

存放文件名和文件标识符ID;

赋予BFD、空闲文件目录、主目录MFD的符号文件目录固定不变的标识符。

目录文件同样存储在外设中。为提高访问效率,将部分目录文件复制到内存中。

  • 打开文件:把该文件外存中的目录文件及i节点复制到内存中。
  • 关闭文件:在内存中删除该文件的目录文件和i节点。
  • 活动文件:在内存中为每个用户设置一张表,来存放该用户打开文件的SFD。
  • 活动BFD表:整个系统设置一张所有打开文件的BFD。

不同用户共同使用一个文件,以减少系统复制文件的开销。

采用链接方法:链接到目录中的共享文件。

三、 Linux中的文件系统

1、Linux系统的一级目录

  • /bin 存放系统常用命令
  • /sbin 存放系统管理员用的管理程序
  • /boot 存放启动时用的核心文件
  • /dev 存放所有的外设文件
  • /mnt 系统提供的临时挂载点
  • /etc 存放所有系统管理和配置文件
  • /proc 是个虚拟目录,是系统内存映射,可以直接获得系统信息
  • /lib 存放动态链接库
  • /var 存放经常修改的文件,如日志文件
  • /usr 存放用户使用的命令、程序、文档等
  • /tmp 存放临时文件
  • /root 系统管理员的主目录
  • /home 是用户的主目录
  • /lost+found 存放一些恢复文件

2、Linux中采用文件存取控制表

  • 用10比特表示每个文件的属性。
  • 第1位:“-”表示普通文件;“d”表示目录文件;“l”符号链接文件;“b/c”表示设备文件。
  • 第2~4位:表示文件主对文件的存取权限;
  • 第5~7位:表示同组用户对文件的存取权限;
  • 第8~10位:表示其他对文件的存取权限;
  • r表示可读,w表示可写,x表示可执行。

3、 Linux采用两层结构

  • 第一层是虚拟文件系统VFS,把各种实际文件系统的公共结构抽象出来,建立统一的以inode为中心的组织结构,为实际的文件系统提供兼容性。包括超级块(super block)和inode。
  • 第二层是linux支持的各种实际文件系统。

4、 文件系统操作的系统调用界面图

  • VFS记录可用的文件系统的类型;
  • 把设备与对应的文件系统联系起来;
  • 处理一些面向文件的通用操作;
  • 涉及针对具体文件系统的操作时,把它们映射到与控制文件、目录文件及inode相关的物理文件系统。
  • 建立文件系统:一个分区或磁盘能作为文件系统使用前,需要初始化,并将记录数据结构写到磁盘上。
  • VFS只存在内存中,在系统启动时产生,在系统关闭时注销 。

四、 Linux文件系统中的对象

1、超块对象

存储一个已加载的文件系统的信息。对于基于磁盘的文件系统,这个对象与一个存储在磁盘上的文件系统的控制块对应。

2、inode对象

存储一个特定文件系统中文件的通用信息。包含在这个文件系统中的文件标识符。

3、file对象

存储在进程和打开的文件之间的互动信息。该对象只在进程打开这个文件时在内存中存在。

4、dentry对象

存储与该文件对应的目录项的链接信息。磁盘中也有该文件系统目录项的相关信息。

5、查看文件的i节点信息

命令:stat filename【文件名】

例:stat  f1

硬链接文件和软连接文件: 

   

6、Linux文件系统中的缓冲区

  • Inode cache:用于inode的申请和释放;
  • Dentry cache:用于查找目录文件的i节点;
  • Page cache:磁盘文件数据的读写;
  • Buffer cache:I/O设备读写;
  • Swap cache:页面写出到交换空间。

五、Linux系统中的目录管理

1、Linux系统中的磁盘块管理

       LINUX中,把每个磁盘(带)看作是一个文件卷,每个文件卷上可存放一个具有独立目录结构的文件系统。一个文件卷包含许多物理块,并按块号排列。

0# 1# 2# 3# ……K# K+1# ……N#

  • 0#块用于系统引导或空闲,
  • 1#为超级块(superblock),存放文件卷的资源管理信息,如整个文件卷的盘块数、磁盘索引结点的盘块数、空闲盘块号栈及指针等。
  •  2#~K#存放磁盘索引结点。每个索引结点64B,
  •  第K+1#~N#存放文件数据。

2、空闲盘块的组织

     采用成组链接法组织空闲盘块。

3、Linux中的文件访问 

(1)

  •        LINUX采用多级索引文件结构形式,通过i节点中的索引指针,直接或间接地指出该文件存放的物理盘块号。
  •        查找文件时,只需找到该文件的索引结点,便可采用直接或间接的寻址方式获得指定文件的盘块。
  •        可将逻辑文件的字节偏移量转换为文件的物理块号。先将字节偏移量转换为文件逻辑块号及块内偏移量,再把逻辑块号转换为文件的物理块号。

(2)

  • 每个进程的tusk_struct中设置一张用户文件描述符表(ASFD)
  • 只在首次打开文件时才需给出路径名。
  •  内核在该进程的用户文件描述符表中,分配一空项,取其在该表中的位移量作为文件描述符fd(file discriptor)返还给用户。
  • 当用户再次访问该文件时,只需提供fd,系统根据fd便可找到相应文件的内存索引结点。

    (3) 

            为了方便用户对文件进行读/写及共享,系统中设置了一张文件表(ABFD)。每个用户在打开文件时,都要在文件表中获得一表项,其中包含下述内容:

        f.flag:文件标志,指示该文件打开是为了读或写;

        f.inode:指向打开文件的内存索引结点指针;

        f.offset:文件读写指针偏移值;

        f.count:文件引用计数。

4、Linux对i节点的管理 

  •        每个文件都有一个唯一的磁盘索引结点(di_node)。
  •        文件被打开后,还有一个内存索引结点(i_node)。

       创建一新文件时,就为之建立一个磁盘索引结点,以将文件的有关信息记入其中,并将用户提供的文件名和磁盘索引结点号一并组成一个新目录项,记入其父目录文件中。

       文件被撤消时,系统要回收该文件的磁盘索引结点,从其父目录中删除该目录项。随着文件的打开与关闭,系统还要为之分配和回收内存索引结点。

    文件模式,可以是正规文件、目录文件、字符特别文件、块特别文件和管道文件等几种;

        文件被打开后,系统为它在内存索引结点表区中建一内存索引结点,以方便用户和系统对文件的访问。其中,一部分信息是直接从磁盘索引结点拷贝过来的,如i_mode、i_uid、i_gid、i_size、i_addr、i_nlink等,并又增加了如下各信息:

  •          索引结点编号i_number,作为内存索引结点的标识符;
  •          状态i_flag,指示内存索引结点是否已上锁、是否有进程等待此i结点解锁、i结点是否被修改、是否有最近被访问等标志;
  •          引用计数i_count,记录当前有几个进程正在访问此i结点,每当有进程访问此i结点时,对i_count+1,退出-1;
  •         设备号i_dev,文件所属文件系统的逻辑设备号;
  •          前向指针i_forw,Hash队列的前向指针;
  •          后向指针i_back,Hash队列的后向指针。

 六、 Linux系统中的文件操作

1、Linux系统中的文件操作

       (1)当内核创建一新文件时,要为之分配一空闲磁盘i节点,其过程如下:

  •    检查超级块上锁否。由于超级块是临界资源,诸进程必须互斥地访问它,要先检查它是否已上锁,若是则睡眠等待;
  •    检查i节点栈空否。若i节点栈中已无空闲节点编号,则应从盘中再调入一批i节点号进栈。若盘中已无空闲i节点,则出错处理,返回;
  •    从空闲i节点编号栈中分配一i节点,并对它初始化、填写有关文件的属性;
  •    分配内存i节点;
  •    将磁盘i节点总数-1,置超级块修改标志,返回。

    (2) 当删除文件时,应回收其所占用的盘块及相应的磁盘i节点。具体有:

  • 检查超级块上锁否。若是,直接返回,即不把本次回收的i节点号记入空闲i节点编号栈中;
  • 检查i节点编号栈满否。若已满,无法再装入新回收的i节点号,立即返回,若未满,便将回收的i节点编号进栈,并使当前空闲节点数+1;
  • 置超级块修改标志,返回。

2、文件分配过程

       由于允许文件被共享,因此,如果一文件已被其他用户打开并有了内存i节点,则此时只需将i节点中的引用计数+1。

       如果文件尚未被任何用户(进程)打开,则由分配过程为该文件分配一内存i节点,并调用读磁盘过程将其磁盘i节点的内容拷贝到内存i节点中并进行初始化。

3、文件回收过程

       进程要关闭某文件时,须调用文件回收过程,先对该文件内存i节点中的引用计数-1。若结果为0,便回收该内存i节点,再对该文件的磁盘i节点中的连接计数减1,若其结果也为0,便删除此文件,并回收分配给该文件的盘块和磁盘i节点 。

文件系统的一个基本功能是实现按名存取,它通过文件目录来实现。

       必须使每一个文件都在文件目录中有一个目录项,通过查找文件目录可找到该文件的目录项和它的索引节点,进而找到文件的物理位置。

       对于可供多个用户共享的文件,则可能有多个目录项。如果要将文件删除,其目录项也应删除。

       构造目录先调用i节点分配过程为新建文件分配一磁盘i节点及内存i节点。

       若分配失败则返回,分配成功时须先设置内存i节点的初值(含拷贝)。

       调用写目录过程,将用户提供的文件名与分配给该文件的磁盘i节点号一起,构成一新目录项,再将它记入其父目录文件中。

        用户在第一次访问某文件时,需要使用文件的路径名,系统按路径名去检索文件目录,得到该文件的磁盘索引节点,且返回给用户一个fd。以后用户便可利用该fd来访问文件,这时系统不需再去检索文件目录。

        根据用户给出的路径名,从高层到低层顺序地查找各级目录,寻找指定文件的索引节点号。检索时,对以‘/’开头的路径名,须从根目录开始检索,否则,从当前目录开始,并把与之对应的i节点作为工作索引节点,然后用文件路径名中的第一分量名与根或与当前目录文件中的各目录项的文件名,逐一进行比较。

       由于一个目录文件可能占用多个盘块,在检索完一个盘块中所有目录项而未找到匹配的文件分量名时,须调用读磁盘过程,将下一个盘块中的所有目录项读出后,再逐一检索。若检索完该目录文件的所有盘块而仍未找到,才认为无此文件分量名。

      检索方式采用Hash方法。

     4、 检索目录

  •       内核调用namei从根目录或从当前目录,沿目录树查找指定的索引结点。若未找到或该文件不允许存取,则出错处理返回NULL,否则转入下一步;
  •        分配内存索引节点。如果该文件已被其它用户打开,只需对上一步中所找到的i节点引用计数+1,否则应为被打开文件分配一内存i节点,并调用磁盘读过程将磁盘i节点的内容拷贝到内存i节点中,并设置i.count=1;
  •       分配文件表项。为已打开的文件分配一文件表项,使表项中的f.inode 指向内存索引节点;分配用户文件描述表项。

如有错误,敬请指正。

您的收藏与点赞都是对我最大的鼓励和支持!

Logo

更多推荐