3.文件系统
3.1.文件系统结构
1.用户接口:用于处理各种文件的基本操作(各种系统调用请求)
2.文件目录系统:完成与目录有关的工作
3.存取控制模块:实现文件保护
4.逻辑文件系统与文件信息缓冲区:在索引文件的逻辑结构下,一个索引表对应一个文件;在查询对应的索引表前,需要将索引表调入文件信息缓冲区中
5.物理文件系统:逻辑地址转换为物理地址
①辅助分配模块:为文件添加记录,新增物理块;为文件删除记录,回收物理块
②设备管理模块:最接近硬件的层次
3.2.文件系统的全局结构
文件系统在外存是如何一步一步的建立的
1.物理格式化(低级格式化):将磁盘划分为一个个扇区(磁盘在原始状态下并被分为若干个扇区),并检测该磁盘是否有坏扇区,如果有,则用备用扇区替代这些坏扇区
坏扇区对操作系统是透明的(设n号扇区是坏扇区):操作系统想访问n号扇区,磁盘驱动器就会在操作系统不知道的情况下,用一个备用扇区替代该n号扇区被操作系统访问
2.逻辑格式化(高级格式化):将磁盘划分为一个个的分区(分卷,例如:C盘、D盘)
①分区表记录每个分区的大小、起始地址、地址范围等
②每个分区可以建立独立的文件系统
(1)引导块:负责开机时初始化操作系统
(2)超级块:找到该分区中所有空闲磁盘块
(3)与空闲分区管理有关的数据结构:例如位示图,判断某个特定的磁盘块是否空闲
(4)i结点区:i结点即索引结点,一个文件对应一个索引结点,所有索引结点连续存放在i结点区(可以理解为超大的数组,该数组元素就是索引结点)
(5)根目录:逻辑格式化后,根目录被建立;任何文件都必须从根目录出发,建立新的下一级目录
(6)灰色部分此时已经有数据,白色部分还没有数据,只有新建文件或者目录时才会有数据
3.文件系统在内存的结构:内存分为用户区和内核区
内核区:
(1)目录的缓存:最近访问过的目录的数据会被暂时缓存在内存中。例如:最近查找过目录M,即将目录M中的FCB都读入主存,如果接下来又访问到目录M,就无需再从外存中读入
(2)系统打开文件表:记录整个系统打开了哪些文件
①整个系统只有一张系统打开文件表
②保存每个文件对应的FCB
(3)进程(用)户打开文件表:记录该进程当前打开了哪些文件
①一个进程对应一张进程打开文件表
②进程打开文件表包含于PCB中
③进程打开文件表并不会保存FCB,但会有一个指向系统打开文件表中该文件的索引,这样就能通过该索引找到系统打开文件表中该文件对应的FCB
(4)示例:通过open系统调用打开目录M中的文件A
①根据路径读入目录:在外存中找到目录M→将目录M的数据读入主存(即将目录M缓存)
②找到目标文件FCB,复制到系统打开文件表:检查目录M的FCB,即逐一对比找到文件A的FCB→复制文件A的FCB到系统打开文件表中(表示文件A被打开),同时设置打开计数为1(表示当前有1个进程正在使用文件A)
③在进程打开文件表中新建一个条目,并返回文件描述符:发起OPEN系统调用的进程的进程打开文件表中新建一个条目,该条目记录对该文件的打开方式(读/写、只读等);
返回文件描述符,即返回指向该文件在系统打开文件表的位置的指针
④OPEN系统调用打开文件后,将返回一个文件描述符,可以通过该文件描述符对打开的文件进行操作(例如:操作系统收到READ系统调用后,根据文件描述符在进程打开文件表中找到对应的条目,然后根据索引信息找到系统打开文件表中对应的条目,即找到该文件的FCB,最后根据FCB找到该文件在外存中的位置)
3.3.虚拟文件系统
3.3.1.虚拟文件系统的基本概念
1.不同外部存储设备内部的文件系统格式可能不同(例如:磁盘→UFS文件系统、移动硬盘→NTFS文件系统、U盘→FAT文件系统),即计算机内部可能同时存在不同的文件系统
2.不同的文件系统在开发时定义的函数接口可能不同:例如,打开文件系统调用,可以是open、fopen、openf等,需要的参数也可能不同
3.1和2的特性使得操作系统需要提供向上层提供一个统一标准的函数调用接口,方便用户使用,即虚拟文件系统
①向上层用户提供进程提供同一标准的系统调用接口,屏蔽底层具体文件系统的实现差异:用户仅需按照虚拟文件系统的标准写代码,无需按照打开的文件实际存在的文件系统的标准写代码,通过虚拟文件系统调用相对应的底层文件系统
②要求下层的文件系统必须实现某些规定的函数功能(open、write、read等等),一个新的文件系统想要在某操作系统上被使用,就必须满足该操作系统的虚拟文件系统的要求:虚拟文件系统不需要根据不同的底层文件系统而频繁修改操作系统内核代码
③每打开一个文件,虚拟文件系统就在主存中新建一个VNODE,用统一的数据结构表示文件,无论该文件存储在哪个文件系统:不同文件系统所对应的数据结构不同(例如FAT文件系统的目录项包含其所有信息;UFS文件系统的目录项由指向索引结点的指针组成,具体的信息存放在该索引结点中),在虚拟文件系统中,通过open系统调用打开一个文件后就会给这个文件在主存中新建一个包含该文件的所有信息的VNODE(也称V结点),即将不用的文件系统的文件信息的数据结构通过复制到VONDE的方法形成统一的数据结构
(1)VNODE只会存在于主存中(由虚拟文件系统创建),而INODE(索引结点)存放在外存中,在使用时调入主存
(2)VNODE中的函数功能指针指向的是该文件所属文件系统的函数功能列表(write、read、open等):对该文件进行的任何操作时,先找到该文件的VNODE,根据VNODE中的函数功能指针找到对应的文件系统的函数功能列表,再去执行具体函数,从而实现从上至下逐层函数调用
3.3.2.文件系统挂载
1.文件系统挂载,即文件系统安装:将具体的文件系统安装到操作系统的虚拟文件系统中
2.文件挂载的过程:
①在虚拟文件系统中注册新挂载的文件系统:虚拟文件系统管理一个名为挂载表的数据结构,新增一个文件系统时候就要在挂载表中增加一个相应的表项,即让虚拟文件系统发现这个文件系统。例如图中的虚拟文件系统管理的挂载表中有三个表项,分别指向UFS、NTFS和FAT
②新挂载的文件系统需要向虚拟文件系统提供一个函数地址列表:每一个文件系统实现系统调用的方式可能不同,即告诉系统调用自己的每个系统调用存放在哪个地址(VNODE中的函数功能指针),使得虚拟文件系统能够实现这些系统调用
③将新文件系统加到挂载点:例如Windows操作系统中,插入一个U盘,在我的电脑中将会增加一个可移动硬盘H(跟C盘、D盘平级),这样才能够被我们所访问和使用