操作系统文件管理习题
例题:
某系统文件采用混合索引的方式组织文件的数据存放,如上图所示,假定在文件的 \(INode\) 中设有13个地址项,其中直接索引10项,一次间接索引项1项,二次间接索引项1项,三次间接索引项1。数据块的大小为\(4KB\) ,磁盘地址用\(4B\)表示,试问:
-
这个文件系统允许的最大文件长度是多少?(等价问法 索引能访问到的地址空间总大小为多大)
-
假设文件目录存放在磁盘上。FCB占\(64B\),其中文件名占\(8B\) 。若某一目录文件共有\(1024\)个FCB。
2.1 查找该目录文件的某个FCB的平均访问磁盘次数 (注意 只能顺序访问,考虑什么时候为最佳/最坏访问情况)
2.2 在将FCB分解成两个部分,第一部分占\(16B\)(包括文件名和文件内部号),第二部分占\(56B\)(包括文 件内部号和文件的其他描述信息)的情况下,求解 2.1
-
若使用文件分配表(FAT)
3.1 对于\(540MB\)的硬盘,其FAT最少需要占用多少存储空间?
3.2 若FAT的每个表项仅存放数据块号,占\(2B\),则FAT的最大长度为多少字节?
-
在索引结点已放入内存的情况下,若要读取一个文件的第\(10000B\) 、\(4G\) 的内容,分别需要访问磁盘多少次?
-
一个\(4GB\)大小的文件,在这个文件系统中实际占用多少空间?
【解】
-
计算公式:\(所有索引节点指向的数据块的数目 × 数据块大小\)
在这里,一个直接块里存放的指针指向一个数据块。
- 直接块指向的数据块数目:10块,
(相关考法:当文件不超过多大时,可以只用直接块。\(直接块数目*数据块大小 = 10 * 4KB\))
-
一级间址块指向一个索引表,该索引表中指向数据块的指针数目:\(4KB/4B = 1024\)
-
二级间址块中存放的一级间址块数目:\(4KB/4B = 1024\) 块,又因为一个一级间块能指向1024个数据块,因此一个二级间块能指向\((1024)^2\)个数据块
-
类似的,三级间址块能指向\((1024)^3\)个数据块
所有索引节点指向的数据块数目为:\(M = 10+1024+1024^2+1024^3\)
故最大文件长度为:\(M*4KB\)
-
求解平均访问目录文件被装在不同的磁盘块的次数
-
1
-
目录文件总大小:\(M = FCB数目 * 单个FCB大小 = 1024 * 64B\)
-
装载目录文件所需的磁盘块数:\(\lceil M/数据块大小\rceil\) = \(\lceil(1024*64B)/4KB\rceil = 16\)
[最佳/差情况:所需访问的FCB位于第一/最后一个磁盘块]
- 平均访问16个磁盘查找目录项的次数:\(\frac {1+2+..+16}{16}=8.5次\)
-
-
2 因为原本整个FCB都是在目录中的,而分解之后将一部分(\(56B\))放在了目录之外,因此FCB占用的空间大小只有\(16B\)以便减少目录的体积,但是这样也造成了,当检索完全部目录项之后还需要额外的一次读磁盘操作以便找齐完整的FCB
-
目录文件总大小:\(M = FCB数目 * 16B = 1024 * 16B\)
-
装载目录文件所需的磁盘块数:\(\lceil M/数据块大小\rceil\) = \(\lceil(1024*16B)/4KB\rceil = 4\)
-
平均访问4个磁盘查找目录项的次数:\(t_1=\frac {1+2+..+4}{4}= 2.5次\)
-
查找完全部目录项之后再查找剩余的FCB信息的平均次数:\(t_2 = \frac {1+1+1+1}4 = 1\)次
因此FCB的平均次数为:\(t_1+t_2 = 2.5+1 = 3.5\)次
-
-
-
1
-
对于\(540MB\)大小的硬盘,硬盘的总块数为:\(N = 硬盘块总大小/数据块大小 = 540MB/4KB\)
-
要用FAT表来表示\(0\) ~\(N\)范围的硬盘快,则FAT的每个表项的表目需要的位数为:\(\lceil log_2N\rceil\) = \(18\) ,
转换为字节 => \(18/8 = 2.25B\)
- 又因为有\(N\)个硬盘总块数,因此FAT有\(N\)个(行)表项。这样FAT占用的总大小为:\(N*2.25B\)
-
-
2
- \(2B=16bit\),因此FAT表项可以表示的磁盘块的范围为:\(0\) ~ \(2^{15}-1\) ,由于磁盘块与表项一一对应,因此也可以得到表项数目为\(2^{16}\)
- FAT占用的总大小为:\(2^{16} * 2B\)
- \(10000B\)的内容存放在第\(\lceil10000B/4KB\rceil = 10\) (下标号为\(9\))个直接块中。
通过直接块中的指针去访问对应的磁盘,因此只需要访问磁盘一次即可。
- \(4GB的内容存放所需物理块数为:4GB/4KB = 2^{20}\)
所用块 所能表示物理块范围最大值 直接块 10 < \(2^{20}\) 直接块+一级间址 10 + \({{\frac{4KB}{4B}}^2}\) = 10 + \(2^{10}\) < \(2^{20}\) 直接块+一级间址+二级间址 10 + \({{\frac{4KB}{4B}}^2}\) + =\({{\frac{4KB}{4B}}^3}\) 10 + \(2^{10}\) +\(2^{20}\) > \(2^{20}\) 因此可以看出,\(4GB\)的内容存放在二级间址下的某个数据块中,
读取\(4GB\)的文件需要三次访问磁盘操作:
第一次从二级间址中获取一级索引结点表地址,并将其放入内存;第二次,从一级索引结点表中获取索引块地址,并将放入内存;第三次,从索引块中获取所需访问的最终文件的地址,并将相应页面调入内存。
-
该文件实际占用空间大小:\(\lfloor储存该文件索引块的大小\rceil + \lfloor该文件大小\rceil\)
-
由题4可知,储存\(4GB\)大小的文件需要用到直接块+一级间址+二级间址
-
因此与索引相关占用空间大小的有:\(n1\):13个\(INode\)结点;\(n2\):一级间址所指向的索引块;\(n3\):二级间址所指向的一级间址索引结点;\(n4\):一级间址索引结点所指向的索引块;
具体的可看下图:
- 其中不难发现,直接块
(对应INode中的第0~9号块)
,与一级间接址(对应INode中的第10号块)
下的全部物理块都将会被用到。因此,\(n2\)数量为1,\(n3\)数量为1。因此我们所需要求解的只有\(n4\)。
而求解\(n4\)可以利用物理块数量来进行逆向求解。
- \(4GB的内容存放所需物理块数为:N = 4GB/4KB = 2^{20}\) (对应上图中的粉色框框个数)
\(n4 = \lceil \frac{N - 直接块所表示的物理块数 - n2索引块所能表示的物理块数}{一个索引块能储存的地址数}\rceil\)
= \(\lceil \frac{2^{20} - 10 - 1024}{4KB/4B}\rceil\)
≈ 1023
- 由于\(n2、n3、n4\)均以一个物理块为单位,\(n1\)中的每一个分块储存着一个磁盘地址(4B)
此时便可以求得储存该文件索引块的大小:
=\((n2+n3+n4)*物理块大小 + n1*磁盘地址大小\)
=\((1+1+1023)*4KB+13*4B\)
- 因此该文件实际占用空间大小 = \((1+1+1023)*4KB + 13*4B + 4GB\)
-
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了