priority task2 实验过程|学习笔记

简介: 快速学习 priority task2 实验过程

开发者学堂课程【高校精品课-西安电子科技大学-操作系统课程设计:priority task2 实验过程】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/74/detail/15856


priority task2 实验过程

 

实操演示

本节课讲解优先级反转部分的相关实验代码。

在线程部分的源码中,加入如下结构体:

Struct pri_stack

{

Int priority;//用于保存被捐赠前的优先级

Struct lock *lock;//标明捐赠者捐赠时需要什么锁

其中 priority 用于保存被捐赠前的优先级,lock 标明捐赠者捐赠时需要什么锁。 

接下来在同文件中加入如下声明,这四行代码为:

image.png

Struct pri_stack pri【64】

Int top;//pri 的栈顶

Struct semaphore *block sema;//被哪个信号量阻塞

Struct lock *block lock;//在等待哪个 lock

分别表示:线程优先级的站以及线程优先级的站点,以及表明在哪个信号量阻塞和在等待哪个锁。

接下来在线程的优先级设置函数中修改如下代码:

If(thread_current()->top>0)

{

Thread_current()-> priority = new priority

}

Else

{

Thread_current()->priority = new priority

这段代码表示,如果当前线程的优先级的站点元素优先级大于0,则将新的线程优先级复制给当前线程的站点优先级,否则将新的优先级复制给当前线程的优先级。

由于在结构体中定义了本次实验锁需要的一些声明,所以在初始化线程中,需要为当前的线程增加以下属性,分别是站点元素阻塞、信号量和阻塞锁。

t->top = 0

T->block_sema = NULL

T->block_lock = NULL

在线程的同步机制模块中,需要修改信号量下降函数(sema_dowm)。当在信号量下降函数中,需要记入当前线程的阻塞信号量。接下来修改信号量上升函数(sema_up)。在该函数中需要修改选中区域的部分代码:

If ( !list_ empty (&sema ->waiters))

t=list_entry (list_ pop_ front (&sema-»waiters), struct thread, elem);

thread unblock (t);

t->block sema = NULL;

在这部分代码中需要判断,如果一个线程唤醒时,需要将它的阻塞信号量设为空。

接下来在换取锁的函数中,需要增加以下代码:

if(lock->semaphore.value = 0)

thread current()->block_ lock = lock;

priority donate(thread current()),lock);

在这部分代码中,如果当前锁的信号量值为0,需要将当前线程的阻塞锁记录为锁获得的锁资源,然后将当前线程的锁资源进行优先级捐赠。

接下来修改锁资源的释放代码在 lock release 代码中,需要进行如下判断,首先需要判断当前线程的占点优先级是否大于0,如果大于零则代表当前线程被捐赠过,则需要判断是否进行优先级还原。如果当前线程的锁资源在占点,则还原当前线程的优先级并删除记录;如果当前线程的锁资源在占中,则直接删除记录;如果当前线程的锁资源在占底部,则为当前优先级复制为初始优先级,然后删除记录。

最后需要在线程部分的原法中增加自己写的 priority donate 优先级选择函数,该函数的大致内容如下;

在该函数中需要判断,如果当前线程的优先级大于占领锁资源的优先级,则需要进行选择。在选择逻辑中需要判断,如果占用锁资源的线程为就绪状态,则就绪队列需要进行重新排序。如果占用锁资源的线程为阻塞状态,并且占用锁资源的线程也在等待信号量,则需要重新排序等待队列。

在修改完所有的代码逻辑之后,在 pintos 操作系统源码的 src/threads 目录下运行 make check 命令。

image.png

运行完之后可以看到与 priority donate 相关的状态为 pass 状态,这代表实验成功。

相关文章
|
29天前
|
Java 数据库
详解Task 和 ValueTask 的使用区别
详解Task 和 ValueTask 的使用区别
26 0
|
5月前
|
Java C#
经验大分享:Task的用法
经验大分享:Task的用法
29 0
|
5月前
|
芯片
微机实验二 || 8253定时计数器方波实验
微机实验二 || 8253定时计数器方波实验
|
6月前
|
算法 安全 编译器
C++:模版进阶 | Priority_queue的模拟实现
C++:模版进阶 | Priority_queue的模拟实现
|
算法 C++ 容器
C++初阶之一篇文章教会你queue和priority_queue(理解使用和模拟实现)(下)
优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器
|
6月前
|
算法 C语言 C++
C++:priority_queue模拟实现
C++:priority_queue模拟实现
46 0
|
6月前
|
存储 算法 C++
priority_queue的模拟实现
priority_queue的模拟实现
57 0
|
C++
priority_queue 模拟实现
priority_queue 模拟实现
43 0
|
存储 C++ 容器
C++初阶之一篇文章教会你queue和priority_queue(理解使用和模拟实现)(上)
队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。
|
测试技术
loadrunner 技巧-模拟Run Logic中的随机Action运行
loadrunner 技巧-模拟Run Logic中的随机Action运行
92 0