《操作系统导论》第40章课后答案

使用工具 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)] [] [] [] [] [] [] 
  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
对于《统计学导论基于R》课后答案第三,我将用300字的篇幅进行解答。 第三主要介绍了描述统计学中的一些基本概念和方法,包括测量尺度、数据类型分类、描述性统计等内容。 首先,测量尺度是指统计变量可以采取的不同数学性质的度量方式。常见的测量尺度有:名义尺度、顺序尺度、间隔尺度和比例尺度。名义尺度仅可进行分类,顺序尺度可以进行排序,间隔尺度可以进行排序和计算差值,比例尺度可以进行排序、计算差值和比较比例。 其次,数据类型分类是根据测量尺度将数据分为离散型和连续型。离散型数据是那些仅能取有限个值或可列举的数值,如人数、个数等;而连续型数据是可以取任意值的数值,如身高、体重等。对于不同类型的数据,我们在统计分析时需要采用不同的方法。 最后,描述性统计是通过一些统计指标对数据进行总结和描述。常见的描述统计指标有:频数、频率、平均数、中位数、众数、标准差、方差等。频数和频率用于描述离散型数据的分布情况,平均数、中位数和众数则用于描述连续型数据的集中趋势,标准差和方差用于描述数据的离散程度。 总之,《统计学导论基于R》课后答案第三主要涉及了测量尺度、数据类型分类和描述性统计三个方面的内容。理解这些概念和方法对于进行统计学分析非常重要,也为后续学习和实践打下了基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值