17. 【解答】
2026 旧版 · 非 2027 主源 · 原书检索 · 文字用于定位,公式与图表请回原页核验 · 本次导入快照
## 17. 【解答】
1)页和页框大小均为 $4\mathrm{KB}$。进程的虚拟地址空间大小为 $2^{32} / 2^{12} = 2^{20}$ 页。
2)$(2^{10} \times 4) / 2^{12}$(页目录所占页数)+ $(2^{20} \times 4) / 2^{12}$(页表所占页数)= 1025 页。页目录占用的物理页面数 = (页目录项数 × 页目录项大小)/物理页面大小 = $(2^{10} \times 4) / 2^{12} = 1$ 页。虚拟地址空间中的高 20 位表示有多少个页面,所以进程的页面数为 $2^{20}$,因此页表总大小为 $2^{20} \times 4\mathrm{B}$,存放页表需要 $(2^{20} \times 4) / 2^{12} = 1024$ 页。因此,页目录和页表共占 $1 + 1024 = 1025$ 页。
3)需要访问一个二级页表。因为虚拟地址01000000H和01112048H的最高10位的值都是4,访问的是同一个二级页表。
## 18. 【解答】
1)函数 $\Pi$ 的代码段中,所有指令的虚拟地址的高20位相同,因此 $\Pi$ 的机器指令代码在同一页中,仅占用1页。页目录号用于寻找页目录的表项,该表项包含页表的位置。页表索引用于寻找页表的表项,该表项包含页的位置。
2)push ebp 指令的虚拟地址的最高10位(页目录号)为000000001,中间10位(页表索引)为000000001,所以取该指令时访问了页目录的1号表项,在对应的页表中访问了1号表项。
3)在执行 scanf()的过程中,进程P因等待输入而从执行态变为阻塞态。输入结束时,P被中断处理程序唤醒,变为就绪态。P被调度程序调度,变为运行态。CPU状态会从用户态变为内核态。
## 19. 【解答】
1)由图可知,地址总长度为32位,高20位为虚页号,低12位为页内地址,且虚页号高10位为页目录号,低10位为页号。展开成二进制表示为
因此十六进制表示为01806008H。
2)PDBR为页目录基址地址寄存器(Page-Directory Base Register),其存储页目录表物理内存基地址。进程切换时,PDBR的内容会变化;同一进程的线程切换时,PDBR的内容不会变化。每个进程的地址空间、页目录和PDBR的内容存在一一对应的关系。进程切换时,地址空间发生了变化,对应的页目录及其始址也相应变化,因此需要用进程切换后当前进程的页目录始址刷新PDBR。同一进程中的线程共享该进程的地址空间,其线程发生切换时,地址空间不变,线程使用的页目录不变,因此PDBR的内容也不变。
3)改进型 CLOCK 置换算法需要用到使用位和修改位,所以需要设置访问字段(使用位)
<!-- page: 262 -->
和修改字段(脏位)。
## 20. 【解答】
1)
① 页面大小 = 2¹²B = 4096B = 4KB。每个数组元素 4B,每个页面可以存放 4KB/4B = 1024 个数组元素,正好是数组的一行,数组 a 按行优先方式存放。1080 0000H 的虚页号为 10800H,因此 a[0]行存放在虚页号为 10800H 的页面中,a[1]行存放在页号为 10801H 的页面中。a[1][2]的虚拟地址为 10801 000H + 4×2 = 10801 008H。
② 转换为二进制 0001000010 0000000001 000000001000,根据虚拟地址结构可知,对应的页目录号为 042H,页号为 001H。
③ 进程的页目录表始址为 0020 1000H,每个页目录项长 4B,因此 042H 号页目录项的物理地址是 0020 1000H + 4×42H = 0020 1108H。
④ 页目录项存放的页框号为 00301H,二级页表的始址为 00301 000H,因此 a[1][2]所在页的页号为 001H,每个页表项 4B,因此对应的页表项物理地址是 00301 000H + 001H×4 = 00301 004H。
2)根据数组的随机存取特点,数组 a 在虚拟地址空间中所占的区域必须连续,因为数组 a 不止占用一页,相邻逻辑页在物理上不一定相邻,所以数组 a 在物理地址空间中所占的区域可以不连续。
3)由 1)可知每个页面正好可以存放一整行的数组元素,“按行优先方式存放”意味着数组的同一行的所有元素都存放在同一个页面中,同一列的各个元素都存放在不同的页面中,因此数组 a 按行遍历的局部性较好。
## 21. 【解答】
1)页表项的虚拟地址为 B8C0 0000H + 48H << 2 = B8C0 0120H。页表项的物理地址为 6540 0000H + 48H << 2 = 6540 0120H。相应页表项中的页框号为 BAB4 5678H >> 22 = 2EAH。
2)进程 P 的页表所在页的页号为 B8C0 0000H >> 22 = 2E3H。页表项的虚拟地址为 B8C0 0000H + 2E3H << 2 = B8C0 0B8CH。页表项中的页框号为 6540 0000H >> 22 = 195H。
注意,符号“<<”表示左移操作,符号“>>”表示右移操作。将二进制数左移 1 位,与“乘以 2”的效果等价。页表项中的页框号为物理地址的前 10 位可以通过右移 22 位得到。
## 3.3 本章疑难点
分页管理方式和分段管理方式在很多地方是相似的,比如在内存中都是不连续的、都有地址变换机构来进行地址映射等。但两者也存在许多区别,表 3.6 列出了两种方式的对比。
表 3.6 分页管理方式和分段管理方式的比较
[tbl-129.md](tbl-129.md)
<!-- page: 263 -->
# 文件管理
## 【考纲内容】
### (一)文件
文件的基本概念;文件元数据和索引节点(inode)
文件的操作:建立,删除,打开,关闭,读,写
文件的保护:文件的逻辑结构;文件的物理结构
### (二)目录
目录的基本概念;树形目录;目录的操作;硬链接和软链接
### (三)文件系统
文件系统的全局结构(layout):文件系统在外存中的结构,文件系统在内存中的结构外存空闲空间管理办法;虚拟文件系统;文件系统挂载(mounting)
视频讲解
## 【复习提示】
本章内容较为具体,要注意对概念的理解。重点掌握文件系统的结构及其实现、文件分配和空闲空间管理等。要掌握文件系统的文件控制块、物理分配方法、索引结构、树形目录结构、文件共享原理、文件系统的布局、虚拟文件系统原理等。这些都是统考真题容易考查的内容。
# 4.1 文件系统基础
在学习本节时,请读者思考以下问题:
1)什么是文件?
2)单个文件的逻辑结构和物理结构之间是否存在某些制约关系?
本节内容较为抽象,要注意区分文件的逻辑结构和物理结构。在学习过程中,可尝试以上面的两个问题为线索,构建整个文件系统的概念。在前面的学习中,曾经提醒过读者不要忽略对基本概念的理解。从历年的情况来看,大部分同学对进程管理、内存管理有较好的掌握,但对于文件管理及后面的I/O管理,往往理解不太深入。在考试中,即使面对一些基本问题也容易失分,这十分可惜。主要原因还是对概念的理解不够全面和透彻,希望读者能够关注这个问题。
## 4.1.1 文件的基本概念
文件(File)是以硬盘为载体的存储在计算机上的信息集合,文件可以是文本文档、图片、程序等。在系统运行时,计算机以进程为基本单位进行资源的调度和分配;而在用户进行的输入、输出中,则以文件为基本单位。大多数应用程序的输入都是通过文件来实现的,其输出也都保存在文件中,以便信息的长期存储及将来的访问。当用户将文件用于程序的输入、输出时,还希望
<!-- page: 264 -->
可以访问、修改和保存文件等,实现对文件的维护管理,这就需要系统提供一个文件管理系统,操作系统中的文件系统(File System)就是用于实现用户的这些管理要求的。
要清晰地理解文件的概念,就要了解文件究竟由哪些东西组成。
## 1. 文件的定义
首先,文件肯定包括一块存储空间,更准确地说,是存储空间中的数据;其次,操作系统要管理大量的数据,因此必须要对这些数据进行分类,所以文件必定包含分类和索引的信息;最后,不同用户对数据的访问权限不同,因此文件中一定包含关于访问权限的信息。
再举一个直观的例子“图书馆管理图书”来类比文件。可以认为,计算机中的一个文件相当于图书馆中的一本书,操作系统管理文件,相当于图书管理员管理图书馆中的书。
首先,一本书的主体一定是书中的内容,相当于文件中的数据;其次,不同类别的书需要放在不同的书库,然后加上编号,再将编号登记在图书管理系统中,方便读者查阅,相当于文件的分类和查找;最后,有些已经绝版或价格比较高的外文书籍,只能借给 VIP 会员或权限比较高的读者,而有些普通的书籍可供任何人借阅,这就是文件中的访问权限。所举例子与实际操作系统中的情形并不等价。但对于某些关键的属性,图书馆管理图书和操作系统管理文件的思想却有相一致的地方,因此通过这种类比可使初学者快速认识陌生的概念。
从用户的角度看,文件系统是操作系统的重要部分之一。用户关心的是如何命名、分类和查找文件,如何保证文件数据的安全性及对文件可以进行哪些操作等。而对于其中的细节,如文件如何存储在辅存上、如何管理文件辅存区域等方面,则关心甚少。
文件系统提供了与二级存储相关的资源的抽象,让用户能在不了解文件的各种属性、文件存储介质的特征及文件在存储介质上的具体位置等情况下,方便快捷地使用文件。用户通过文件系统建立文件,用于应用程序的输入、输出,对资源进行管理。
首先了解文件的结构,我们通过自底向上的方式来定义。
1)数据项。是文件系统中最低级的数据组织形式,可分为以下两种类型:
- 基本数据项。用于描述一个对象的某种属性的一个值,是数据中的最小逻辑单位。
- 组合数据项。由多个基本数据项组成。
2)记录。是一组相关的数据项的集合,用于描述一个对象在某方面的属性。
3)文件。是指由创建者所定义的、具有文件名的一组相关元素的集合,可分为有结构文件和无结构文件两种。在有结构文件中,文件由若干个相似的记录组成,如一个班的学生记录;而无结构文件则被视为一个字符流,比如一个二进制文件或字符文件。
虽然上面给出了结构化的表述,但实际上关于文件并无严格的定义。在操作系统中,通常将程序和数据组织成文件。文件可以是数字、字符或二进制代码,基本访问单元可以是字节或记录。文件可以长期存储在硬盘中,允许可控制的进程间共享访问,能够被组织成复杂的结构。
## 2. 文件的属性
除了文件数据,操作系统还会保存与文件相关的信息,如所有者、创建时间等,这些附加信息称为文件属性或文件无数据。文件属性在不同系统中差别很大,但通常都包括如下属性。
1)名称。文件名称唯一,以容易读取的形式保存。
2)类型。被支持不同类型的文件系统所使用。
3)创建者。文件创建者的 ID。
4)所有者。文件当前所有者的 ID。
5)位置。指向设备和设备上文件的指针。
<!-- page: 265 -->
6)大小。文件当前大小(用字节、字或块表示),也可包含文件允许的最大值。
7)保护。对文件进行保护的访问控制信息。
8)创建时间、最后一次修改时间和最后一次存取时间。文件创建、上次修改和上次访问的相关信息,用于保护和跟踪文件的使用。
**创建通读** ▶ 文件属性信息的存储位置(2009)
操作系统通过文件控制块(见下一小节)来维护文件元数据。
## 3. 文件的分类
为了便于管理文件,将文件分成了若干类型。不同系统对文件的管理方式不同,因此它们的文件分类方法也有很大差异。下面是几种常见的文件分类方法。
1)按性质和用途分类,分为系统文件、用户文件、库文件。
2)按文件中数据的形式分类,分为源文件、目标文件、可执行文件。
3)按存取控制属性分类,分为可执行文件、只读文件、读/写文件。
4)按组织形式和处理方式分类,分为普通文件、目录文件、特殊文件。
## 4.1.2 文件控制块和索引节点
与进程管理一样,为便于文件管理,引入了文件控制块的数据结构。
### 1. 文件控制块
文件控制块(File Control Block,FCB)是用来存放控制文件需要的各种信息的数据结构,以实现按名存取。文件与FCB一一对应,FCB的有序集合称为文件目录,一个FCB就是一个文件目录项。通常,一个文件目录也被视为一个文件,称为目录文件。每当创建一个新文件,系统就要为其建立一个FCB,用来记录文件的各种属性。图4.1是一个典型的FCB。
[tbl-130.md](tbl-130.md)
图4.1 一个典型的FCB
FCB主要包含以下信息:
- 基本信息,如文件名、文件的物理位置、文件的逻辑结构、文件的物理结构等。
- 存取控制信息,包括文件主的存取权限、核准用户的存取权限以及一般用户的存取权限。
- 使用信息,如文件建立时间、上次修改时间等。
### 2. 索引节点
**创建通读** ▶ 目录项结构的相关分析与计算(2020、2022)
文件目录通常存放在磁盘上,当文件很多时,文件目录会占用大量的盘块。在查找目录的过程中,要先将存放目录文件的第一个盘块中的目录调入内存,然后用给定的文件名逐一比较,若未找到指定文件,就还需要不断地将下一盘块中的目录项调入内存,逐一比较。我们发现,在检索目录的过程中,只用到了文件名,仅当找到一个目录项(其中的文件名与要查找的文件名匹配)时,才需从该目录项中读出该文件的物理地址。也就是说,在检索目录时,文件的其他描述信息
<!-- page: 266 -->
不会用到,也不需要调入内存。因此,有的系统(如UNIX,图4.2)便采用了文件名和文件描述信息分离的方法,使文件描述信息单独形成一个称为索引节点的数据结构,简称i节点(inode)。在文件目录中的每个目录项仅由文件名和相应的索引节点号(或索引节点指针)构成。
[tbl-131.md](tbl-131.md)
图4.2 UNIX的文件目录结构
**剖面测试** 索引节点与文件容量的关系(2018、2020)
假设一个FCB为64B,盘块大小是1KB,则每个盘块中可以存放16个FCB(FCB必须连续存放),若一个文件目录共有640个FCB,则查找文件平均需要启动磁盘20次。而在UNIX系统中,一个目录项仅占16B,其中14B是文件名,2B是索引节点号。在1KB的盘块中可存放64个目录项。这样,可使查找文件的平均启动磁盘次数减少到原来的1/4,大大节省了系统开销。
(1)磁盘索引节点
是指存放在磁盘上的索引节点。每个文件有一个唯一的磁盘索引节点,主要包括以下内容:
- 文件主标识符,拥有该文件的个人或小组的标识符。
- 文件类型,包括普通文件、目录文件或特别文件。
- 文件存取权限,各类用户对该文件的存取权限。
- 文件物理地址,每个索引节点中含有13个地址项,即iaddr(0)~iaddr(12),它们以直接或间接方式给出数据文件所在盘块的编号(见4.1.6节)。
- 文件长度,指以字节为单位的文件长度。
- 文件链接计数,在本文件系统中所有指向该文件的文件名的指针计数。
- 文件存取时间,本文件最近被进程存取、修改的时间及索引节点最近被修改的时间。
(2)内存索引节点
是指存放在内存中的索引节点。当文件被打开时,要将磁盘索引节点复制到内存的索引节点中,便于以后使用。在内存索引节点中增加了以下内容:
- 索引节点号,用于标识内存索引节点。
- 状态,指示i节点是否上锁或被修改。
- 访问计数,每当有一进程要访问此i节点时,计数加1;访问结束减1。
- 逻辑设备号,文件所属文件系统的逻辑设备号。
- 链接指针,设置分别指向空闲链表和散列队列的指针。
FCB或索引节点相当于图书馆中图书的索书号,我们可以在图书馆网站上找到图书的索书号,然后根据索书号找到想要的书本。
## 4.1.3 文件的操作
### 1. 文件的基本操作
文件属于抽象数据类型。为了正确地定义文件,需要考虑可以对文件执行的操作。操作系统提供一系列的系统调用,实现对文件的创建、删除、读、写、打开和关闭等操作。
<!-- page: 267 -->
1)创建文件。创建文件有两个必要步骤:一是为新文件分配外存空间;二是在目录中为之创建一个目录项,目录项记录了新文件名、文件在外存中的地址等信息。
**前期通知** ▶ 文件删除的过程(2013、2021)
2)删除文件。为了删除文件,根据文件名查找目录,删除指定文件对应的目录项和文件控制块,然后回收该文件所占用的存储空间(包括磁盘空间和内存缓冲区)。
3)读文件。为了读文件,根据文件名查找目录,找到指定文件的目录项后,从中得到被读文件在外存中的地址;在目录项中,还有一个指针用于对文件进行读操作。
4)写文件。为了写文件,根据文件名查找目录,找到指定文件的目录项后,再利用目录项中的写指针对文件进行写操作。每当发生写操作时,便更新写指针。
## 2. 文件的打开与关闭
**前期通知** ▶ 文件打开的过程(2014)
当用户对一个文件实施多次读/写等操作时,每次都要从检索目录开始。为了避免多次重复地检索目录,大多数操作系统要求,当用户首次对某文件发出操作请求时,须先利用系统调用 open 将该文件打开。系统维护一个包含所有打开文件信息的表,称为打开文件表。所谓“打开”,是指系统检索到指定文件的目录项后,将该目录项从外存复制到内存中的打开文件表的一个表目中,并将该表目的索引号(也称文件描述符)返回给用户。当用户再次对该文件发出操作请求时,可通过索引号在打开文件表中查找到文件信息,从而节省了大量的检索开销。当文件不再使用时,可利用系统调用 close 关闭它,则系统将从打开文件表中删除这一表目。
**前期通知** ▶ 多进程同时打开文件的分析(2017、2020)
**前期通知** ▶ 文件关闭的过程(2023)
在多个进程可以同时打开文件的操作系统中,通常采用两级表:整个系统表和每个进程表。整个系统的打开文件表包含与进程无关的信息,如文件在磁盘上的位置、访问日期和文件大小。每个进程的打开文件表保存的是进程对文件的使用信息,如文件的当前读/写指针、文件访问权限,并包含指向系统表中适当条目的指针。一旦有进程打开了一个文件,系统表就包含该文件的条目。当另一个进程执行调用 open 时,只不过是在其打开文件表中增加一个条目,并指向系统表的相应条目。通常,系统打开文件表为每个文件关联一个打开计数器(Open Count),以记录多少进程打开了该文件。当文件不再使用时,利用系统调用 close 关闭它,会删除单个进程的打开文件表中的相应条目,系统表中的相应打开计数器也会递减。当打开计数器为 0 时,表示该文件不再被使用,并且可从系统表中删除相应条目。图 4.3 所示为内存中文件的系统结构。
图 4.3 内存中文件的系统结构
**前期通知** ▶ 文件名和文件描述符的应用场景(2012、2017、2024)
文件名不必是打开文件表的一部分,因为一旦完成对 FCB 在磁盘上的定位,系统就不再使
<!-- page: 268 -->
用文件名。对于访问打开文件表的索引号,UNIX 称之为文件描述符,而 Windows 称之为文件句柄。因此,只要文件未被关闭,所有文件操作都是通过文件描述符(而非文件名)来进行。
**注意**
只要完成了文件打开 open() 系统调用,后面再使用 read()、write()、Lseek()、close() 等文件操作的系统调用,就不再使用文件名,而使用文件描述符。读考点已反复考过多次。
每个打开文件都具有如下关联信息:
- 文件指针。系统跟踪上次的读/写位置作为当前文件位置的指针,这种指针对打开文件的某个进程来说是唯一的,因此必须与磁盘文件属性分开保存。
- 文件打开计数。计数器跟踪当前文件打开和关闭的数量。因为多个进程可能打开同一个文件,所以系统在删除打开文件条目之前,必须等待最后一个进程关闭文件。
- 文件磁盘位置。大多数文件操作要求系统修改文件数据。查找磁盘上的文件所需的信息保存在内存中,以便系统不必为每个操作都从磁盘上读取该信息。
- 访问权限。每个进程打开文件都需要有一个访问模式(创建、只读、读/写、添加等)。该信息保存在进程的打开文件表中,以便操作系统能够允许或拒绝后续的 I/O 请求。
## 4.1.4 文件的逻辑结构
文件的逻辑结构是指从用户角度出发所看到的文件的组织形式。而文件的物理结构(也称存储结构)是指将文件存储在外存上的存储组织形式,是用户所看不见的。文件的逻辑结构与存储介质特性无关,它实际上是指在文件的内部,数据在逻辑上是如何组织起来的。
按逻辑结构,文件可划分为无结构文件和有结构文件两大类。
### 1. 无结构文件
无结构文件是最简单的文件组织形式,它是由字符流构成的文件,所以也称滤式文件,其长度以字节为单位。对流式文件的访问,是通过读/写指针来指出下一个要访问的字节。在系统中运行的大量源程序、可执行文件、库函数等,所采用的就是无结构文件。无结构文件没有结构,因此对记录的访问只能通过穷举搜索的方式,因此这种文件形式对很多应用不适用。