基于nachos系统开发的课设作业 ——Project 1 .5

本文介绍了基于nachos系统开发的课设作业Project 1的第五问,主要涉及优先级调度器PriorityScheduler的实现。内容包括如何处理优先级反转问题,使用大根堆来存储线程及其优先级,以及ThreadState和PriorityQueue两个内部类的功能。文章详细讲解了setPriority、waitForAccess、acquire等方法的作用,并阐述了线程调度的逻辑和Lock类的release方法。测试结果显示,优先级反转成功,调度器能够正确选择拥有锁的线程进行执行。

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

基于nachos系统开发的课设作业 ——Project 1 的第五问:

题目要求先是完成PriorityScheduler类在Nachos中实现优先级调度。首先在这种调度下,每次调度程序从就绪队列中应该选择优先级最高的那个。此处会出现一种需要我们解决的问题:优先级反转——持有锁的线程的优先级低于就绪队列中的其他线程,则我们将最高优先级暂时性地赋予给之,低优先级的lockholder变成高优先级线程(暂时性),在代码中我们除了priority属性,特设有EffectivePriority一属性,在优先级反转过程中用到该变量。

接下来是实现过程:
首先实现基本的优先级调度:分析PriorityScheduler类,发现其中又包含了两个内部类:
1)PriorityQueue,其注释为——根据优先级将线程分类。我们用一个大根堆来存储所有的线程及其优先级,每次其堆顶是优先级最高的线程,我们将将KTread对象与其相应的优先级(EffectivePriority)加入大根堆中,根据优先级大小排序。该类主要需实现的方法有nextThread()、pickNextThread()。
2):ThreadState——保存一个线程和它的优先级、EffectivePriority、waitQueue。主要需要实现的方法:getEffectivePriority()、setPriority(int priority)、waitForAccess(PriorityQueue waitQueue)、acquire()。
逐一实现:此处对一些较为复杂的实现方法进行说明:ThreadState中的setPriority方法:当我们设置一个线程的优先级时,如果该线程原先的优先级小于重新设置的,则需要更改EffectivePriority,此时大根堆需要刷新一遍。并且如果此时的锁具有拥有者且其优先级低于新设置值,说明在堆中(即就绪队列)存在比lockholder高优先级的线程,要对lockholder进行优先级反转。waitForAccess(PriorityQueue waitQueue)方法:获得就绪队列,向其加入线程,当就绪队列满足优先级

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值