1
0
mirror of https://github.com/Didnelpsun/CS408.git synced 2026-11-05 22:57:46 +08:00

更新文件管理

This commit is contained in:
Didnelpsun
2021-08-27 23:32:57 +08:00
parent 09442f99a0
commit 72930d2d21
3 changed files with 428 additions and 217 deletions

View File

@@ -0,0 +1,189 @@
# 文件管理习题
## 文件系统
### 文件系统基础
#### 文件基本操作
**例题** 若一个用户进程通过$read$系统调用读取一个磁盘文件中的数据,则下列关于此过程的叙述中,正确的是()。
Ⅰ.若该文件的数据不在内存,则该进程进入睡眠等待状态
Ⅱ.请求$read$系统调用会导致$CPU$从用户态切换到核心态
Ⅲ.$read$系统调用的参数应包含文件的名称
$A.$仅Ⅰ、Ⅱ
$B.$仅Ⅰ、Ⅲ
$C.$仅Ⅱ、Ⅲ
$D.$Ⅰ、Ⅱ和Ⅲ
解:$A$。对于Ⅰ,当所读文件的数据不在内存时,产生中断(缺页中断),原进程进入阻塞态,直到所需数据从外存调入内存后,才将该进程唤醒。对于Ⅱ,$read$系统调用通过陷入将$CPU$从用户态切换到核心态,从而获取操作系统提供的服务。对于Ⅲ,要读一个文件,首先要用$open$系统调用打开该文件。$open$中的参数包含文件的路径名与文件名,而$read$只需使用$open$返回的文件描述符,并不使用文件名作为参数。$read$要求用户提供三个输入参数:①文件描述符$fd$;② $buf$缓冲区首址;③传送的字节数$n$。$read$的功能是试图从$fd$所指示的文件中读入$n$个字节的数据,并将它们送至由指针$buf$所指示的缓冲区中。
### 文件逻辑结构
**例题** 文件的逻辑结构是为了方便()而设计的。
$A.$存储介质特性
$B.$操作系统的管理方式
$C.$主存容量
$D.$用户
解:$D$。文件结构包括逻辑结构和物理结构。逻辑结构是用户组织数据的结构形式,数据组织形式来自需求,而物理结构是操作系统组织物理存储块的结构形式。因此说,逻辑文件的组织形式取决于用户,物理结构的选择取决于文件系统设计者针对硬件结构(如磁带介质很难实现链接结构和索引结构)所采取的策略(即$A$和$B$选项)。
### 文件共享
**例题** 若文件$f1$的硬链接为$f2$,两个进程分别打开$f1$和$f2$,获得对应的文件描述符为$fd1$和$fd2$,则下列叙述中正确的是()。
Ⅰ.$f1$和$f2$的读写指针位置保持相同
Ⅱ.$f1$和$f2$共享同一个内存索引结点
Ⅲ.$fd1$和$fd2$分别指向各自的用户打开文件表中的一项
$A.$仅Ⅲ
$B.$仅Ⅱ、Ⅲ
$c.$仅Ⅰ、Ⅱ
$D.$Ⅰ和Ⅱ、Ⅲ
解:$B$。硬链接指通过索引结点进行连接。一个文件在物理存储器上有一个索引结点号。存在多个文件名指向同一个索引结点的情况,Ⅱ正确。两个进程各自维护自己的文件描述符,Ⅲ正确,Ⅰ错误。
**例题** 若多个进程共享同一个文件$F$,则下列叙述中,正确的是()。
$A.$各进程只能用“读”方式打开文件$F$
$B.$在系统打开文件表中仅有一个表项包含$F$的属性
$C.$各进程的用户打开文件表中关于$F$的表项内容相同
$D.$进程关闭$F$时,系统删除$F$在系统打开文件表中的表项
解:$B$。多个进程可以同时以“读”或“写”的方式打开文件,操作系统并不保证写操作的互斥性,进程可通过系统调用对文件加锁,保证互斥写(读者-写者问题),$A$错误。整个系统只有一个系统打开文件表,同一个文件打开多次只需改变引用计数,$B$正确。用户进程的打开文件表关于同一个文件不一定相同,例如读写指针位置不一定相同,$C$错误。进程关闭文件时,文件的引用计数减$1$,引用计数变为$0$时才删除系统打开文件表中的表项,$D$错误。
### 文件保护
**例题** 对一个文件的访问,常由()共同限制。
$A.$用户访问权限和文件属性
$B.$用户访问权限和用户优先级
$C.$优先级和文件属性
$D.$文件属性和口令
解:$A$。对于这道题,只要能区分用户的访问权限和用户优先级,就能得到正确的答案。用户访问权限是指用户有没有权限访问该文件,而用户优先级是指在多个用户同时请求该文件时应该先满足谁。比如,图书馆的用户排队借一本书,某用户可能有更高的优先级,即他排在队伍的前面,但有可能轮到他时被告知他没有借阅那本书的权限。文件的属性包括保存在$FCB$中对文件访问的控制信息。
**例题** 加密保护和访问控制两种机制相比,()。
$A.$加密保护机制的灵活性更好
$B.$访问控制机制的安全性更高
$C.$加密保护机制必须由系统实现
$D.$访问控制机制必须由系统实现
解:$D$。相对于加密保护机制,访问控制机制的安全性较差。因为访问控制的级别和保护力度较小,因此它的灵活性相对较高。若访问控制不由系统实现,则系统本身的安全性就无法保证。加密机制若由系统实现,则加密方法将无法扩展。
**例题** 某文件系统中,针对每个文件,用户类别分为$4$类:安全管理员、文件主、文件主的伙伴、其他用户;访问权限分为$5$种:完全控制、执行、修改、读取、写入。若文件控制块中用二进制位串表示文件权限,为表示不同类别用户对一个文件的访问权限,则描述文件权限的位数至少应为()。
$A.5$
$B.9$
$C.12$
$D.20$
解:$D$。同一类用户可能有所有可能的权限中的任一组合,所以可以把用户访问权限抽象为一个矩阵,行代表用户,列代表访问权限。这个矩阵有$4$行$5$列,$1$代表$true$,$0$代表$false$,所以需要$4\times5=20$位,选$D$。
### 文件物理结构
#### 链接分配
**例题** 设有一个记录文件,采用链接分配方式,逻辑记录的固定长度为$100B$,在磁盘上存储时采用记录成组分解技术。盘块长度为$512B$。若该文件的目录项已经读入内存,则对第$22$个逻辑记录完成修改后,共启动了磁盘()次。
$A.3$
$B.4$
$C.5$
$D.6$
解:$D$。第$22$个逻辑记录对应$4$($22\times100\div512=4$,余$152$)个物理块,即读入第$5$个物理块,由于文件采用的物理结构是链接文件,因此需要从目录项所指的第一个物理块开始读取,依次读到第$4$块才得到第$5$块的物理地址,共启动磁盘$5$次。修改还需要写回操作,由于写回时已获得该块的物理地址,只需$1$次访问磁盘,因此共需要启动磁盘$6$次。
#### 索引分配
**例题** 假设磁盘块大小为$1KB$,一个索引表项占$4B$,求文件最大长度。
解:若磁盘块大小为$1KB$,一个索引表项占$4B$,则一个磁盘块只能存放$1\times1024\div4=256$个索引项。
若某文件采用两层索引,则该文件的最大长度,就是所有索引都用来指向一个文件的数据,所以可以到$256\times256\times1KB=65536KB=64MB$。
**例题** 设文件索引结点中有$7$个地址项,其中$4$个地址项是直接地址索引,$2$个地址项是一级间接地址索引,$1$个地址项是二级间接地址索引,每个地址项大小为$4B$若磁盘索引块和磁盘数据块大小均为$256B$,则可表示的单个文件最大长度是()。
$A.33KB$
$B.519KB$
$C.1057KB$
$D.16516KB$
解:每个磁盘索引块和磁盘数据块大小均为$256B$,每个磁盘索引块有$256\div4=64$个地址项。因此,$4$个直接地址索引指向的数据块大小为$4\times256B$;$2$个一级间接索引包含的直接地址索引数为$2\times(256\div4)$,即其指向的数据块大小为$2\times(256\div4)\times256B$。$1$个二级间接索引所包含的直接地址索引数为$(256\div4)\times(256\div4)$,即其所指向的数据块大小为$(256\div4)\times(256\div4)\times256B$。因此,$7$个地址项所指向的数据块总大小为$4\times256+2\times(256\div4)\times256+(256\div4)\times(256\div4)\times256=1082368B=1057KB$。
**例题** 某文件系统的目录项由文件名和索引结点号构成。若每个目录项长度为$64$字节,其中$4$字节存放索引结点号,$60$字节存放文件名。文件名由小写英文字母构成,则该文件系统能创建的文件数量的上限为()。
$A.2^{26}$
$B.2^{32}$
$C.2^{60}$
$D.2^{64}$
解:$B$。此题容易按照$60$位来计算,任务$60$字节就可以表示出$2^{60}$种不同的名称组合。但是实际上只需要看索引节点长度,因为索引长度代表可支持的索引数量的数量大小,而不同的文件目录可以同名,所以只用看索引节点的个数就可以了,$4B=32bit$,所以就是$2^{32}$个。
#### 检索方法
**例题** 下列关于目录检索的论述中,正确的是()。
$A.$由于散列法具有较快的检索速度,因此现代操作系统中都用它来替代传统的顺序检索方法
$B.$在利用顺序检索法时,对树形目录应采用文件的路径名,且应从根目录开始逐级检索
$C.$在利用顺序检索法时,只要路径名的一个分量名未找到,就应停止查找
$D.$利用顺序检索法查找完成后,即可得到文件的物理地址
解:$C$。选项$A$中的方法不利于对文件顺序检索,也不利于文件枚举,一般采用线性检索法;选项$B$中,为了加快文件查找速度,可以设立当前目录,于是文件路径可从当前目录进行查找;选项$D$中,在顺序检索法查找完成后,得到的是文件的逻辑地址。
### 文件存储空间管理
#### 位示图
若序号从$1$开始,$i$代表行,$j$代表列,$n$为字长,即每行位数,盘块号为$b=n(i-1)+j$,$i=(b-1)\div n+1$,$j=(b-1)\mod n+1$。
若用$8$个字(字长$32$位)组成的位示图管理内存,假定用户归还一个块号为$100$的内存块时,它对应位示图的位置为()。
$A.$字号为$3$,位号为$5$
$B.$字号为$4$,位号为$4$
$C.$字号为$3$,位号为$4$
$D.$字号为$4$,位号为$5$
解:$B$。$8$个字,字长$32$位,则代表位图为$8$行$32$列。字号就是行号:$(100-1)\div32+1=4$,位号就是列号:$(100-1)\mod32+1=4$。

View File

@@ -14,6 +14,7 @@
+ 记录:一组相关数据项的集合,用于表述一个对象在某方面的属性。
+ 文件:一组有意义的信息/数据的集合。
+ 操作系统以“块”为单位为文件分配存储空间,外存中的数据读入内存同样以块为单位。
+ $UNIX$操作系统中,所有设备都被视为特殊文件。因为访问设备方式与访问文件方式相同。
#### 文件基本属性
@@ -40,14 +41,6 @@
#### 文件打开关闭
+ 操作系统会维护一个包含所有打开文件信息的表(打开文件表),首次使用时会将文件属性从外存赋值到内存的打开文件表中的一个表目并返回索引。所以用户进行文件操作就直接通过索引,省略了搜索。一般会根据这个指针进行文件操作。当不使用,进程会关闭文件并删除这个表目。
+ 整个系统表包含进程相关信息,如文件在磁盘的位置、访问日期和大小。一个进程打开一个文件,系统打开文件表就会为打开的文件增加相应的条目。当另一个进程执行open时,只不过是在其进程打开表中增加一个条目,并指向整个系统表的相应条目。通常,系统打开文件表的每个文件时,还用一个文件打开计数器($Open\,Count$),以记录多少进程打开了该文件。每个关闭操作$close$使$count$递减,当打开计数器为$0$时,表示该文件不再被使用,系统将回收分配给该文件的内存空间等资源。若文件被修改过,则将文件写回外存,并将系统打开文件表中的相应条目删除,最后释放文件的文件控制块($File\,Control\,Block$,$FCB$)。
+ 每个打开文件都有如下关联信息:
+ 文件指针。系统跟踪上次的读写位置作为当前文件位置的指针,这种指针对打开文件的某个进程来说是唯一的,因此必须与磁盘文件属性分开保存。
+ 文件打开计数。文件关闭时,操作系统必须重用其打开文件表条目,否则表内空间会不够用。因为多个进程可能打开同一个文件,所以系统在删除打开文件条目之前,必须等待最后一个进程关闭文件。计数器跟踪打开和关闭的数量,计数为$0$时,系统关闭文件,删除该条目。
+ 文件磁盘位置。绝大多数文件操作都要求系统修改文件数据。该信息保存在内存中,以免为每个操作都从磁盘中读取。
+ 访问权限。每个进程打开文件都需要有一个访问模式(创建、只读、读写、添加等)。该信息保存在进程的打开文件表中,以便操作系统能够允许或拒绝之后的$I/O$请求。
打开文件:
+ 在很多操作系统中,在对文件进行操作之前,要求用户先使用$open$系统调用“打开文件”,需要提供的几个主要参数:
@@ -62,6 +55,13 @@
2. 每一个进程的打开文件表,包括编号、文件名、读写指针、访问权限、系统表索引号等。
+ 打开文件时并不会把文件数据直接读入内存,而是提供索引号。“索引号”也称“文件描述符”。
每个打开文件都有如下关联信息:
+ 文件指针。系统跟踪上次的读写位置作为当前文件位置的指针,这种指针对打开文件的某个进程来说是唯一的,因此必须与磁盘文件属性分开保存。
+ 文件打开计数。文件关闭时,操作系统必须重用其打开文件表条目,否则表内空间会不够用。因为多个进程可能打开同一个文件,所以系统在删除打开文件条目之前,必须等待最后一个进程关闭文件。计数器跟踪打开和关闭的数量,计数为$0$时,系统关闭文件,删除该条目。
+ 文件磁盘位置。绝大多数文件操作都要求系统修改文件数据。该信息保存在内存中,以免为每个操作都从磁盘中读取。
+ 访问权限。每个进程打开文件都需要有一个访问模式(创建、只读、读写、添加等)。该信息保存在进程的打开文件表中,以便操作系统能够允许或拒绝之后的$I/O$请求。
关闭文件:
+ 用户使用$close$系统调用“打开文件”,需要提供的几个主要参数:
@@ -121,6 +121,7 @@
+ 每当要增加/删除一个记录时,需要对索引表进行修改。由于索引文件有很快的检索速度,因此主要用于对信息处理的及时性要求比较高的场合。
+ 可以使用不同的数据项对一组数据建立多个索引表。
+ 索引表其实是索引顺序结构的。
+ 对于$N$条记录的顺序文件,查找关键字记录需要$N/2$次,在索引顺序文件中,将其分为$\sqrt{N}$组,每组$\sqrt{N}$条记录,所以索引表查找需要$\dfrac{\sqrt{N}}{2}$次,主文件顺序查找也需要$\dfrac{\sqrt{N}}{2}$次,所以一共需要查找$\sqrt{N}$次。
#### 索引顺序文件
@@ -192,21 +193,32 @@
#### 硬链接
+ 在文件目录中提到,索引结点,是一种文件目录瘦身策略。由于检索文件时只需用到文件名,因此可以将除了文件名之外的其他信息放到索引结点中。这样目录项就只需要包含文件名、索引结点指针。
+ 索引结点中设置一个链接计数变量count,用于表示链接到本索引结点上的用户目录项数。
+ 索引结点中设置一个链接计数变量$count$,用于表示链接到本索引结点上的用户目录项数。
+ 不同目录下对于同一个文件的索引结点的命名可以是不同的。
+ 若某个用户决定“删除”该文件,则只是要把用户目录中与该文件对应的目录项删除,且索引结点的count值减1。
+ 若count>0,说明还有别的用户要使用该文件,暂时不能把文件数据删除,否则会导致指针悬空。
+ 若count=0,则系统需要删除文件。
+ 若某个用户决定“删除”该文件,则只是要把用户目录中与该文件对应的目录项删除,且索引结点的$count$值减$1$。
+ 若$count>0$,说明还有别的用户要使用该文件,暂时不能把文件数据删除,否则会导致指针悬空。
+ 若$count=0$,则系统需要删除文件。
#### 软链接
+ 软链接就是共享时建立一个Link类型的文件,记录了要共享的文件的存放路径或任意一条硬链接路径,类似Windows系统的快捷方式。
+ 当访问共享文件时,回首先判断这个文件属于Link类型文件,然后根据其中记录的路径层层查找路径找到索引结点。
+ 若共享文件被删除了,则软链接失效。
+ 因为软链接访问共享文件时需要查询多层目录,所以有多层$I/O$操作,从而软链接访问速度慢于硬链接。
+ 软链接就是共享时建立一个$Link$类型的文件,文件记录了要共享的文件的存放路径或任意一条硬链接路径,类似$Windows$系统的快捷方式。
+ 文件拥有者才拥有指向其索引结点的指针,而共享该文件的其他用户只有该文件的路径名。
+ 当访问共享文件时,先判断这个文件属于$Link$类型文件,然后根据其中记录的路径层层查找路径找到索引结点。
+ 优点:
+ 网络共享只用提供文件所在机器的网络地址和文件路径。
+ 若共享文件被删除了,则软链接失效。删除软链接则无影响。
+ 缺点:
+ 当共享文件删除,而其他用户新建一个相同路径的文件则原链接指向的是新文件而不是原文件。
+ 因为软链接访问共享文件时需要查询多层目录,所以有多层$I/O$操作,从而软链接访问速度慢于硬链接。
硬链接和软链接都是静态共享方式,都存在一个共同的问题,每个共享文件都有几个文件名,从而每增加一条文件名,当遍历整个文件系统时会多次遍历到该共享文件。
多个进程同时对同一个文件操作称为动态共享。
### 文件保护
口令保护和加密保护是为了防止用户文件被他人存取,而访问控制用于控制用户对文件的访问方式。
#### 口令保护
+ 为文件设置一个“口令”,用户请求访问该文件时必须提供“口令”。
@@ -224,7 +236,7 @@
#### 访问控制
+ 在每个文件的$FCB$(或索引结点)中增加一个访问控制列表(AccessControl List,ACL),该表中记录了各个用户可以对该文件执行哪些操作。
+ 在每个文件的$FCB$(或索引结点)中增加一个访问控制列表($AccessControl\,List$,$ACL$),该表中记录了各个用户可以对该文件执行哪些操作。
+ 访问类型包括:
+ 读:从文件中读数据。
+ 写:向文件中写数据。
@@ -232,11 +244,45 @@
+ 添加:将新信息添加到文件结尾部。
+ 删除:删除文件,释放空间。
+ 列表清单:列出文件名和文件属性。
+ 优点:可以使用复杂的访问方法。
+ 缺点:长度无法余集且可能导致复杂的空间管理。
+ 有的计算机可能会有很多个用户,因此访问控制列表可能会很大,可以用精简的访问列表解决这个问题。
+ 精简的访问列表:以“组”为单位,标记各“组”用户可以对文件执行哪些操作。当某用户想要访问文件时,系统会检查该用户所属的分组是否有相应的访问权限。所以系统也需要管理分组的信息。
+ 用户类型:
+ 拥有者:创建文件用户。
+ 组:一组需要共享文件且拥有类似访问的用户。
+ 其他:系统内其他所有用户。
+ 若想要让某个用户能够获取某种权限,需要把该用户放入有该权限的分组即可。
+ 如果对某个目录进行了访问权限的控制,那也要对目录下的所有文件进行相同的访问权限控制。
### 文件系统层次结构
1. 设备。
2. 相关模块
+ 辅助分配模块:管理辅存空间。即负责分配和回收存储空间。
+ 设备管理模块:管理设备。直接与硬件交互,负责和硬件直接相关的一些管理工作。如分配设备、分配设备缓冲区、磁盘调度、启动设备、释放设备等。
3. 物理文件系统:物理地址转换。这一层需要把上一层提供的文件逻辑地址转换为实际的物理地址。
4. 逻辑文件系统与文件信息缓冲区:逻辑地址转换。用户指明想要访问文件记录号,这一层需要将记录号转换为对应的逻辑地址。文件信息缓冲区用来在调入索引表到内存时暂存索引表的内容。
5. 存取控制模块:文件保护。为了保证文件数据的安全,还需要验证用户是否有访问权限。
6. 文件目录系统:管理文件目录。用户是通过文件路径来访问文件的,因此这一层需要根据用户给出的文件路径找到相应的$FCB$或索引结点。所有和目录、目录项相关的管理工作都在本层完成,如管理活跃的文件目录表、管理打开文件表等。
7. 用户接口:向用户提供文件目录相关功能接口。这层就是用于处理用户发出的系统调用请求($read$、$write$、$open$、$close$等系统调用)。
8. 用户/应用程序。
假设某用户请求删除文件“$D:$/工作目录/学生信息.$xlsx$”的最后$100$条记录:
1. 用户需要通过操作系统提供的接口发出上述请求——用户接口。
2. 由于用户提供的是文件的存放路径,因此需要操作系统一层一层地查找目录,找到对应的目录项――文件目录系统
3. 不同的用户对文件有不同的操作权限,因此为了保证安全,需要检查用户是否有访问权限―-存取控制模块(存取控制验证层)。
4. 验证了用户的访问权限之后,需要把用户提供的“记录号”转变为对应的逻辑地址――逻辑文件系统与文件信息缓冲区。
5. 知道了目标记录对应的逻辑地址后,还需要转换成实际的物理地址――物理文件系统。
6. 要删除这条记录,必定要对磁盘设备发出请求――设备管理程序模块。
7. 删除这些记录后,会有一些盘块空闲,因此要将这些空闲盘块回收――辅助分配模块。
目录实现:
+ 线性列表。
+ 哈希表。
### 文件物理结构
文件物理结构即文件分配方式,是对非空间磁盘块的管理。
@@ -275,15 +321,17 @@
+ 缺点:
+ 只支持顺序访问,不支持随机访问,查找效率低。
+ 指向下一个盘块的指针也需要耗费少量的存储空间。
+ 存储稳定性不足,若是中间毁坏后面的数据也会丢失。
+ 显式链接:
+ 类似静态链表。
+ 把用于链接文件各物理块的指针显式地存放在一张表中。即文件分配表(FAT,File Allocation Table)。FAT包含物理块号和下一块指针两项。
+ 把用于链接文件各物理块的指针显式地存放在一张表中。即文件分配表($FAT$,$File\,Allocation\,Table$)。$FAT$包含物理块号和下一块指针两项。
+ $FCB$目录中只需记录文件的起始块号。
+ 一个磁盘仅设置一张FAT。开机时,将FAT读入内存,并常驻内存。所以地址转换不需要读取内存,从而效率更高。
+ FAT的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的。
+ 地址转换:目录项中找到起始块号,若i>0,则查询内存中的文件分配表FAT,往后找到i号逻辑块对应的物理块号。逻辑块号转换成物理块号的过程不需要读磁盘操作。
+ 一个磁盘仅设置一张$FAT$。开机时,将$FAT$读入内存,并常驻内存。所以地址转换不需要读取内存,从而效率更高。
+ $FAT$的各个表项在物理上连续存储,且每一个表项长度相同,因此“物理块号”字段可以是隐含的。
+ 地址转换:目录项中找到起始块号,若$i>0$,则查询内存中的文件分配表$FAT$,往后找到$i$号逻辑块对应的物理块号。逻辑块号转换成物理块号的过程不需要读磁盘操作。
+ 优点:
+ 很方便文件拓展,不会有碎片问题,外存利用率高。
+ 很方便文件拓展。
+ 不会有外部碎片问题,外存利用率高。
+ 支持随机访问。
+ 相比于隐式链接来说,地址转换时不需要访问磁盘,因此文件的访问效率更高。
+ 缺点:文件分配表的需要占用一定的存储空间。
@@ -293,31 +341,33 @@
+ 允许文件离散地分配在各个磁盘块中,系统会为每个文件建立一张索引表,索引表中记录了文件的各个逻辑块对应的物理块(索引表的功能类似于内存管理中的页表——建立逻辑页面到物理页之间的映射关系)。索引表存放的磁盘块称为索引块。文件数据存放的磁盘块称为数据块。
+ 索引表包含逻辑块号和物理块号两项。逻辑块号可以是隐含的。
+ 每一个文件都有一个索引表。
+ 地址转换:从目录项中可知索引表存放位置,将索引表从外存读入内存,并查找索引表即可只i号逻辑块在外存中的存放位置。
+ 地址转换:从目录项中可知索引表存放位置,将索引表从外存读入内存,并查找索引表即可只$i$号逻辑块在外存中的存放位置。
+ 优点:
+ 很方便文件拓展,不会有碎片问题,外存利用率高。
+ 支持随机访问。
+ 缺点:文件索引表的需要占用一定的存储空间。
+ 文件大小过大的解决方案:
+ 链接方案:
+ 分配多个索引块并链接起来。
+ 文件$FCB$中只需要记录第一个索引块的块号。
+ 缺点:查找效率低。
+ 多层索引:
+ 建立类似多级页表的多层索引,使上层索引块指向下一层的索引块。
+ $FCB$中只需要记录顶层索引块就可以了。
+ 若采用多层索引,则各层索引表大小不能超过一个磁盘块。理由同多级页表。
+ 采用K层索引结构,且顶级索引表未调入内存,则访问一个数据块只需要K+1次读磁盘操作。
+ 缺点:即使是小文件页需要K+1次读磁盘操作。
+ 混合索引:
+ 多种索引分配方式的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表)。
+ 优点:对于小文件,只需较少的读磁盘次数就可以访问目标数据块。(一般计算机中小文件更多)。
**例题** 假设磁盘块大小为1KB,一个索引表项占4B,求文件最大长度。
索引块必须不能太大,但是索引块太小就无法支持大文件,解决方案:
若磁盘块大小为1KB,一个索引表项占4B,则一个磁盘块只能存放1×1024÷4=256个索引项。
+ 链接方案:
+ 分配多个索引块并链接起来。
+ 文件$FCB$中只需要记录第一个索引块的块号。
+ 缺点:查找效率低。
+ 多层索引:
+ 建立类似多级页表的多层索引,使上层索引块指向下一层的索引块。
+ $FCB$中只需要记录顶层索引块就可以了。
+ 若采用多层索引,则各层索引表大小不能超过一个磁盘块。理由同多级页表。
+ 采用$K$层索引结构,且顶级索引表未调入内存,则访问一个数据块只需要$K+1$次读磁盘操作。
+ 缺点:即使是小文件页需要$K+1$次读磁盘操作。
+ 混合索引:
+ 多种索引分配方式的结合。例如,一个文件的顶级索引表中,既包含直接地址索引(直接指向数据块),又包含一级间接索引(指向单层索引表)、还包含两级间接索引(指向两层索引表)。
+ 优点:对于小文件,只需较少的读磁盘次数就可以访问目标数据块。(一般计算机中小文件更多)。
若某文件采用两层索引,则该文件的最大长度,就是所有索引都用来指向一个文件的数据,所以可以到256×256×1KB= 65536KB= 64MB。
 |访问第n条记录|优点|缺点
:----:|:----------:|:---:|:--:
连续分配|需访问磁盘1次|顺序存取时速度快,文件定长时可根据文件起始地址及记录长度进行随机访问|文件存储要求连续的存储空间,会产生碎片,不利于文件的动态扩充
链接分配|需访问磁盘n次|可解决外存的碎片问题,提高外存空问的利用率,动态增长较方便|只能按照文件的指针链顺序访问,查找效率低,指针信息存放消耗外存空间
索引分配|m级需访问磁盘m+1次|可以随机访问,文件易于增删|索引表增加存储空间的开销,索引表的查找策略对文件系统效率影响较大
### 文件存储空间管理
@@ -348,36 +398,36 @@
+ 空闲盘块法:
+ 以盘块为单位组成一条空闲链。空闲盘块中存储着下一个空闲盘块的指针。
+ 操作系统保存着链头、链尾指针。
+ 如何分配:若某文件申请K个盘块,则从链头开始依次摘下K个盘块分配,并修改空闲链的链头指针。
+ 如何分配:若某文件申请$K$个盘块,则从链头开始依次摘下$K$个盘块分配,并修改空闲链的链头指针。
+ 如何回收:回收的盘块依次挂到链尾,并修改空闲链的链尾指针。
+ 适用于离散分配的物理结构。为文件分配多个盘块时可能要重复多次操作。
+ 空闲盘区法:
+ 以盘区为单位组成一条空闲链。由连续的几个盘块组成一个盘区。每一个盘区内的第一个盘块内记录了盘区的长度和下一个盘区的指针。
+ 操作系统保存着链头、链尾指针。
+ 如何分配:若某文件申请K个盘块,则可以采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到一个大小符合要求的空闲盘区,分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针、盘区大小等数据。
+ 如何回收:若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到链尾。
+ 如何分配:若某文件申请$K$个盘块,则可以采用首次适应、最佳适应等算法,从链头开始检索,按照算法规则找到一个大小符合要求的空闲盘区,分配给文件。若没有合适的连续空闲块,也可以将不同盘区的盘块同时分配给一个文件,注意分配后可能要修改相应的链指针、盘区大小等数据。
+ 如何回收:若回收区和某个空闲盘区相邻,则需要将回收区合并到空闲盘区中。若回收区没有和任何空闲区相邻,将回收区作为单独的一个空闲盘区挂到链尾。
+ 离散分配、连续分配都适用。为一个文件分配多个盘块时效率更高。
#### 位示图法
+ 每个二进制位对应一个盘块。如“0”代表盘块空闲,“1”代表盘块已分配。
+ 位示图一般用连续的“字”来表示,如一个字的字长是16位,则一共有16列,字中的每一位对应一个盘块。因此可以用(字号,位号)对应一个盘块号。当然有的题目中也描述为(行号,列号)。
+ 若盘块号、字号、位号从0开始,若n表示字长,则(字号,位号)=(i,j)的二进制位对应的盘块号b=ni+j。
+ b号盘块对应的字号i= b÷n,位号j= b%n。
+ 如何分配:若文件需要K个块,
1. 顺序扫描位示图,找到K个相邻或不相邻的“0”。
+ 每个二进制位对应一个盘块。如“$0$”代表盘块空闲,“$1$”代表盘块已分配。
+ 位示图一般用连续的“字”来表示,如一个字的字长是$16$位,则一共有$16$列,字中的每一位对应一个盘块。因此可以用(字号,位号)对应一个盘块号。当然有的题目中也描述为(行号,列号)。
+ 若盘块号、字号、位号从$0$开始,若$n$表示字长,则(字号,位号)=$(i,j)$的二进制位对应的盘块号$b=ni+j$。
+ $b$号盘块对应的字号$i=b\div n$,位号$j=b\%n$。
+ 如何分配:若文件需要$K$个块,
1. 顺序扫描位示图,找到$K$个相邻或不相邻的“$0$”。
2. 根据字号、位号算出对应的盘块号,将相应盘块分配给文件。
3. 将相应位设置为“1”。
3. 将相应位设置为“$1$”。
+ 如何回收:
1. 根据回收的盘块号计算出对应的字号、位号。
2. 将相应二进制位设为“0”。
2. 将相应二进制位设为“$0$”。
+ 离散分配、连续分配都适用。
#### 成组链接法
+ 空闲表法、空闲链表法不适用于大型文件系统,因为空闲表或空闲链表可能过大。UNX系统中采用了成组链接法对磁盘空闲块进行管理。
+ 文件卷的目录区中专门用一个磁盘块作为“超级块”,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的“超级块”数据一致。
+ 将空闲块分成若干组,每100个空闲块为一组,每组的第一空闲块登记了下一组空闲块的物理盘块号和空闲块总数。组内索引,组间链接。
+ 空闲表法、空闲链表法不适用于大型文件系统,因为空闲表或空闲链表可能过大。$UNIX$系统中采用了成组链接法对磁盘空闲块进行管理。
+ 文件卷的目录区中专门用一个磁盘块作为**超级块**,当系统启动时需要将超级块读入内存。并且要保证内存与外存中的超级块数据一致。
+ 将空闲块分成若干组,如每$100$个空闲块为一组,每组的第一空闲块登记了下一组空闲块的物理盘块号和空闲块总数。组内索引,组间链接。
+ 一个分组的块号不需要连续。
+ 如何分配:
1. 检测第一个分组的块数是否足够。
@@ -387,30 +437,6 @@
1. 如果块内回收后余留,则修改数据。
2. 若回收数量大于等于余下,需要将超级块中的数据复制到新回收的块中,并修改超级块的内容,让新回收的块成为第一个分组。
### 文件系统层次结构
1. 设备。
2. 相关模块
+ 辅助分配模块:负责文件存储空间的管理,即负责分配和回收存储空间。
+ 设备管理模块:直接与硬件交互,负责和硬件直接相关的一些管理工作。如分配设备、分配设备缓冲区、磁盘调度、启动设备、释放设备等。
3. 物理文件系统:这一层需要把上一层提供的文件逻辑地址转换为实际的物理地址。
4. 逻辑文件系统与文件信息缓冲区:用户指明想要访问文件记录号,这一层需要将记录号转换为对应的逻辑地址。文件信息缓冲区用来在调入索引表到内存时暂存索引表的内容。
5. 存取控制模块:为了保证文件数据的安全,还需要验证用户是否有访问权限。这一层主要完成了文件保护相关功能。
6. 文件目录系统:用户是通过文件路径来访问文件的,因此这一层需要根据用户给出的文件路径找到相应的$FCB$或索引结点。所有和目录、目录项相关的管理工作都在本层完成,如管理活跃的文件目录
表、管理打开文件表等。
7. 用户接口:文件系统需要向上层的用户提供一些简单易用的功能接口。这层就是用于处理用户发出的系统调用请求(Read、Write、Open、Close等系统调用)。
8. 用户/应用程序。
假设某用户请求删除文件“D:/工作目录/学生信息.xlsx”的最后100条记录:
1. 用户需要通过操作系统提供的接口发出上述请求——用户接口。
2. 由于用户提供的是文件的存放路径,因此需要操作系统一层一层地查找目录,找到对应的目录项――文件目录系统
3. 不同的用户对文件有不同的操作权限,因此为了保证安全,需要检查用户是否有访问权限―-存取控制模块(存取控制验证层)。
4. 验证了用户的访问权限之后,需要把用户提供的“记录号”转变为对应的逻辑地址――逻辑文件系统与文件信息缓冲区。
5. 知道了目标记录对应的逻辑地址后,还需要转换成实际的物理地址――物理文件系统。
6. 要删除这条记录,必定要对磁盘设备发出请求――设备管理程序模块。
7. 删除这些记录后,会有一些盘块空闲,因此要将这些空闲盘块回收――辅助分配模块。
## 磁盘管理
### 磁盘结构