第四章 文件系统
1.在早期的UNIX系统中,可执行文件(a.out)以一个非常特別的魔数开始,这 个数不是随机选择的。这些文件都有文件头,后面是正文段和数据段。为什么要为可执行文件挑选一个非常特别的魔数,而其他类型文件的第一个字反而有一个或多或少是随机选择的魔数?
答:这些系统直接把程序载入内存,并且从word0(魔数)开始执行。为了避免将header作为代码执行,魔数是一条branch指令,其目标地址正好在header之上。按这种方法,就可能把二进制文件直接读取到新的进程地址空间,并且从 0 开始运行。
2.在图4-4中,一个属性是记录长度。为什么操作系统要关心这个属性?
答:当文件可以被构造为多个记录并且每个记录的特定位置具有键时,操作系统要关心记录长度这个属性,可以通过给定的键访问记录。在这种情况下,系统必须知道记录有多大,才可以通过键搜索到每个记录。
3.在UNIX中open系统调用绝对需要吗?如果没有会产生什么结果?
答:首先,如果没有open系统调用,每次读取文件都需要指定要打开的文件的名称。系统将必须获取其i节点,虽然可以缓存它,但面临一个问题是何时将i节点写回磁盘。可以在超时后写回磁盘,虽然这有点笨拙,但它可能起作用。
4.在支持顺序文件的系统中总有一个文件回绕操作,支持随机存取文件的系统是否也需要该操作?
答:否。如果要再次读取文件,只需随机访问字节0。
5.某一些操作系统提供系统调用rename给文件重命名,同样也可以通过把文件复制到新文件并删除原文件而实现文件重命名。请问这两种方法有何不同?
答:rename调用不会改变文件的创建时间和最后的修改时间,但是创建一个新的文件,其创建时间和最后的修改时间都会改为当前的系统时间。另外,如果磁盘满,复制可能会失败。
6.在有些系统中有可能把部分文件映射进内存中。如此一来系统应该施加什么限制?这种部分映射如何实现?
答:文件的映射部分必须以页边界开始,并且长度为整数页数。每个映射的页面使用文件本身作为后备存储。未映射的内存使用临时文件或分区作为后备存储。
7.有一个简单操作系统只支持单一目录结构,但是允许该目录中有任意多个文件,且带有任意长度的名字。这样可以模拟层次文件系统吗?如何进行?
答:使用文件名,如/usr/ast/file。虽然它看起来像一个层次化的路径名称,但它只是一个包含嵌入的斜杠的单一名称。
8.在UNIX 和Windows 中通过使用一个特殊的系统调用把文件的“当前位置”指针移到指定字节,从而实现了随机访问。请提出一个不使用该系统调用完成随机存取的替代方案。
答:一种方法是在读取系统调用中添加一个额外的参数,告诉你要读取哪个地址。 实际上,每次读取都有可能在文件中进行搜索。该方案的缺点是(1)每个读取调用都含有额外参数,以及(2)要求用户跟踪文件指针在哪里。
9.考虑图4-8中的目录树,如果当前工作目录是/usr/jim,则相对路径名为../ast/x的文件的绝对路径名是什么?
答:..将搜索移动到/usr,所以../ast就是/usr/ast。因此../ast/x与/usr/ast/x相同。
10.正如书中所提到的,文件的连续分配会导致磁盘碎片,因为当一个文件的长度不等于块的整数倍时,文件中的最后一个磁盘块中的空间会浪费掉,请问这是内碎片还是外碎片?并将它与先前一章的有关讨论进行比较。
答:由于这些被浪费的空间在分配单元(文件)之间,而不是在它们内部,因此,这是外部碎片。这类似于交换系统或者纯分段系统中出现的外部碎片。(原答案有误,应该是内碎片)
11.一种在磁盘上连续分配并且可以避免空洞的方案是,每次删除一个文件后就紧缩一下磁盘。由于所有的文件都是连续的,复制文件时需要寻道和旋转延迟以便读取文件,然后全速传送。在写回文件时要做同样的工作。假设寻道时间为5ms,旋转延迟为4ms,传送速率为8MB/s,而文件平均长度是8 KB,把一个文件读入内存并写回到磁盘上的一个新位置需要多长时间?运用这些数宇,计算紧缩16GB磁盘的一半需要多长时间?
答:传输前的延迟是9ms,传输速率是2^23B/s,文件大小是2^13B,故从内存读取或写回磁盘的时间都是9+2^13/2^23=9.977ms,总共复制一个文件需要 9.977*2=19.954ms。为了压缩16G磁盘,也就是2^20个文件,每个需要19.954ms,总共就需要20923s。因此,在每个文件删除后都压缩磁盘不是一个好办法。
12.基于前一个问题的答案,紧缩磁盘有什么作用吗?
答:因为在系统删除的所有文件都会以碎片的形式存在磁盘中,当碎片到达一定量磁盘就不能再装文件了,必须进行外部清理,所以紧缩磁盘会释放更多的存储空间,但在每个文件删除后都压缩磁盘不是一个好办法。
13.某些数字消费设备需要存储数据,比如存放文件等。给出一个现代设备的名字,该设备需要文件存储, 并且对文件运用连续分配空间的方法是不错的方法。 答:数码相机按顺序记录一系列照片,存储在某种非易失性存储媒介(例如,闪存)上。当照相机复位时,该媒介被清空。然后,按顺序依次记录一张照片,直到存储满,然后上载到硬盘上。对于这种应用,相机内部文件的连续文件系统时最理想。
14.MS-DOS如何在文件中实现随机访问?
答:它找到目录条目中第一个块的地址。然后它跟随FAT链中的指针链,直到它找到了它所需的块。然后它会为下一次read系统调用记住此块号。
15.考虑图4-13中的i节点。如果它含有用4个字节表示的10个直接地址,而且所有的磁盘块大小是1024KB,那么文件最大可能有多大?
答:由于1024KB = 2^20B,所以可以容纳的磁盘地址个数是2^20/4 =2^18个磁盘地址,间接块可以保存2^18个磁盘地址。与10个直接的磁盘地址一起,最大文件有262154块。由于每块为 1 MB,最大的文件是262154MB。
16.有建议说,把短文件的数据存在i节点之内会提高效率并且节省磁盘空间, 对于图4-13中的i节点,在i节点之内可以存放多少字节的数据?
答:必须有一种方式来标记磁盘地址保存数据,而不是指针。如果在属性之间的某处存在一点空余,可以使用它。这将留下所有九个指针的数据。如果每个指针是k个字节,那么存储的文件可能长达9k字节。如果属性中没有剩余位,则第一个磁盘地址可以保存无效地址,将以下字节标记为数据而不是指针。在这种情况下,最大文件为8k字节。
17.两个计算机科学系的学生Carolyn和Elinor正在讨论i节点。Carolyn认为存储器容量越来越大,价格越来越便宜,所以当打开文件时,直接取i节点的副本,放到内存i节点表中,建立一个新i节点将更简单、更快,没有必要搜索整个i节点来判断它是否已经存在。Elinor则不同意这一观点。他们两个人谁对?
答:Elinor是正确的。表格中同时有i节点的2个备份是灾难性的,除非都是只读的。最坏的情况就是当两个都同时被更新时。当把i节点写回磁盘时,后写入的会把先写入的删除,而磁盘块就丢失了。
18.说明硬连接优于符号链接的一个优点,并说明符号链接优于硬连接的一个优点。
答:硬连接无需额外的磁盘空间,而只需在i节点中记录有多少个链接。符号链接需要空间存储所指的文件的名称。符号链接可以指向其他机器上的文件,甚至是Internet上的文件。而硬连接只能指向其自己分区中的文件。
19.空闲磁盘空间可用空闲块表或位图来跟踪。假设磁盘地址需要D位,一个磁盘有B个块,其中有F个空闲。在什么条件下,空闲块表采用的空间少于位图? 设D为16位,请计算空闲磁盘空间的百分比。
答:每个磁盘地址需要D位,且有F个空闲块,故需要空闲表为DF位,采用位图则需要B位,当DF
20.一个空闲块位图开始时和磁盘分区首次初始化类似,比如:1000 0000 0000 0000(首块被根目录使用),系统总是从最小编号的盘块开始寻找空闲块,所以在有6块的文件A写入之后,该位图为1111 1110 0000 0000。请说明在完成如下每一个附加动作之后位图的状态:
a)写人有5块的文件B。
b)删除文件A。
c)写入有8块的文件C。
d)删除文件B。
答:
a)1111 1111 1111 0000
b)1000 0001 1111 0000
c)1111 1111 1111 1100
d)1111 1110 0000 1100
21.如果因为系统崩溃而使存放空闲磁盘块信息的空闲块表或位图完全丢失,会发生什么情况?有什么办法从这个灾难中恢复吗,还是与该磁盘彻底再见?分别就UNIX和FAT-16文件系统讨论你的答案。
答:这根本不是一个严重的问题。恢复是简单直接的,它只需要一些时间。恢复算法是列出所有文件中的所有块,并将补码作为新的空闲块表。在UNIX中,可以通过扫描所有i节点来完成。在FAT文件系统中,由于没有空闲块表,该问题不会发生。即使存在这样的情况,恢复它所需要做的工作是扫描FAT寻找空闲块。
22.Oliver Owl在大学计算中心的工作是更换用于通宵数据备份的磁带,在等待每盘磁带完成的同时,他在写一篇毕业论文,证明莎士比亚戏剧是由外星访客写成的。由于仅有一个系统,所以只能在正在做备份的系统上运行文本编辑程序。这样的安排有什么问题吗?
答:Oliver Owl的论文可能不会像他所希望的那么可靠。备份程序可能备份当前打开用于写入的文件,但是该文件中的数据的状态可能是不确定的。
23.在教材中我们详细讨论过增量转储。在Windows中很容易说明何时要转储一个文件,因为每个文件都有一个存档位。在UNIX中没有这个位,那么UNIX备份程序怎样知道哪个文件需要转储?
答:他们必须跟踪磁盘上的文件最后一次转储的时间。每次转储后,一个条目被附加到该文件上。在转储过程中,文件被读取,时间记录在最后一个条目上。任何从那以后被更改的文件都要被转储。
24.假设图4-25中的文件21自上次转储之后没有修改过,在什么情况下图4-26中的四张位图会不同?
答:(a)和(b)中,21不会被标记。在(c)中,没有变化。 在(d)中,21不会被标记。
25.有人建议每个UNIX文件的第一部分最好和其i节点放在同一个磁盘块中,这样做有什么好处?
答:许多UNIX文件很短。如果整个文件与i节点放在同一个磁盘块中,则只需要一个磁盘访问即可读取文件,而不是两个。即使对于较长的文件,也会有一点好处,因为需要更少的磁盘访问。
26.考虑图4-27。对某个特殊的块号,计数器的值在两个表中有没有可能都是数值2? 这个问题如何纠正?
答:这是不应该发生的,但由于Bug可能某个地方会发生这种问题。这意味着有些块会出现在两个文件中,而且在空闲块表中也会出现两次。修复这个问题的第一步是从空闲块表中删除这两个副本。接下来,必须获取一个空闲块,并将该错误块的内容复制到获取的空闲块中。最后,新获取的块的副本插到其中一个文件之中。这时,系统将再次一致。
27.文件系统的性能与高速缓存的命中率有很大的关系(即在高速缓存中找到所需块的概率)。从高速缓存中读取数据需要1ms,而从磁盘上读取需要40ms,若命中率为h,给出读取数据所需平均时间的计算公式。并画出h从0到1.0变化时的函数曲线。
答:平均时间 T = 1×h + 40×(1-h)=-39h+40ms。
28.考虑图4-21 背后的思想,目前磁盘平均寻道时间为8ms,旋转速率为15000rpm,每道为262 144 字节。对大小各为1KB、2KB和4KB的磁盘块,传送速率各是多少?
答:对于15000 rpm(每分钟旋转),每旋转一周需60/15000=0.004秒=4ms。那么读取k字节的平均存取时间为8ms(寻道时间)+ 2ms(旋转延迟:4ms/2)+(k/262144)×4ms(读取k字节的时间)。对于1 KB,2 KB,4 KB的块,访问时间分别为10.015625ms,10.03125ms和10.0625ms(几乎没有什么不同)。其数据速率分别为102240 KB/sec,204162 KB/sec,407056 KB/sec。
29.某个文件系统使用2KB的磁盘块,而中间文件大小值为1KB。如果所有的文件都是正好1KB大,那么浪费掉的磁盘空间的比例是多少?你认为一个真正的文件系统所浪费的空间比这个数值大还是小?请说明理由。
答:1KB/2KB×100%=50%。在实践中,每个文件系统都有大文件以及许多小文件。例如,32769字节的文件将使用17个磁盘块进行存储,得到的空间利用效率为32768/34816,约为94%。
30.MS-DOS的FAT-16表有64K个表项,假设其中的一位必须用于其他用途,这样该表就只有32768个表项了。如果没有其他修改,在这个条件下最大的MS-DOS文件有多大?
答:最大的块是32KB。最多有32,768个块,所以最大的文件将为1 GB。
31.MS-DOS中的文件必须在内存中的FAT-16表中竞争空间。如果某个文件使用了k个表项,其他任何文件就不能使用这k个表项,这样会对所有文件的总长度带来什么限制?
答:它将所有文件长度的总和限制为不大于磁盘。这不是一个非常严重的限制。 如果文件总和大于磁盘,则不会将其全部存储在磁盘上。
32.一个UNIX 系统使用1KB磁盘块和4字节磁盘地址。如果每个i节点中有10个直接表项以及一个一次间接块、一个二次间接块和一个三次间接块,那么文件的最大尺寸是多少?
答:由于1KB=1024B,所以1KB磁盘块可以容纳的磁盘地址个数是2^10B/4=256个。故一个一次间接块存储256个磁盘地址。一个二次间接块存储256^2个磁盘地址。一个三次间接块存储256^3磁盘地址。把这些全部加起来, 10+256+256^2+256^3=16843018块,每一块 1K,即16843018KB,约16.06 GB。
33.对于文件/usr/ast/courscs/os/handout.t,若要调入其i节点需要多少个磁盘操作? 假设其根目录的i节点在内存中,其他路径都不在内存中。并假设所有的目录都在一个磁盘块中。
答:需要以下磁盘读取操作:
(1) directory /
(2) i-node for /usr
(3) directory /usr
(4) i-node for /usr/ast
(5) directory /usr/ast
(6) i-node for /usr/ast/courses
(7) directory /usr/ast/courses
(8) i-node for /usr/ast/courses/os
(9)directory /usr/ast/courses/os/
(10)i-node for /usr/ast/courses/os/handout.t
一共需要10个磁盘读取操作。
34.在许多UNIX系统中, i节点存放在磁盘的开始之处。一种替代设计方案是,在文件创建时分配i节点,并把i节点存放在该文件首个磁盘块的开始之处。请讨论这个方案的优缺点。
答:一些优点如下:首先,没有磁盘空间浪费在未使用的i节点上。第二,用不完的i节点。第三,需要更少的磁盘移动,因为可以在一个操作中读取i节点和初始数据。一些缺点如下:首先,目录条目现在需要一个32位的磁盘地址,而不是一个16位的i节点号码。第二,对于不包含数据的文件(空文件,设备文件)也将使用整个磁盘块。第三,文件系统完整性检查将会更慢,因为需要为每个i节点读取整个块,并且i节点分散在磁盘上。第四,尺寸被仔细设计以适应块大小的文件因为i节点的存在将不再适合块大小,使得性能变差。
35.编写一个将文件字节倒写的程序,这样最后一个字节成为第一个字节,而第一个字节成为最后一个字节。程序必须适合任何长度的文件,并保持适当的效率。
答:略。
36.编写一个程序,该程序从给定的目录开始,从此点开始沿目录树向下,记录所找到的所有文件的大小。在完成这一切之后,该程序应该打印出文件大小分布的直方图,以该直方图的区间宽度为参数(比如,区间宽度为1024,那么大小为0~1023的文件同在一个区间宽度,大小为1024-2047的文件同在下一个区间宽度,如此类推)。
答:略。
37.编写一个程序,扫描UNIX文件系统中的所有目录,并发现和定位有两个或更多硬连接计数的i节点。对于每个这样的文件,列出指向该文件的所有文件的名称。
答:略。
38.编写UNIX的新版ls程序。这个版本将一个或多个目录名作为变量,并列出每个目录中所有的文件,一个文件一行。每个域应该对其类型进行合理的格式化。仅列出第一个磁盘地址(若该地址存在的话)。
答:略。