本文档为西安电子科技大学计算机专业学生在《计算机操作系统》课程中完成的Pintos-Pro3项目的设计报告,内容涵盖系统架构、功能实现及优化方案。
西安电子科技大学操作系统课程设计(2021年度)实验报告
实验名称:优先级调度——任务二
班级:
姓名:
学号:
一、 实验内容
解决优先级反转问题,在高优先级与低优先级线程竞争锁时出现的问题。
二、 分析及设计
采用多重优先级捐赠的方式,以解决优先级反转问题。具体实现如下:
1. 当一个线程获得锁后,如果该锁已被其他较低优先级的线程持有,则提升其优先级;若此过程涉及多个层次的递归捐赠,在释放掉锁之后恢复原先未被捐赠的状态。
2. 在释放锁时,确保在改变优先级的情况下可以进行抢占操作。
3. 将信号量等待队列实现为优先队列形式。
4. 同样地将条件变量(condition)的等待队列也改为优先队列以提高效率。
5. 当一个线程被多个其他线程捐赠时,保持当前线程拥有最大捐赠优先级值。
6. 对于设置某一线程优先级的操作,在该线程处于待捐状态的情况下需要对original_priority进行相应调整。如果设定的优先级高于当前级别,则更新为新的数值;否则在完成所有捐赠操作之后再恢复到original_priority。
7. 在释放锁时,应对可能存在的其他被捐赠优先级和当前持有锁线程的实际运行级别做出适当处理。
三、 详细实现
1. 修改thread数据结构(thread.h)
2. 向lock构造体中添加新的成员变量(synch.h)
3. 调整lock_acquire函数的逻辑
4. 实现thread_hold_the_lock功能
5. 编写thread_donate_priority方法
6. 完成锁队列排序所需的比较函数(lock_cmp_priority)
7. 在lock_release中加入相关处理语句
8. 创建thread_remove_lock过程
9. 开发用于更新优先级的thread_update_priority模块
10. 初始化时增加相应的初始化代码到init_thread内
11. 修改现有的thread_set_priority实现细节
12. 将condition等待队列转为基于优先级排序,同时调整cond_signal函数逻辑
13. 实现比较函数以支持新的数据结构
14. 对信号量等待列表进行优化(使用优先队列),并更新sema_up操作的执行方式。
15. 调整sema_down方法以便与新系统兼容。
四、 实验结果
所有任务均已成功实现,优先级捐赠部分功能全部完成并通过测试验证。
五、 心得体会
在设计和实施优先级捐赠机制的过程中查阅了大量的资料和技术文档。尽管这一过程较为复杂,但一旦理解了操作系统中处理调度的基本原理及解决优先级反转问题的具体方法后,则主要就是代码层面的实现工作。在此过程中遇到了很多细节上的挑战,并且最初的方案考虑不够全面、想法过于简单。通过对比分析相关文献和示例程序之后才最终完成了本次实验任务。