40.1
用一些不同的随机种子(比如17、18、19、20)运行模拟器,看看你是否能确定每次状态变化之间一定发生了哪些操作。
解:
运行指令:./vsfs.py -s 17 -c
可以得到如下的结果:
根据运行结果,我们可以知道这里首先使用mkdir来创建目录,所以在mkdir前后的位图以及数据块,我们可以发现如下的区别:
inode bitmap中有一位从0变成了1,表示有一块inodes变得有效,其中储存的就是这个目录的所有信息。(元数据)
data bitmap有一位从0变成了1,表示有一块data变成有效,其中储存的就是其中的数据。
知道了如何创建目录,接下来我们看到unlink指令,根据相关知识我们可以知道这个指令是来删除文件的。
使用这个指令之后,我们发现之前creat所创建的文件所修改的位图和实际的数据块被删除,也就是和creat未创建前的状态相同。
别的情况与之类似。
运行指令:./vsfs.py -s 18 -c
可以得到如下的结果:
发现与上面的分析类似。这里只是多了一条文件的读写,也就是打开文件后写入一个字符串,然后关闭文件。
运行指令:./vsfs.py -s 19 -c
可以得到如下的结果:
运行指令:./vsfs.py -s 20 -c
可以得到如下的结果:
40.2
现在使用不同的随机种子(比如21、22、23、24),但使用-r标志运行,这样做可以让你在显示操作时猜测状态的变化。关于inode和数据块分配算法,根据它们喜欢分配的块,你可以得出上面结论。
解:
随机种子21的情况:
运行指令:./vsfs.py -s 21 -r -c
运行的结果如下:
这里的分析也与上一题相同,每次使用指令的时候,inode bitmap和inodes是同时改变的,data bitmap和data是同时改变的。这里,我们发现inode和数据块分配所喜欢的是从前往后按顺序分配。
随机种子22的情况:
运行指令:./vsfs.py -s 22 -r -c
可以得到如下的运行结果:
同理可以得到与上面相同的结果。
随机种子23的情况:
运行指令:./vsfs.py -s 23 -r -c
可以得到如下的结果:
同理可以得到与上面相同的结果。
随机种子24的情况:
运行指令:./vsfs.py -s 24 -r -c
可以得到如下的结果:
同理可以得到与上面相同的结果。
综上,inode和数据块分配算法,它们喜欢从序列的前面往后分配。
40.3
现在将文件系统中的数据块数量减少到非常少(比如两个),并用100个左右的请求来运行模拟器。在这种高度约束的布局中,哪些类型的文件最终会出现在文件系统中?上面类型的操作会失败?
解:
运行指令:./vsfs.py -d 2 -n 100 -c
可以得到如下的结果:
发现,这里创建目录失败了,说明不能创建目录。
运行指令:./vsfs.py -d 2 -n 100 -s 3 -c
可以得到如下的结果:
发现创建文件成功,写入文件会失败。可以创建多个文件,可以unlink。
运行指令:./vsfs.py -d 2 -n 100 -s 7 -c
可以得到如下的结果:
从这里的运行结果看出可以创建多个文件。
综上,模拟器似乎要求必须剩下一个数据块不能被使用。
40.4
现在做同样是事情,但针对inodes。只有非常少的inode,什么类型的操作才能成功?哪些通常会失败?文件系统的最终状态可能是什么?
解:
运行指令:./vsfs.py -i 2 -n 100 -s 1 -c
可以得到如下的结果:
发现,同样这里也不能创建目录。
运行指令:./vsfs.py -i 2 -n 100 -s 3 -c
可以得到如下的结果:
发现创建文件也失败。
运行指令:./vsfs.py -i 2 -n 100 -s 5 -c
可以得到如下的结果:
与上面相同,不能创建目录。
综上,创建文件,创建目录都不行。模拟器似乎也要求必须剩下一个inode块不能被使用。