使用工具 vsfs.py
来研究文件系统状态如何随着各种操作的发生而改变。文件系统以空 状态开始,只有一个根目录。模拟发生时会执行各种操作,从而慢慢改变文件系统的磁 盘状态。详情请参阅 README
文件
40.1
问题描述
用一些不同的随机种子(比如 17、18、19、20)运行模拟器,看看你是否能确定每 次状态变化之间一定发生了哪些操作。
解答
首先弄清不同操作会使磁盘状态发生何种改变:
mkdir()
- 创建文件夹:修改inode位图,增加一个inode用来存放新目录元数据,向存放新目录的目录块中增加一个条目,修改data位图,增加一个数据块用于存放新目录的内容,更新相应inode中的引用计数creat()
- 创建新的空文件:修改inode位图,增加一个inode用来存放新文件元数据,向存放新文件的目录块中增加一个条目,更新相应inode中的引用计数open()
,write()
,close()
- 将一个块添加到文件:修改data位图,增加一个数据块用于存放文件的新内容,修改inode中的数据块地址字段link()
- 创建一个文件的硬链接:修改inode,增加其中的引用计数,在保存链接的目录块中增加一个条目unlink()
- 删除一个硬链接 (如果 linkcnt==0,删除文件):修改inode,减小其中的引用计数,在保存链接的目录块中删除一个条目,当引用计数减为0时,删除文件,释放inode、数据块,修改inode位图、data位图
然后根据磁盘状态的改变确定发生了何种操作。
seed 17
运行命令:python2 vsfs.py -n 6 -s 17 -c
ARG seed 17
ARG numInodes 8
ARG numData 8
ARG numRequests 6
ARG reverse False
ARG printFinal False
Initial state
inode bitmap 10000000
inodes [d a:0 r:2] [] [] [] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0)] [] [] [] [] [] [] []
mkdir("/u");
inode bitmap 11000000
inodes [d a:0 r:3] [d a:1 r:2] [] [] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (u,1)] [(.,1) (..,0)] [] [] [] [] [] []
creat("/a");
inode bitmap 11100000
inodes [d a:0 r:3] [d a:1 r:2] [f a:-1 r:1] [] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (u,1) (a,2)] [(.,1) (..,0)] [] [] [] [] [] []
unlink("/a");
inode bitmap 11000000
inodes [d a:0 r:3] [d a:1 r:2] [] [] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (u,1)] [(.,1) (..,0)] [] [] [] [] [] []
mkdir("/z");
inode bitmap 11100000
inodes [d a:0 r:4] [d a:1 r:2] [d a:2 r:2] [] [] [] [] []
data bitmap 11100000
data [(.,0) (..,0) (u,1) (z,2)] [(.,1) (..,0)] [(.,2) (..,0)] [] [] [] [] []
mkdir("/s");
inode bitmap 11110000
inodes [d a:0 r:5] [d a:1 r:2] [d a:2 r:2] [d a:3 r:2] [] [] [] []
data bitmap 11110000
data [(.,0) (..,0) (u,1) (z,2) (s,3)] [(.,1) (..,0)] [(.,2) (..,0)] [(.,3) (..,0)] [] [] [] []
creat("/z/x");
inode bitmap 11111000
inodes [d a:0 r:5] [d a:1 r:2] [d a:2 r:2] [d a:3 r:2] [f a:-1 r:1] [] [] []
data bitmap 11110000
data [(.,0) (..,0) (u,1) (z,2) (s,3)] [(.,1) (..,0)] [(.,2) (..,0) (x,4)] [(.,3) (..,0)] [] [] [] []
- 操作1同时修改了inode位图和data位图,只有mkdir()可以做到。查看1号inode,发现新建了一个目录,其数据存放在1号数据块,在0号数据块中查看新增加的条目,指示新建的目录名为“u”,所以操作1是mkdir(“/u”)
- 操作2只修改了inode位图,所以是creat()。查看2号inode,发现新建了一个文件,在0号数据块中查看新增加的条目,指示新建的文件名为“a”,所以操作2是creat(“/a”)
- 操作3修改了inode位图,删除了inode和目录块中的条目,所以是unlink()。发现删除的是2号inode,所以操作3是unlink(“/a”)
- 操作4同时修改了inode位图和data位图,只有mkdir()可以做到。查看2号inode,发现新建了一个目录,其数据存放在2号数据块,在0号数据块中查看新增加的条目,指示新建的目录名为“z”,所以操作4是mkdir(“/z”)
- 操作5同时修改了inode位图和data位图,只有mkdir()可以做到。查看3号inode,发现新建了一个目录,其数据存放在3号数据块,在0号数据块中查看新增加的条目,指示新建的目录名为“s”,所以操作5是mkdir(“/s”)
- 操作6只修改了inode位图,所以是creat()。查看4号inode,发现新建了一个文件,在3号数据块(目录z的目录块)中查看新增加的条目,指示新建的文件名为“x”,所以操作6是creat(“/z/x”)
seed 18
运行命令:python2 vsfs.py -n 6 -s 18 -c
ARG seed 18
ARG numInodes 8
ARG numData 8
ARG numRequests 6
ARG reverse False
ARG printFinal False
Initial state
inode bitmap 10000000
inodes [d a:0 r:2] [] [] [] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0)] [] [] [] [] [] [] []
mkdir("/f");
inode bitmap 11000000
inodes [d a:0 r:3] [d a:1 r:2] [] [] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (f,1)] [(.,1) (..,0)] [] [] [] [] [] []
creat("/s");
inode bitmap 11100000
inodes [d a:0 r:3] [d a:1 r:2] [f a:-1 r:1] [] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (f,1) (s,2)] [(.,1) (..,0)] [] [] [] [] [] []
mkdir("/h");
inode bitmap 11110000
inodes [d a:0 r:4] [d a:1 r:2] [f a:-1 r:1] [d a:2 r:2] [] [] [] []
data bitmap 11100000
data [(.,0) (..,0) (f,1) (s,2) (h,3)] [(.,1) (..,0)] [(.,3) (..,0)] [] [] [] [] []
fd=open("/s", O_WRONLY|O_APPEND); write(fd, buf, BLOCKSIZE); close(fd);
inode bitmap 11110000
inodes [d a:0 r:4] [d a:1 r:2] [f a:3 r:1] [d a:2 r:2] [] [] [] []
data bitmap 11110000
data [(.,0) (..,0) (f,1) (s,2) (h,3)] [(.,1) (..,0)] [(.,3) (..,0)] [f] [] [] [] []
creat("/f/o");
inode bitmap 11111000
inodes [d a:0 r:4] [d a:1 r:2] [f a:3 r:1] [d a:2 r:2] [f a:-1 r:1] [] [] []
data bitmap 11110000
data [(.,0) (..,0) (f,1) (s,2) (h,3)] [(.,1) (..,0) (o,4)] [(.,3) (..,0)] [f] [] [] [] []
creat("/c");
inode bitmap 11111100
inodes [d a:0 r:4] [d a:1 r:2] [f a:3 r:1] [d a:2 r:2] [f a:-1 r:1] [f a:-1 r:1] [] []
data bitmap 11110000
data [(.,0) (..,0) (f,1) (s,2) (h,3) (c,5)] [(.,1) (..,0) (o,4)] [(.,3) (..,0)] [f] [] [] [] []
- 操作1同时修改了inode位图和data位图,只有mkdir()可以做到。查看1号inode,发现新建了一个目录,其数据存放在1号数据块,在0号数据块中查看新增加的条目,指示新建的目录名为“f”,所以操作1是mkdir(“/f”)
- 操作2只修改了inode位图,所以是creat()。查看2号inode,发现新建了一个文件,在0号数据块中查看新增加的条目,指示新建的文件名为“s”,所以操作2是creat(“/s”)
- 操作3同时修改了inode位图和data位图,只有mkdir()可以做到。查看3号inode,发现新建了一个目录,其数据存放在2号数据块,在0号数据块中查看新增加的条目,指示新建的目录名为“h”,所以操作3是mkdir(“/h”)
- 操作4修改了data位图,修改了2号inode(文件s)中的地址字段,增加了3号数据块,所以操作4是fd=open(“/s”,
O_WRONLY|O_APPEND); write(fd, buf, BLOCKSIZE); close(fd) - 操作5只修改了inode位图,所以是creat()。查看4号inode,发现新建了一个文件,在1号数据块(目录f的目录块)中查看新增加的条目,指示新建的文件名为“o”,所以操作5是creat(“/f/o”)
- 操作6只修改了inode位图,所以是creat()。查看5号inode,发现新建了一个文件,在0号数据块中查看新增加的条目,指示新建的文件名为“c”,所以操作6是creat(“/c”)
seed 19
运行命令:python2 vsfs.py -n 6 -s 19 -c
ARG seed 19
ARG numInodes 8
ARG numData 8
ARG numRequests 6
ARG reverse False
ARG printFinal False
Initial state
inode bitmap 10000000
inodes [d a:0 r:2] [] [] [] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0)] [] [] [] [] [] [] []
creat("/k");
inode bitmap 11000000
inodes [d a:0 r:2] [f a:-1 r:1] [] [] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0) (k,1)] [] [] [] [] [] [] []
creat("/g");
inode bitmap 11100000
inodes [d a:0 r:2] [f a:-1 r:1] [f a:-1 r:1] [] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0) (k,1) (g,2)] [] [] [] [] [] [] []
fd=open("/k", O_WRONLY|O_APPEND); write(fd, buf, BLOCKSIZE); close(fd);
inode bitmap 11100000
inodes [d a:0 r:2] [f a:1 r:1] [f a:-1 r:1] [] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (k,1) (g,2)] [g] [] [] [] [] [] []
link("/k", "/b");
inode bitmap 11100000
inodes [d a:0 r:2] [f a:1 r:2] [f a:-1 r:1] [] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (k,1) (g,2) (b,1)] [g] [] [] [] [] [] []
link("/b", "/t");
inode bitmap 11100000
inodes [d a:0 r:2] [f a:1 r:3] [f a:-1 r:1] [] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (k,1) (g,2) (b,1) (t,1)] [g] [] [] [] [] [] []
unlink("/k");
inode bitmap 11100000
inodes [d a:0 r:2] [f a:1 r:2] [f a:-1 r:1] [] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (g,2) (b,1) (t,1)] [g] [] [] [] [] [] []
- 操作1只修改了inode位图,所以是creat()。查看1号inode,发现新建了一个文件,在0号数据块中查看新增加的条目,指示新建的文件名为“k”,所以操作1是creat(“/k”)
- 操作2只修改了inode位图,所以是creat()。查看2号inode,发现新建了一个文件,在0号数据块中查看新增加的条目,指示新建的文件名为“g”,所以操作2是creat(“/g”)
- 操作3修改了data位图,修改了1号inode(文件k)中的地址字段,增加了1号数据块,所以操作3是fd=open(“/k”,
O_WRONLY|O_APPEND); write(fd, buf, BLOCKSIZE); close(fd) - 操作4增加了1号inode(文件k)中的引用计数字段,所以是link()。在0号数据块中查看新增加的条目,指示新建的链接名为“b”,所以操作4是link(“/k”,“/b”)
- 操作5增加了1号inode(文件k)中的引用计数字段,所以是link()。在0号数据块中查看新增加的条目,指示新建的链接名为“t”,所以操作5是link(“/k”,“/t”)
- 操作6减小了1号inode(文件k)中的引用计数字段,所以是unlink()。在0号数据块中查看删除的条目,指示删除的链接名为“k”,所以操作6是unlink(“/k”)
seed 20
输入命令:python2 vsfs.py -n 6 -s 20 -c
ARG seed 20
ARG numInodes 8
ARG numData 8
ARG numRequests 6
ARG reverse False
ARG printFinal False
Initial state
inode bitmap 10000000
inodes [d a:0 r:2] [] [] [] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0)] [] [] [] [] [] [] []
creat("/x");
inode bitmap 11000000
inodes [d a:0 r:2] [f a:-1 r:1] [] [] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0) (x,1)] [] [] [] [] [] [] []
fd=open("/x", O_WRONLY|O_APPEND); write(fd, buf, BLOCKSIZE); close(fd);
inode bitmap 11000000
inodes [d a:0 r:2] [f a:1 r:1] [] [] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (x,1)] [x] [] [] [] [] [] []
creat("/k");
inode bitmap 11100000
inodes [d a:0 r:2] [f a:1 r:1] [f a:-1 r:1] [] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (x,1) (k,2)] [x] [] [] [] [] [] []
creat("/y");
inode bitmap 11110000
inodes [d a:0 r:2] [f a:1 r:1] [f a:-1 r:1] [f a:-1 r:1] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (x,1) (k,2) (y,3)] [x] [] [] [] [] [] []
unlink("/x");
inode bitmap 10110000
inodes [d a:0 r:2] [] [f a:-1 r:1] [f a:-1 r:1] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0) (k,2) (y,3)] [] [] [] [] [] [] []
unlink("/y");
inode bitmap 10100000
inodes [d a:0 r:2] [] [f a:-1 r:1] [] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0) (k,2)] [] [] [] [] [] [] []
- 操作1只修改了inode位图,所以是creat()。查看1号inode,发现新建了一个文件,在0号数据块中查看新增加的条目,指示新建的文件名为“x”,所以操作1是creat(“/x”)
- 操作2修改了data位图,修改了1号inode(文件x)中的地址字段,增加了1号数据块,所以操作2是fd=open(“/x”,
O_WRONLY|O_APPEND); write(fd, buf, BLOCKSIZE); close(fd) - 操作3只修改了inode位图,所以是creat()。查看2号inode,发现新建了一个文件,在0号数据块中查看新增加的条目,指示新建的文件名为“k”,所以操作3是creat(“/k”)
- 操作4只修改了inode位图,所以是creat()。查看3号inode,发现新建了一个文件,在0号数据块中查看新增加的条目,指示新建的文件名为“y”,所以操作4是creat(“/y”)
- 操作5修改了inode位图和data位图,删除了inode、数据块和目录块中的条目,所以是unlink()。发现删除的是1号inode(文件x),所以操作5是unlink(“/x”)
- 操作6修改了inode位图,删除了inode和目录块中的条目,所以是unlink()。发现删除的是3号inode(文件y),所以操作6是unlink(“/y”)
40.2
问题描述
现在使用不同的随机种子(比如 21、22、23、24),但使用 -r 标志运行,这样做可以让你在显示操作时猜测状态的变化。关于 inode 和数据块分配算法,根据它们喜欢分配的块,你可以得出什么结论?
解答
seed 21
运行命令:python2 vsfs.py -n 6 -s 21 -r
ARG seed 21
ARG numInodes 8
ARG numData 8
ARG numRequests 6
ARG reverse True
ARG printFinal False
Initial state
inode bitmap 10000000
inodes [d a:0 r:2] [] [] [] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0)] [] [] [] [] [] [] []
mkdir("/o");
State of file system (inode bitmap, inodes, data bitmap, data)?
creat("/b");
State of file system (inode bitmap, inodes, data bitmap, data)?
creat("/o/q");
State of file system (inode bitmap, inodes, data bitmap, data)?
fd=open("/b", O_WRONLY|O_APPEND); write(fd, buf, BLOCKSIZE); close(fd);
State of file system (inode bitmap, inodes, data bitmap, data)?
fd=open("/o/q", O_WRONLY|O_APPEND); write(fd, buf, BLOCKSIZE); close(fd);
State of file system (inode bitmap, inodes, data bitmap, data)?
creat("/o/j");
State of file system (inode bitmap, inodes, data bitmap, data)?
操作1是mkdir("/o")
,修改inode位图,增加一个inode用来存放新目录元数据,向存放新目录的目录块中增加一个条目,修改data位图,增加一个数据块用于存放新目录的内容,更新相应inode中的引用计数,所以状态1为:
inode bitmap 11000000
inodes [d a:0 r:3] [d a:1 r:2] [] [] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (o,1)] [(.,1) (..,0)] [] [] [] [] [] []
操作2是creat("/b")
,修改inode位图,增加一个inode用来存放新文件元数据,向存放新文件的目录块中增加一个条目,更新相应inode中的引用计数,所以状态2为:
inode bitmap 11100000
inodes [d a:0 r:3] [d a:1 r:2] [f a:-1 r:1] [] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (o,1) (b,2)] [(.,1) (..,0)] [] [] [] [] [] []
操作3是creat("/o/q")
,修改inode位图,增加一个inode用来存放新文件元数据,向存放新文件的目录块中增加一个条目,更新相应inode中的引用计数,所以状态3为:
inode bitmap 11110000
inodes [d a:0 r:3] [d a:1 r:2] [f a:-1 r:1] [f a:-1 r:1] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (o,1) (b,2)] [(.,1) (..,0) (q,3)] [] [] [] [] [] []
操作4是fd=open("/b", O_WRONLY|O_APPEND); write(fd, buf, BLOCKSIZE); close(fd)
,修改data位图,增加一个数据块用于存放文件的新内容,修改inode中的数据块地址字段,所以状态4为:
inode bitmap 11110000
inodes [d a:0 r:3] [d a:1 r:2] [f a:2 r:1] [f a:-1 r:1] [] [] [] []
data bitmap 11100000
data [(.,0) (..,0) (o,1) (b,2)] [(.,1) (..,0) (q,3)] [m] [] [] [] [] []
操作5是fd=open("/o/q", O_WRONLY|O_APPEND); write(fd, buf, BLOCKSIZE); close(fd)
,修改data位图,增加一个数据块用于存放文件的新内容,修改inode中的数据块地址字段,所以状态5为:
inode bitmap 11110000
inodes [d a:0 r:3] [d a:1 r:2] [f a:2 r:1] [f a:3 r:1] [] [] [] []
data bitmap 11110000
data [(.,0) (..,0) (o,1) (b,2)] [(.,1) (..,0) (q,3)] [m] [j] [] [] [] []
操作6是creat("/o/j")
,修改inode位图,增加一个inode用来存放新文件元数据,向存放新文件的目录块中增加一个条目,更新相应inode中的引用计数,所以状态6为:
inode bitmap 11111000
inodes [d a:0 r:3] [d a:1 r:2] [f a:2 r:1] [f a:3 r:1] [f a:-1 r:1] [] [] []
data bitmap 11110000
data [(.,0) (..,0) (o,1) (b,2)] [(.,1) (..,0) (q,3) (j,4)] [m] [j] [] [] [] []
seed 22
运行命令:python2 vsfs.py -n 6 -s 22 -r
ARG seed 22
ARG numInodes 8
ARG numData 8
ARG numRequests 6
ARG reverse True
ARG printFinal False
Initial state
inode bitmap 10000000
inodes [d a:0 r:2] [] [] [] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0)] [] [] [] [] [] [] []
creat("/z");
State of file system (inode bitmap, inodes, data bitmap, data)?
fd=open("/z", O_WRONLY|O_APPEND); write(fd, buf, BLOCKSIZE); close(fd);
State of file system (inode bitmap, inodes, data bitmap, data)?
unlink("/z");
State of file system (inode bitmap, inodes, data bitmap, data)?
creat("/y");
State of file system (inode bitmap, inodes, data bitmap, data)?
link("/y", "/s");
State of file system (inode bitmap, inodes, data bitmap, data)?
creat("/e");
State of file system (inode bitmap, inodes, data bitmap, data)?
操作1是creat("/z")
,修改inode位图,增加一个inode用来存放新文件元数据,向存放新文件的目录块中增加一个条目,更新相应inode中的引用计数,所以状态1为:
inode bitmap 11000000
inodes [d a:0 r:2] [f a:-1 r:1] [] [] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0) (z,1)] [] [] [] [] [] [] []
操作2是fd=open("/z", O_WRONLY|O_APPEND); write(fd, buf, BLOCKSIZE); close(fd)
,修改data位图,增加一个数据块用于存放文件的新内容,修改inode中的数据块地址字段,所以状态2为:
inode bitmap 11000000
inodes [d a:0 r:2] [f a:1 r:1] [] [] [] [] [] []
data bitmap 11000000
data [(.,0) (..,0) (z,1)] [q] [] [] [] [] [] []
操作3是unlink("/z")
,修改inode,减小其中的引用计数,在保存链接的目录块中删除一个条目,当引用计数减为0时,删除文件,释放inode、数据块,修改inode位图、data位图,删除目录块中的相应条目,所以状态3为:
inode bitmap 10000000
inodes [d a:0 r:2] [] [] [] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0)] [] [] [] [] [] [] []
操作4是creat("/y")
,修改inode位图,增加一个inode用来存放新文件元数据,向存放新文件的目录块中增加一个条目,更新相应inode中的引用计数,所以状态4为:
inode bitmap 11000000
inodes [d a:0 r:2] [f a:-1 r:1] [] [] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0) (y,1)] [] [] [] [] [] [] []
操作5是link("/y", "/s")
,修改inode,增加其中的引用计数,在保存链接的目录块中增加一个条目,所以状态5为:
inode bitmap 11000000
inodes [d a:0 r:2] [f a:-1 r:2] [] [] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0) (y,1) (s,1)] [] [] [] [] [] [] []
操作6是creat("/e")
,修改inode位图,增加一个inode用来存放新文件元数据,向存放新文件的目录块中增加一个条目,更新相应inode中的引用计数,所以状态6为:
inode bitmap 11100000
inodes [d a:0 r:2] [f a:-1 r:2] [f a:-1 r:1] [] [] [] [] []
data bitmap 10000000
data [(.,0) (..,0) (y,1) (s,1) (e,2)] [] [] [] [] [] [] []
分析上述情境,我们不难发现:分配算法会使用最近可分配的 inode 与数据块。
针对其余随机数种子的做法都是相同的,为节约篇幅,在此使用-c标志查看答案。通过-c查看答案验证,发现与分析一致。
40.3
问题描述
现在将文件系统中的数据块数量减少到非常少(比如两个),并用 100 个左右的请求来运行模拟器。在这种高度约束的布局中,哪些类型的文件最终会出现在文件系统中?什么类型的操作会失败?
解答
两个数据块太少了,很难看出问题,这里我们用三个数据块。
输入命令:python2 vsfs.py -d 3 -c -n 100
ARG seed 0
ARG numInodes 8
ARG numData 3
ARG numRequests 100
ARG reverse False
ARG printFinal False
Initial state
inode bitmap 10000000
inodes [d a:0 r:2] [] [] [] [] [] [] []
data bitmap 100
data [(.,0) (..,0)] [] []
mkdir("/g");
inode bitmap 11000000
inodes [d a:0 r:3] [d a:1 r:2] [] [] [] [] [] []
data bitmap 110
data [(.,0) (..,0) (g,1)] [(.,1) (..,0)] []
creat("/q");
inode bitmap 11100000
inodes [d a:0 r:3] [d a:1 r:2] [f a:-1 r:1] [] [] [] [] []
data bitmap 110
data [(.,0) (..,0) (g,1) (q,2)] [(.,1) (..,0)] []
creat("/u");
inode bitmap 11110000
inodes [d a:0 r:3] [d a:1 r:2] [f a:-1 r:1] [f a:-1 r:1] [] [] [] []
data bitmap 110
data [(.,0) (..,0) (g,1) (q,2) (u,3)] [(.,1) (..,0)] []
link("/u", "/x");
inode bitmap 11110000
inodes [d a:0 r:3] [d a:1 r:2] [f a:-1 r:1] [f a:-1 r:2] [] [] [] []
data bitmap 110
data [(.,0) (..,0) (g,1) (q,2) (u,3) (x,3)] [(.,1) (..,0)] []
mkdir("/t");
File system out of data blocks; rerun with more via command-line flag?
因为mkdir()
和open(),
write()
, close()
需要数据块,而creat()
、link()
、unlink()
不需要数据块,所以mkdir()
和open()
, write()
, close()
操作会失败,creat()
、link()
、unlink()
操作不会失败。
40.4
问题描述
现在做同样的事情,但针对 inodes。只有非常少的 inode,什么类型的操作才能成功?哪些通常会失败?文件系统的最终状态可能是什么?
解答
运行命令:python2 vsfs.py -i 3 -c -n 100
ARG seed 0
ARG numInodes 3
ARG numData 8
ARG numRequests 100
ARG reverse False
ARG printFinal False
Initial state
inode bitmap 100
inodes [d a:0 r:2] [] []
data bitmap 10000000
data [(.,0) (..,0)] [] [] [] [] [] [] []
mkdir("/g");
inode bitmap 110
inodes [d a:0 r:3] [d a:1 r:2] []
data bitmap 11000000
data [(.,0) (..,0) (g,1)] [(.,1) (..,0)] [] [] [] [] [] []
creat("/q");
File system out of inodes; rerun with more via command-line flag?
因为mkdir()
和creat()
需要inode,而open()
, write()
, close()
、link()
、unlink()
不需要inode,所以mkdir()
和creat()
操作会失败,open()
, write()
, close()
、link()
、unlink()
操作不会失败。本例中文件系统的最终状态是:
inode bitmap 110
inodes [d a:0 r:3] [d a:1 r:2] []
data bitmap 11000000
data [(.,0) (..,0) (g,1)] [(.,1) (..,0)] [] [] [] [] [] []