OS Lab4 & Lab5 Report

OS Lab4 实验报告

实现功能

本次实验中,为了支持带参数的 spawn 调用,我首先参考 sys_exec 的实现,更新了 sys_spawn 的实现。然后实现了 sys_linkat、sys_unlinkat、sys_fstat 三个系统调用,分别完成创建硬链接、取消硬链接和查询文件状态功能,为此,在 inode 和 dinode 数据结构中增加了链接计数 nlink,并实现 sys_unlinkat 增加了 dirunlink 函数,用于删除根目录数据块中记录的指定文件名到 inode number 的映射。

问答题

Chapter 6

  1. 我们的文件系统中只有根目录一级目录,root inode 的数据块起到存储所有文件名到 inode number 映射关系的作用,如果 root inode 中的内容损坏,可能出现无法正确根据文件名查到对应文件,甚至无法创建文件。

Chapter 7

  1. 例如,查看当前目录下文件数量(不包括目录)可以使用命令:ls -l | grep '^-' | wc -l,三个命令的作用分别为:
    • ls -l:长列表输出该目录下文件信息(注意这里的文件是指目录、链接、设备文件等),每一行对应一个文件或目录;
    • grep '^-':过滤ls的输出信息,只保留一般文件,只保留目录是 grep ‘^d’;
    • wc -l:统计输出信息的行数,统计结果就是输出信息的行数,一行信息对应一个文件,所以就是文件的个数。
  2. 可以使用共享内存机制,在多个进程间建立共享内存,通过对共享内存的读写实现进程间通信。也可以使用邮箱机制,每个进程维护一个“邮箱”用于收发数据包,使用环形 buffer 存储,根据 pid 查找邮箱,通过向邮箱写入数据包向相应进程发消息,进程定期读邮箱接收消息。

OS Lab5 实验报告

实现功能

本次实验中,我实现了死锁检测算法 deadlock_detect,支持进程在获取互斥锁前或信号量P操作前进行死锁检测,避免出现死锁,同时实现系统调用 sys_enable_deadlock_detect 支持进程打开或关闭死锁检测。

问答题

  1. (1) 需要回收的进程资源包括所有已分配且尚未退出的子线程、页表、打开的文件、互斥锁、信号量和条件变量等,其中回收的线程资源包括线程的用户栈、Trapframe、用于上下文切换的context等。
    (2) 可能在任务队列中,也可能在信号量、互斥量、条件变量的等待队列中。由于进程退出时会回收所有子线程资源并将线程状态设为 T_UNUSED,信号量、互斥量、条件变量等资源也会被回收,这些线程都不需要再做手动回收。
  2. 前者在调用 unlock 时会直接将互斥锁的 locked 置为 0,后者会等到该互斥锁的等待队列清空后才将 locked 状态置 0。后者相当于每次从队列中 pop 出一个线程后直接将互斥锁交给该线程,保证从该线程阻塞的地方继续执行;前者在 pop 出的线程进入任务队列后仍需要与其他就绪线程竞争互斥锁,有可能会被优先级更高的线程优先抢占导致 pop 出的线程的执行再次被阻塞。