7层架构
Block Layer
将block的序数,映射到block中实际的数据。
块大小的权衡
太小,则bitmap所需空间太大。
太大,则内部浪费可能比较严重。
File Layer
1 | struct inode |
N决定了一个文件最大有多大。
与块大小的权衡一样,N的大小也存在权衡。
解决措施:多级inode。
inode的block_nums中的元素可以指向另外一个inode,类似于多级页表。
个人理解,在block层上又封装了一层inode的原因,就是因为inode可以做多级操作,否则就和block相同了,区别仅仅是更大。
Inode Number Layer
将inode放在一张表里,这样可以通过index来访问某一inode。
File Name Layer
1 | struct inode |
Path Name Layer
链接link。
可以将多个文件名映射到同一个inode。
除了.和..,不允许对目录进行链接,否则可能会出现“外存泄露”。
重命名-1
- UNLINK(to_name)
- LINK(from_name, to_name)
- UNLINK(from_name)
但是这种实现有问题,当1和2之前出现了failure时,to_name没了,但是from_name还在。
重命名-2
- LINK(from_name, to_name)
- UNLINK(from_name)
Absolute Path Name Layer
根目录/。其.和..都指向/。
Symbolic Link Layer
跨存储设备。
通过文件名进行链接。
其大小指的是文件名字符串长度。
问题:如果通过symbolic link进入了一个目录,再运行cd ..,则会进入哪个目录?
答案:会进入原目录,而不是实际目录的上层目录。
因为cd ..会被bash先解析,这是一种优化。