第四章

4.1文件

文件为一组有意义的信息/数据集合

操作系统向上提供的基本功能有:

文件的逻辑结构

无结构文件:文件内部的数据就是一系列二进制流或字符流组成。又称“流式文件”

有结构文件:由一组相似的记录组成,又称“记录式文件”。每条记录又有若干个数据项组成。

有结构文件包括

顺序文件:文件中的记录按照其存入的先后顺序或某个关键字的顺序来排序,并在物理磁盘上依次、连续地存放。

索引文件:一种通过索引表来加速记录检索的文件逻辑结构。由数据文件和索引表两部分组成。

索引顺序文件:一种结合了顺序文件和索引文件优点的文件组织方式。它在物理上按关键字的顺序存储记录,与此同时,为文件建立稀疏索引,该索引不指向每条记录,而是指向一组记录中的第一项。

4.2文件目录

一个文件对应一个FCB,一个FCB就是一个目录项,多个FCB组成文件目录。

目录结构

单级目录结构:整个系统中只建立一张目录表,每个文件占一个目录项。

单级目录实现了按名存取,但是不允许文件重名。不适用于多用户操作系统

两级目录结构:主文件目录和单文件目录

主文件目录记录用户名及相应用户文件目录的存放位置;用户文件目录由该用户的文件FCB组成。

多级目录结构:它允许用户在根目录下创建多级子目录,从而以树状层次的方式组织文件和目录,解决了单级和两级目录在文件命名冲突、组织灵活性等方面的不足。

主要特点:

层次化:文件被组织成树状结构,逻辑清晰。

允许重名:不同目录下的文件可以同名。

访问路径唯一:每个文件都有唯一的绝对路径,从根目录出发可精确访问。

支持当前工作目录:用户始终处于某个目录下,可省去路径前缀,使用相对路径访问下属文件。

目录也是文件

无环图目录结构:树形目录基础上,允许一个文件或子目录被多个不同目录共享的一种目录组织方式。它通过共享节点形成有向无环图,从而解决树形结构中数据只能属于单一父目录的限制,同时必须避免循环引用。

索引节点(innode):用于存储文件的元数据(除文件名以外的所有属性)以及指向文件数据块的指针。每个文件都有唯一的一个索引节点,通过innode编号在整个文件系统中唯一标识。

4.3文件的物理结构

文件连续分配方式:

连续分配:要求每个文件在磁盘上占有一组连续的块

物理上采用连续分配,存储空间利用率低,会产生难以利用的磁盘碎片

链接分配:采取离散分配的方式,可以为文件分配离散的磁盘块。

隐式链接:除文件的最后一个盘块外,每个盘块中都存有指向下一个盘块的指针。文件目录包括文件第一块的指针和最后一块的指针。

显示链接:把用于链接文件各物理块的指针显式存放在一张表中。即文件分配表(FAT)

一个磁盘仅设置一张FAT,开机时,将FAT读入内存,并常驻内存。

索引分配

索引分配允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块。

索引分配的多层索引

4.4文件存储空间管理

存储空间的划分与初始化

磁盘分区为C盘、D盘,物理磁盘划分为一个个文件卷。

磁盘的文件卷分为目录区和文件区

目录区主要存放文件目录信息、用于磁盘存储空间管理的信息

文件区用于存放文件数据

空闲表法

它通过维护一张空闲表来记录磁盘上所有未分配的空闲块的信息,类似于内存管理中的空闲分区表。

空闲表是一个在内存中常驻的数据结构,通常是一个数组或链表,每个表项描述一个连续的空闲区域。每个表项包含:起始块号、空闲块数。

空闲链表法

位示图法

一种使用二进制位来记录磁盘存储空间使用情况的方法。每个磁盘块对应位示图中的一个比特位,通常用0表示空闲,1表示已分配。通过扫描位示图,操作系统可以快速找到空闲块并分配,回收时只需将对应位清零。

4.5文件基本操作

创建文件:

create系统调用。(1)在外村中找到文件所需的空间。(2)根据文件存放路径信息找到该目录对应的目录文件,在目录中创建该文件对应的目录项。

删除文件

delete系统调用。(1)根据文件存放路径找到相应的目录文件,从目录中找到文件名对应的目录项。(2)根据该目录项记录的文件在外存的存放位置、文件大小等信息,回收文件占用的磁盘块。(3)从目录表中删除文件对应的目录项。

4.6文件共享

基于索引节点的共享方式:

基于符号链的共享方式

4.7文件保护

口令保护:用户请求访问该文件时必须提供口令。口令保存在文件中的FCB

加密保护:使用某个密码对文件进行加密,在访问文件时需要提供正确的密码才能对文件进行正确的解密。

访问控制:每个文件的FCB中增加一个访问控制列表,该表中记录了各个用户可以对文件执行哪些操作。精简的访问列表,以组为单位,标记各组用户可以对文件执行哪些操作。

4.8文件系统

虚拟文件系统

特点:

(1)向上层用户进程提供统一标准的系统调用接口,屏蔽底层具体文件系统的实现差异。

(2)VFS要求下层的文件系统必须实现某些规定的函数功能,如:open/read/write。

(3)每打开一个文件,VFS就在主存中新建一个vnode,用统一的数据结构表示文件,无论该文件存储在哪个文件系统。

文件系统挂载:文件系统安装/装载

文件系统挂载要做的事:

(1)在VFS中注册新挂载的文件系统。内存中的挂载表包含每个文件系统的相关信息,包括文件系统类型、容量大小等。

(2)新挂载的文件系统,要向VFS提供一个函数地址列表

(3)将新文件系统加到挂载点,也就是将新文件系统挂载在某个父目录下

参考:王道操作系统

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐