西电Pintos操作系统课程设计 实验四

本文介绍了一种解决由锁导致的优先级反转问题的方法——优先级捐赠,并详细阐述了其实现步骤,包括数据结构的修改、关键函数的定义与调整。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实验四:Priority Scheduling—Donation for Locks

一、实验目的
解决由lock造成的优先级反转问题。

二、实验方案
使用优先级捐赠(Priority Donation)来解决由lock造成的优先级反转问题。
优先级捐赠是指高优先级的线程将自身优先级捐给与其竞争资源的低优先级线程,以促使其尽快释放资源,进而保证自身能尽快得到运行所需资源的策略。
优先级捐赠主要分以下几种情况:
1.简单捐赠,这是最为平常和简单的一种捐赠情况。lock、优先级流动及线程执行时间顺序如下图所示:
在这里插入图片描述
2.递归捐赠,这是一种较为复杂的情况。lock、优先级流动及线程执行时间顺序如下图所示:
在这里插入图片描述
3.多重捐赠,这种情况也较为复杂。lock、优先级流动及线程执行时间顺序如下图所示:在这里插入图片描述
三、详细实现

  1. 修改数据结构
    (1) 修改thread结构体,新增三个量,一个base_priority记录线程的初始优先级,一个locks记录线程当前拥有的锁(多个),一个lock_waiting用来记录线程等待被释放的锁。在这里插入图片描述
    (2) 修改lock结构体,新增两个量,一个elem记录优先级捐赠的列表元素,一个max_priority记录请求锁的所有线程的最大优先级。在这里插入图片描述
  2. 修改函数
    (1) 修改init_thread()函数,实现对thread结构体中新增变量base_priority和lock_waiting的初始化。在这里插入图片描述
    (2) 修改lock_acquire()函数,在获取锁之前循环更新所有参与嵌套的线程的优先级,即在P操作之前解决递归捐赠的情况。然后在线程被唤醒之后让该线程持有该锁。在这里插入图片描述
    (3) 定义函数thread_hold_the_lock实现将一个锁资源赋给线程。在这里插入图片描述
    (4) 定义函数thread_donate_priority实现较高优先级线程将优先级捐赠给某一持有锁的较低优先级的线程。这里的优先级捐赠是通过修改锁的最高优先级, 然后调用thread_update_priority ()更新被捐赠线程的当前优先级实现的。在这里插入图片描述
    (5) 定义函数thread_update_priority ()实现线程优先级的更新。该函数一方面被thread_donate_priority()函数调用以实现优先级捐赠操作,另一方面考虑到当某线程释放锁之后,该线程的优先级可能发生变化,可用thread_update_priority()函数来处理这个逻辑。在这里插入图片描述
    (6) 定义函数lock_cmp_priority()实现锁队列的排序。在这里插入图片描述
    (7) 定义函数thread_remove_lock()实现线程释放锁时进行的操作,该函数将被synch.c中的lock_release()函数调用。在这里插入图片描述
    (8) 在lock_release()函数中添加相应的语句调用(6)中的thread_remove_lock()函数。在这里插入图片描述
    (9) 在lock_release()函数中添加相应的语句调用(6)中的thread_remove_lock()函数。在这里插入图片描述
    (10) 修改thread_set_priority()函数。如果没有锁,那么优先级捐赠的情况不用考虑,直接更新;如果更新的优先级大于当前线程的优先级,则更新当前线程优先级。总之,base_priority一定要在该函数中得到更新。在这里插入图片描述
    (11) 修改sema_up()和seme_down()函数,将信号量的wait_list实现为优先级队列,即将wait_list中的线程按优先级降序排列,该过程在实验三中已经完成过一遍。在这里插入图片描述
    (12) 定义cond_sema_cmp_priority()函数实现条件变量wait_list中线程的优先级比较,便于(12)中使用该函数作为list_sort()排序函数的参数。在这里插入图片描述
    (13) 修改 cond_signal()函数,将条件变量的wait_list也改成优先级队列,其中list_sort()排序函数使用(11)中的定义的比较函数作为参数。在这里插入图片描述
    四、实验结果
    在这里插入图片描述
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Polaris_T

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值