操作系统 Lab 4


Lab 4

功能实现

sys_linkat

参考 Inode::create() 的实现.

  1. DiskInode 添加 nlink 字段, 初始化时设置为 1.
  2. Inode 实现 linkat() 方法, 保证仅由 ROOT_INODE 调用.
  3. read_disk_inode() 获取 old_name 对应的 inode_id.
  4. EasyFileSystem 解析出 block_idblock_offset.
  5. get_block_cache() 建立链接并插入新建的 DirEntry.

sys_unlinkat

参考 Inode::clear() 的实现.

  1. Inode 实现 unlinkat() 方法, 保证仅由 ROOT_INODE 调用.
  2. read_disk_inode() 遍历根目录获取 name 对应的 inode_id.
  3. modify_disk_inode() 修改 DiskInode, 删除相应目录项.
  4. EasyFileSystem 解析出 block_idblock_offset.
  5. get_block_cache() 解除链接, 并判断是否需要释放数据块.

sys_fstat

  1. File trait 定义 stat() 方法, 传入 *mut Stat 作为参数.
  2. 仅为 OSInode 实现该方法, 在 StdinStdout 中默认 panic 退出.
  3. 手动查询页表, 将传入的 st: *mut Stat 虚拟地址转换为对应的物理地址.
  4. ino 字段由 EasyFileSystem 计算并给出.
  5. modenlink 字段通过 Inode::read_disk_inode() 获取对应的 DiskInode 并给出.

问答题

  1. 在 easy-fs 中 root inode 起着什么作用? 如果 root inode 中的内容损坏会发生什么?

    答: (1) 仅支持绝对路径的情况下, root inode 作为根目录所对应的 Inode, 是文件系统的起点, 对任何文件/目录的索引必须从 root inode 开始向下逐级进行, 相关文件方法只能由 root inode 调用. (2) 如果 root inode 中的内容损坏, 那么文件系统将无法实现文件管理.

  1. 举出使用 pipe 的一个实际应用的例子.

    答: 以使用如下命令进行文件行数统计为例:

    cat example.txt | wc -l

    操作系统捕获第一个命令的输出, 暂存在内存中, 并直接连接到第二个命令的输入, 形成一个管道, 无需将中间结果写入临时文件或手动多次执行命令.

  1. 如果需要在多个进程间互相通信, 则需要为每一对进程建立一个管道, 非常繁琐, 请设计一个更易用的多进程通信机制.

    答: 由操作系统设置一个消息队列进行多进程通信, 允许一个进程将数据发送到队列中, 设置发送方标识与期待接收方标识, 另一个进程从队列中读取数据, 通过标识符判断是否可接收. 比较成熟的消息队列中间件有 ActiveMQ, RabbitMQ, RocketMQ 等.


文章作者: Chengsx
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Chengsx !
  目录