Lab 4
功能实现
sys_linkat
参考
Inode::create()
的实现.
- 为
DiskInode
添加nlink
字段, 初始化时设置为1
. - 为
Inode
实现linkat()
方法, 保证仅由ROOT_INODE
调用. - 由
read_disk_inode()
获取old_name
对应的inode_id
. - 由
EasyFileSystem
解析出block_id
与block_offset
. - 由
get_block_cache()
建立链接并插入新建的DirEntry
.
sys_unlinkat
参考
Inode::clear()
的实现.
- 为
Inode
实现unlinkat()
方法, 保证仅由ROOT_INODE
调用. - 由
read_disk_inode()
遍历根目录获取name
对应的inode_id
. - 由
modify_disk_inode()
修改DiskInode
, 删除相应目录项. - 由
EasyFileSystem
解析出block_id
与block_offset
. - 由
get_block_cache()
解除链接, 并判断是否需要释放数据块.
sys_fstat
- 为
File
trait 定义stat()
方法, 传入*mut Stat
作为参数. - 仅为
OSInode
实现该方法, 在Stdin
与Stdout
中默认panic
退出. - 手动查询页表, 将传入的
st: *mut Stat
虚拟地址转换为对应的物理地址. ino
字段由EasyFileSystem
计算并给出.mode
与nlink
字段通过Inode::read_disk_inode()
获取对应的DiskInode
并给出.
问答题
在 easy-fs 中 root inode 起着什么作用? 如果 root inode 中的内容损坏会发生什么?
答: (1) 仅支持绝对路径的情况下, root inode 作为根目录所对应的
Inode
, 是文件系统的起点, 对任何文件/目录的索引必须从 root inode 开始向下逐级进行, 相关文件方法只能由 root inode 调用. (2) 如果 root inode 中的内容损坏, 那么文件系统将无法实现文件管理.
举出使用 pipe 的一个实际应用的例子.
答: 以使用如下命令进行文件行数统计为例:
cat example.txt | wc -l
操作系统捕获第一个命令的输出, 暂存在内存中, 并直接连接到第二个命令的输入, 形成一个管道, 无需将中间结果写入临时文件或手动多次执行命令.
如果需要在多个进程间互相通信, 则需要为每一对进程建立一个管道, 非常繁琐, 请设计一个更易用的多进程通信机制.
答: 由操作系统设置一个消息队列进行多进程通信, 允许一个进程将数据发送到队列中, 设置发送方标识与期待接收方标识, 另一个进程从队列中读取数据, 通过标识符判断是否可接收. 比较成熟的消息队列中间件有 ActiveMQ, RabbitMQ, RocketMQ 等.