操作系统文件管理学习笔记

文件

文件是命名的、具有逻辑结构的、存储在辅助存储器上的数据集合。它是用户与操作系统之间交互的最基本单位。

• 数据项 (Data Item): 数据的最小命名单位,如字段、记录。分为基本数据项和复合数据项。

• 记录 (Record): 一组相关的数据项的集合。

• 文件 (File): 一组相关记录的集合,分为有结构文件和无结构文件两种,在有结构的文件中,文件由若干个相似记录组成,而无结构文件是一个连续的字节流(如在 UNIX 或 Linux 中)。

文件属性

  • 文件名 (File Name): 同一目录下不能有相同文件名的文件。
  • 标识符 (Identifier): 用于唯一标识文件的标识符。
  • 文件类型 (File Type): 文件的类别,如文本文件、二进制文件等
  • 文件位置 (File Location): 文件存放路径(让用户使用)。在外存的地址(用户不可见)。
  • 文件大小 (File Size): 文件占用的存储空间大小。
  • 创建时间 (Creation Time): 文件被创建的时间和最后一次修改时间。
  • 创建者 (Creator): 创建文件的用户或进程。
  • 所有者 (Owner): 文件的所有者。
  • 保护级别 (Protection Level): 文件的访问权限,如读、写、执行等。

文件控制块和索引节点

文件控制块 (File Control Block, FCB) 是操作系统用来管理文件的结构体,包含了文件的所有属性信息。FCB的有序集合称为文件目录,一个FCB就是一个文件目录项。一个文件目录也被视为一个文件,称为目录文件。

FCB的主要内容包括: - 基本信息: 文件名、文件位置、文件物理和逻辑结构等。 - 存取控制信息: 文件主的存取权限,核准用户的存取权限。 - 使用信息: 文件的创建时间、修改时间等。

索引节点 (Inode) 是 UNIX 和 Linux 系统中用于描述文件的结构体,文件名和文件描述信息分离,使文件描述信息单独形成一个称为索引节点的数据结构。在文件目录中每个目录项仅由文件名和相应的索引节点号组成。

假设一个FCB为64B,盘块大小是1KB,则每个盘块中可以存放16个FCB。若一个文件目录有640个FCB,则查找文件平均需要启动磁盘20次。(640/16=40个盘块,平均查找需要20次磁盘启动)而在使用索引节点的系统中,一个目录项仅占16B,则每个盘块可以存放64个目录项,640个目录项只需10个盘块,平均查找只需5次磁盘启动,大大提高了文件查找效率。

文件基本操作

  • 创建文件 (Create): 为新文件分配外部存储空间,并在文件目录中建立相应的文件目录项。目录项中记录新文件名,文件在存储器中的地址等信息。
  • 删除文件 (Delete): 根据文件名查找目录,删除指定文件对应的目录项和文件控制块,并回收该文件占用的存储空间。
  • 读取文件 (Read): 根据文件名查找目录,找到指定文件的目录项之后,从中得到被读文件在外存中的地址,在目录项中还有一个指针用于对文件进行读操作。
  • 写入文件 (Write): 根据文件名查找目录,找到指定文件的目录项,再利用目录项中的写指针对文件进行写操作。每当发生写操作时,便更新写指针。
  • 文件打开与关闭 文件打开过程: 当用户对一个文件实施多次读写操作时,每次都要从检索目录开始,为了避免多次重复地检索目录,当用户首次对某文件发出操做请求时,须先利用系统调用open将该文件打开,系统维护一个包含所有打开文件信息的表,称为打开文件表。所谓“打开”,是指系统检索到指定文件的目录项后,将该目录项从外存复制到内存中的打开文件表的一个表目中,并将该表目的索引号返回给用户。当用户再次对该文件发出操作请求时,可通过文件描述符在打开文件表中查找到文件信息,从而避免了重复检索目录的开销。当文件不再使用时,用户应通过系统调用close将该文件关闭,系统将会从打开文件表中删除这一表目。

文件关闭过程: 在多个进程可以同时打开文件的操作系统中,通常采用两级表:整个系统表和每个进程表。整个系统的打开文件表包含与进程无关的信息,如文件在磁盘上的位置,访问日期和文件大小,每个进程的打开文件表保存的是进程对文件的使用信息,如文件的读写指针位置,文件访问权限等。并包含指向文件表适当条目的指针。一旦有进程打开了一个文件,系统表就包含该文件的条目,当另一个进程执行调用open时,只不过是在其打开文件表中增加一个条目,并指向系统表的相应条目,通常,系统打开文件表为每个文件关联一个打开计数器,以记录多少进程打开了文件,当文件不再使用时,利用系统调用close将该文件关闭,删除单个进程的打开文件表中的相应条目,并将系统打开文件表中该文件的打开计数器减1,当计数器为0时,才真正关闭文件,可以从系统表中删除对应条目,释放系统资源。 1765273870063

只要完成了文件打开open()系统调用,后面再使用read(),write(),Lseek()等系统调用时,就不需要再提供文件名,而是提供文件描述符fd即可。

每个打开的文件都具有如下的关联信息: - 文件指针 - 文件打开计数 - 文件磁盘位置 - 访问权限

文件保护

访问类型

  • 读 (Read): 允许用户读取文件内容。
  • 写 (Write): 允许用户修改文件内容。
  • 执行 (Execute): 允许用户执行文件(对于可执行文件)。
  • 添加 (Append): 允许用户在文件末尾添加内容,而不修改现有内容。
  • 删除 (Delete): 允许用户删除文件。
  • 列表清单。列出文件名和文件属性。

访问控制

基于身份访问。为每个文件和目录增加一个访问控制列表 (ACL),ACL中列出被授权访问该文件或目录的用户及其访问权限。 访问控制表的结构: - 拥有者:创建文件的用户。 - 组:一组需要共享文件且有类似访问的用户 - 其他用户:不属于上述两类的用户。 1765281884354

此外还有基于口令的保护和基于加密的保护等方法。

文件逻辑结构

文件内部数据如何组织起来 - 无结构文件: 文件被视为一个字节流,没有内部结构。 - 有结构文件: 文件由一系列固定长度或可变长度的记录 - 顺序文件:文件中的记录一个接一个地顺序排列(逻辑上)。记录可以是定长的或可变长的,各个记录在物理上可以是顺序存储或链式存储。 1765285114587 - 索引文件:为可变长记录实现随机存取。索引表本身是定长记录的顺序文件,可将关键字作为索引号内容,若按关键字顺序排列,则还可以支持按照关键字折半查找。 - 索引顺序文件:解决索引表过大问题。将文件分为若干个逻辑块,每个逻辑块有一个索引项,索引项中存放该逻辑块的起始地址和该逻辑块中第一个记录的关键字。如下图,学生记录按照学生姓名的开头字母进行分组,每组就是一个顺序文件,分组内的记录不需要按照关键字排序。 1765285520077

多级索引顺序文件:在索引顺序文件的基础上,增加了多级索引结构,以减少查找时间。第一级索引包含指向第二级索引的指针,第二级索引包含指向数据块的指针。
  • 散列文件

文件物理结构

文件的数据如何存放在外存中的 - 连续分配: 为文件分配一块连续的存储空间,便于顺序访问,但容易产生碎片。 - 链接分配: 文件由一系列不连续的存储块组成,每个块包含指向下一个块的指针,适合随机访问,但增加了指针开销。 - 隐式链接: 每个块包含一个指向下一个块的指针,最后一个块指向一个特殊的结束标志。 - 显式链接: 使用一个单独的索引块FAT文件分配表来存储所有块的地址,便于管理和访问。 1765287111115 - 索引分配: 使用索引块来存储文件块的地址,支持高效的随机访问,但需要额外的存储空间来存储索引块。

文件目录

FCB的有序集合称为文件目录。

目录结构

  • 单级目录: 所有文件都存放在同一个目录中,简单但不适合多用户环境。不允许文件重名。
  • 两级目录: 每个用户有自己的目录,用户只能访问自己的文件,允许不同用户有相同文件名。
  • 树形目录: 目录可以包含子目录,形成树状结构,支持更复杂的文件组织和管理。但是不方便实现跨用户文件共享。
  • 有向无环图目录: 允许目录和文件有多个父目录,形成有向无环图结构,支持更灵活的文件组织和共享。可以用不同的文件名指向同一个文件。

文件存储空间管理

文件卷:将物理磁盘划分的一个逻辑单元。

目录区和文件区:目录区存放文件目录,文件区存放文件数据。

空闲表法

1765288533926

空闲链表法

空闲盘块链:以盘块为单位组成一条空闲链 空闲盘区链:以盘区为单位组成一条空闲链 1765288639921

位示图法

(字号,位号) = (i,j)的盘块号b = i * n + j

成组链接法