5061 字
25 分钟
4.2目录与文件2

4.2.7文件的操作#

文件是一种抽象数据类型。为了正确定义文件,需要明确可对其执行的操作。操作系统提供 一系列的系统调用来实现对文件的创建、删除、读/写、打开和关闭等操作。

1.文件的基本操作#

最基本的文件操作包括创建文件、删除文件、读文件和写文件等。

(1)创建文件

创建文件涉及元数据分配、存储空间预留与目录注册等多个步骤,具体过程如下:

  1. 合法性与权限校验,检查文件名是否合法、是否与同目录下已有的文件重名,并验证用户对目标目录是否具有写权限。若任一条件不满足,则创建立即终止。
  2. 分配索引节点,从空闲inode(或FCB)池中分配一个空闲项,初始化其元数据,包括文件类型、初始大小、访问权限、时间戳以及物理块指针等,并标记为已占用。
  3. 分配磁盘块,根据文件预估大小,从空闲磁盘块管理结构中分配相应数量的物理块,并将块地址记录在inode中。
  4. 在目录中新建目录项,格式为<文件名,索引节点号>,使文件可被检索。
  5. 更新文件系统元数据,包括空闲inode表、空闲磁盘块结构、目录大小以及修改时间等。
  6. 打开并返回文件描述符(可选),若创建后立即打开(见下节),则系统将在进程的打开文件表中创建表项,分配文件描述符,并初始化读/写指针。

(2)删除文件

删除文件的步骤包括撤销目录可见性、回收元数据、释放存储空间等,具体过程如下:

  1. 路径解析与定位,按路径名逐级查找目录,定位目标文件的目录项,获取其inode(或FCB),并验证用户对文件所在目录的写权限。
  2. 检查使用状态与硬链接计数,若文件正被打开,则部分系统将延迟物理删除,待所有引用关闭后再回收资源;若硬链接计数(见4.2.8节)大于1,则仅删除当前目录项并将计数减1,不回收 inode与磁盘块;仅当计数为1时,才执行完整的删除流程 。
  3. 移除目录中的目录项,使文件在用户视角下“消失”,完成逻辑删除。
  4. 释放索引节点,当链接计数降至0时,将inode标记为空闲,并归还至空闲管理结构,其元数据彻底失效。
  5. 释放磁盘块,根据inode中的块指针,将所有数据块和索引块归还至空闲磁盘块管理结构。
  6. 释放内存临时资源(可选),包括对应的缓冲区、打开文件表项及内核文件对象等。
  7. 更新文件系统元数据,同步更新目录大小、空闲inode表及空闲块结构,确保一致性。

(3)读文件

读文件时,首先根据文件名在目录中查找对应目录项,获取文件的索引节点号,进而定位其 在外存中的数据块。随后,依据当前读指针的位置,从指定块中读取数据,并更新读指针。

(4)写文件

写文件时,系统同样先通过文件名查找目录项,获取索引节点号以定位外存数据块。然后,根据当前写指针的位置,将数据写入相应块,并更新写指针。若写入超出当前分配空间,系统将动态分配新磁盘块并更新inode(或FCB)中的块指针。

2. 文件的打开与关闭#

当用户对一个文件执行多次读/写操作时,若每次均需要从检索目录开始,将带来显著的性能开销。为避免重复查找,大多数操作系统规定: 用户首次访问某文件时,必须先通过系统调用open将其打开。系统维护一个称为打开文件表的数据结构,用于记录当前活跃文件的信息。所谓“打开” ,是指系统根据文件路径定位到其目录项后,将关键信息载入内存,在打开文件表中创建一个表目,并将该表目的索引号(文件描述符)返回给用户。此后,用户再次操作该文件时,只需提供文件描述符,系统即可直接从内存获取所需信息,显著降低目录检索开销。

为提升效率与管理灵活性,现代操作系统采用两级打开文件表结构:

  • 系统打开文件表: 全局共享,存储与进程无关的文件属性,如磁盘位置、文件大小、访问时间等;每项都包含一个打开计数器(Open Count),记录有多少进程打开了该文件。
  • 进程打开文件表: 每个进程独有,记录进程私有的访问状态,如当前读/写指针、访问权 限及文件打开模式。该表中的每一项均指向系统打开文件表的对应项,实现资源共享与 独立控制的统一。

当一个进程成功打开文件时,系统首先确保其在系统打开文件表中存在对应项(若不存在,则创建),随后在该进程的打开文件表中新增一项,指向该系统表项。此后,其他进程若打开同一文件,仅需要在其各自的进程表中添加新项并指向同一系统表项,无须重复加载文件元数据, 既保证了各进程访问上下文的隔离,又实现了底层资源的高效共享。

综上,文件打开的完整过程如下: 系统首先根据用户提供的文件路径逐级遍历目录,将所需的目录文件从磁盘加载至内存,定位目标文件的目录项;随后从中提取其索引节点编号,并以此为关键字在系统打开文件表中查找对应项。若未找到,则从磁盘读取该索引节点至内核缓冲区,在系统表中创建新项,并将打开计数初始化为1;若已存在,则仅将该项的打开计数加1。接着,在发起请求的进程所属的进程打开文件表中分配一个新表项,用于记录其指向系统表项的索引;最终,将该表项的索引号作为文件描述符返回给用户进程,供后续读/写等操作使用。

当文件不再使用时,用户调用close关闭它。系统随即从该进程的打开文件表中删除对应项,并将系统打开文件表中相应项的打开计数器减1。一旦计数器减至0,表明该文件已无任何进程引用,系统便可安全地删除其在系统表中的项,并释放所占用的相关资源。

文件名并非打开文件表的组成部分。因为一旦系统通过文件名完成对磁盘上FCB的定位,后续操作便不再需要该文件名。用于访问打开文件表的索引号,也称文件描述符(Linux)或文件句柄 (Windows)。因此,只要文件处于打开状态,所有文件操作均通过该索引号完成。

NOTE

一旦成功执行open()系统调用,后续所有文件操作[包括read()、write, ()lseek()、close()等]均不再使用文件名,而是通过文件描述符进行,这一机制是文件管理的核心考点。

每个被打开的文件在系统中均关联以下关键信息:

  • 文件指针。系统为每个进程维护一个独立的当前读/写位置指针。由于该指针对不同进程而言是私有的,必须与磁盘上的共享文件属性分离,保存在进程的打开文件表中。
  • 文件打开计数。记录当前打开该文件的进程数量。因多个进程可能同时访问同一文件,系统只有在最后一个进程调用close()后,才会真正释放其在系统打开文件表中的项。
  • 文件磁盘位置。大多数文件操作涉及对磁盘数据的修改。为避免每次操作都重新解析路径并读取元数据,系统将文件在磁盘上的位置信息缓存在内存中,供快速访问。
  • 访问权限。每个进程在打开文件时需要指定访问模式(如只读、读/写、追加、创建等)。该权限信息保存在进程的打开文件表中,操作系统据此判断是否允许后续的I/O请求。

4.2.8文件共享#

文件共享允许多个用户访问同一文件,系统中仅需保留一个物理副本。若缺乏共享机制,则每个需要该文件的用户都必须持有独立副本,不仅浪费存储空间,还易导致数据不一致。

前文介绍的无环图目录结构可用于实现文件共享。建立链接时,需要将被共享文件的盘块号复制到相应目录项中。然而,若某用户向文件追加数据并分配新盘块,这些新增盘块仅出现在其操作所对应的目录中,对其他用户不可见,因此无法实现真正的共享。

1.基于索引节点的共享方式(硬链接)#

硬链接是一种基于索引节点的共享机制。在此方式下,文件的物理地址和属性信息不再存放于目录项中,而是集中存储在索引节点内;目录项仅包含文件名及指向该索引节点的指针。

用户A和B的目录中均设有指向同一共享文件索引节点的指针。该索引节点包含一个链接计数count,也称引用计数,用于记录当前指向它的目录项数量。例如,当count=2时,表示有两个用户目录项链接到此文件,即两个用户共享该文件。

当用户A创建新文件时,成为该文件的拥有者,系统为其创建索引节点,并将count置为1。当用户B需要共享此文件时,系统在B的目录中新增一个目录项,并设置指向该索引节点的指针,此时count增至2,但拥有者仍为A。若A不再需要该文件,能否直接删除?答案是否定的。因为删除操作若同时移除索引节点,将导致用户B的指针悬空;而B可能正在对该文件执行写操作,此时操作将中断失败。因此,A不能直接删除文件,而应仅删除自己的目录项,并将索引节点的count减1。只要count>0,文件及其索引节点仍被保留,B可继续使用。只有当count=0时,系统才真正释放该文件及其索引节点。

2.利用符号链实现文件共享(软链接)#

为使用户B能共享用户A的文件F,系统可创建一个LINK类型的新文件L,并将其写入用户B的目录中,从而建立B的目录与文件F之间的链接。文件L仅包含被链接文件F的路径名。这种链接方式称为符号链接,也称软链接,其功能类似于Windows系统中的快捷方式。当用户B访问文件L时,操作系统识别出其为LINK类型,便根据其中记录的路径名逐级查找,定位到目标文件F,并对其执行读/写操作,从而实现对文件F的共享。

在基于符号链的共享机制中,只有文件拥有者持有指向其索引节点的指针。其他共享用户仅保存该文件的路径名,而不具备直接指向索引节点的指针。因此,即使拥有者删除了共享文件F,也不会导致其他用户的指针悬空。当其他用户尝试通过符号链访问已被删除的共享文件时,系统将返回访问失败,此时可安全地删除该符号链接,而不会引发任何问题。

在符号链的共享方式中,用户每次访问共享文件时,系统需要根据路径名逐级遍历目录结构,直至定位到目标文件的索引节点。这一过程可能涉及多次磁盘读取,从而增加访问开销。同时,符号链接本身也是一个独立文件,其索引节点同样占用一定的磁盘空间。

利用符号链实现网络文件共享时,只需记录文件所在机器的网络地址及文件路径名。

可以这样说:文件共享,“软硬”兼施。硬链接是多个目录项指向同一个索引节点,只要至少有一个指针存在,该索引节点就不会被删除;软链接是将到达共享文件的路径保存下来,访问时依据路径进行查找。可见,硬链接的查找速度通常优于软链接,因其直接通过指针访问。

4.2.9文件保护#

为防止文件共享导致文件被意外破坏或被未授权用户篡改,文件系统必须对用户访问文件的行为实施控制,即明确哪些用户可对文件执行读/写、执行等操作。为此,需要建立有效的文件保护机制。常见的实现方式包括口令保护加密保护访问控制:其中,口令与加密主要用于防止他人非法获取或窃取文件内容,而访问控制则用于精细管理用户对文件的具体访问权限。

1.访问类型#

文件保护通常通过限制用户可执行的访问类型来实现。主要的受控操作包括:

  • 。从文件中读取数据。
  • 。向文件中写入或修改数据。
  • 执行。将文件加载到内存并运行。
  • 添加。在文件末尾追加新数据,而不覆盖原有内容。
  • 删除。移除文件并释放其所占用的存储空间。
  • 列表清单。列出目录中文件的名称及其属性。

此外,系统还可对重命名复制编辑等高层操作进行控制。然而,这些功能通常由应用程序通过调用系统调用来实现,而真正的保护机制仅在底层提供。例如,复制文件本质上是通过一系列“读”操作完成的;因此,用户只要拥有读权限,便隐含具备了复制和打印的能力。

2.访问控制#

实现访问控制最常用的方法是基于用户身份进行权限管理。其中,最普遍的机制是为每个文件和目录附加一个访问控制列表(Access-Control List,ACL),明确指定各用户名及其被允许的访问类型。该方法的优点在于支持灵活而复杂的访问策略,但缺点是列表长度不可预知,可能带来复杂的空间管理开销。为此,现代系统常采用精简的访问控制列表加以缓解。

精简ACL通常将用户划分为三类:拥有者、组和其他。

  1. 拥有者。创建文件的用户。
  2. 。一组需要共享该文件且具有相似访问需求的用户。
  3. 其他。系统中除拥有者和同组用户外的所有用户。

一个精简ACL的实例。每种访问类型用一个二进制位表示,因此仅需一个3 x 4位的矩阵,即可完整描述三类用户的访问权限。创建文件时,系统将文件拥有者的用户名及其所属组名记录在该文件的FCB中。当用户访问文件时,系统按优先级顺序匹配其身份:若为拥有者,则授予拥有者权限;若与拥有者同属一组,则授予组权限;否则,仅授予其他用户的权限。

除ACL外,口令密码也是常见的辅助性访问控制手段。

口令指用户在创建文件时设定一个口令,系统将其存入FCB,并告知授权共享的其他用户,访问时需要提供正确口令。该方法时空开销小,但因口令通常以明文或弱保护形式存储于系统内部,安全性较低。密码指用户对文件内容进行加密,访问时需要使用密钥解密。此方法保密性强,且不额外占用元数据空间,但加解密过程会引入一定的计算开销。

口令与加密主要用于防止文件被非法获取或窃取,并不区分具体的访问操作类型(如读/写、执行等)。因此,它们无法替代基于权限的访问控制机制,而应视为补充手段。

对于多级目录结构而言,保护需求不仅限于单个文件,还需要涵盖子目录及其全部内容。由于目录操作与文件操作存在较大差异,系统还必须提供专门的目录保护机制。

4.2.10本节小结#

本节开头提出的问题的参考答案如下。

  1. 目录管理的基本要求是什么?

    1. 实现“按名存取”,这是目录管理最基本的功能。
    2. 提高目录检索速度,从而加快文件的存取效率。
    3. 支持安全共享,目录需要提供访问控制信息,以管理不同用户对文件的使用权限。
    4. 支持重名,允许不同用户为各自的文件使用相同的名称。
  2. 在目录中查找某个文件可采用哪些方法?

    可采用线性列表法或哈希表法。线性列表法将文件名组织成一个线性表,查找时依次与各表项比较;若文件名有序,则可采用折半查找。但插入新文件需要维护有序性,带来额外开销。哈希表法通过哈希函数将文件名映射为指向目录项的指针,查找迅速,但需要妥善处理哈希冲突。

  3. 单个文件的逻辑结构与物理结构之间是否存在制约关系?

    文件的逻辑结构是用户可见的组织形式,即从用户视角所见的文件全貌;而物理结构则是文件在存储器上的实际存放方式,与存取方法及存储介质特性密切相关。二者虽无直接制约关系,但若物理结构选择不当,则难以体现逻辑结构的特点。例如,一个逻辑上为顺序结构的文件,若采用隐式链接的物理结构,即使理论上能快速定位某条记录,实际仍需在磁盘上逐块查找。

学到这里,读者应能体会到:现代操作系统的设计思想中,处处可见面向对象程序设计的影子。本章所学的“文件”,实质上是一种抽象数据类型,即一种数据结构。若读者在此之前已学完数据结构,则面对新数据结构时,自然会关注其逻辑结构、物理结构及所支持的操作。

4.2目录与文件2
https://www.atsuko.top/posts/408/operating-system/42-directory-and-files-2/
作者
AC_DB
发布于
2026-05-30
许可协议
CC BY-NC-SA 4.0

评论