练习0:填写已有实验
请把你做的实验代码填入本实验中代码中有“LAB1”/“LAB2”/“LAB3”/“LAB4”/“LAB5”/“LAB6”的注释相应部分。并确保编译通过。注意:为了能够正确执行lab7的测试应用程序,可能需对已完成的实验1/2/3/4/5/6的代码进行进一步改进。
1 | 这次又是要修改 trap.c |
练习1: 理解内核级信号量的实现和基于内核级信号量的哲学家就餐问题
请在实验报告中给出内核级信号量的设计描述,并说其大致执行流流程。
1 | // 先是定义了一个信号量的数据结构 |
请在实验报告中给出给用户态进程/线程提供信号量机制的设计方案,并比较说明给内核级提供信号量机制的异同。
1 | 可以将内核级信号量 包装成系统调用 供用户进程使用 但不能直接使用信号量结构体的指针作为参数 |
练习2: 完成内核级条件变量和基于内核级条件变量的哲学家就餐问题
首先掌握管程机制,然后基于信号量实现完成条件变量实现,然后用管程机制实现哲学家就餐问题的解决方案(基于条件变量)。
请在实验报告中给出内核级条件变量的设计描述,并说其大致执行流流程。
首先可以确定 这里实现的是 Hoare管程 因为 等待条件变量的进程的优先级更高
1 | // 管程数据结构 |
1 | check_sync.c: |
1 | 哲学家->试试拿刀叉->能拿->signal 唤醒被wait阻塞的进程->阻塞自己 |
请在实验报告中给出给用户态进程/线程提供条件变量机制的设计方案,并比较说明给内核级提供条件变量机制的异同。
1 | 依然是通过提供系统调用 |
请在实验报告中回答:能否不用基于信号量机制来完成条件变量?如果不能,请给出理由,如果能,请给出设计说明和具体实现。
1 | 可以 可以用 自旋锁 |
实验完成结果