priority task1 实验过程|学习笔记

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

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

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


priority task1 实验过程

 

实操演示

本节课讲解实验3线程的优先级调度中的代码修改。

首先修改 Pintos 操作系统源码下关于线程部分的源码。

找到 threat create 函数,该函数表示线程的创建函数,在该函数中加入如下所知代码:

If (thread_current()->priority->priority)

Thread_yield();

新添加代码部分表示,如果新的线程创立,其优先级如果大于正在运行的线程的优先级,那么正在运行的线程需要让出 cpu 资源。

接下来修改线程的让步函数,在线程的让步函数中取消原有的 list push back 方法,加入新的 list insert ordered 方法。这一部分的代码修改表示,当线程让出 cpu 时,将此线程应该插入就绪队列中,插入方法是按照优先级从大到小插入,而不是放在队伍。

/*CC2-----deleted-----*/

//list_ _push_ _back (&ready_ list, &cur->elem);

/*CC2-----added-----*/

list_insert_ordered(&ready_list,&cur->elem,thread_less,NULL)

/*CC-----finish -----*/

同样对于唤醒线程函数,取消掉唤醒线程函数中原有的 list push back 方法,而加入新添加的 list insert order 方法。将线程如果从阻塞状态转为就绪状态,则此线程进入就绪队列,仍应按照优先级的排序。

/*CC2-----deleted-----*/

//list_push_back (&ready_list, &t->elem);

/*CC2-----added-----*/

list_insert_ordered(&ready_list,&t->elem,thread_less,NULL);

/*CC-----finish -----*/

接下来修改线程,设置优先级的函数 thread set priority,在该函数中加入如下代码:

if(!list_ empty(&ready_list))

{

if(new priority <= list_ entry(list_ begin(&ready_ list),struct thread,elem)->priority)

{

thread_ yield();

}

这部分的代码表示,如果线程被赋予新的优先级,那么该线程的优先级,如果比就绪队列中优先级最高的线程的优先级还要低,那么此线上将会让出 cpu 资源。

接下来修改线程的同步提取模块中的源码。在线程的信号量上升部分的源码中,修改 sema 函数,在该函数中加入如下代码:

if (!list_ empty (& sema-»waiters))

{

t=list_entry (list pop front (&sema ->waiters), struct  thread, elem )

thread_ unblock (t) ;

t->block sema=NULL ;

}

因为一个信号量可能会阻塞多个线程,应该将优先级最高的线程从block 态转化为就绪状态。在信号量增加之后,应该加入当前线程的检测函数,以此来判断如果信号量上升之后,是否应该让当前的线程让步。

在信号量的下降函数即 sema 函数中,修改原有的 list push back 方法,转化为新增加的 list is start order 方法,将信号量的等待队列有序化。

/*added-0s3-20181204-step5*/

/*deleted-0s2- 20181121-step6*/

// list_ push_ back (&sema->waiters, &thread current()->elem)

/*deleted-0s2-20181121-step6*/

List insert ordered(&sema->waiters ,&thread current ( )->elem, thread_less,NULL);

/*added-0S2-20181121-step6* /

在条件变量的等待函数中,增加如下代码:

/*CC2-----addeded-----*/

waiter.priority = thread_ current()->priority;

List_insert_ordered(&cond->waiters,&waiter.elem,cond_less,NULL);

/*CC ------finish-------*/

首先定义当前等待者的优先级为当前线程的优先级。

然后将当前线程进入等待队列时,使用 list insert ordered 方法将等待队列有序化。

在修改完所有的源代码之后,进入系统的命令台界面。在 Pintos 操作系统 src/threads 目录下面,运行 make check 命令。

在运行完 make check 命令之后,我们可以看到在最终的子目录检查中,alarm  priority 和以 priority 开头的相关部分检测为 pass,代表实验成功。

相关文章
|
1月前
|
Java 数据库
详解Task 和 ValueTask 的使用区别
详解Task 和 ValueTask 的使用区别
35 0
|
4月前
|
存储
向量化代码实践问题之Task<T>类中的on_completed函数是如何工作的
向量化代码实践问题之Task<T>类中的on_completed函数是如何工作的
|
5月前
|
Java C#
经验大分享:Task的用法
经验大分享:Task的用法
34 0
|
5月前
|
芯片
微机实验二 || 8253定时计数器方波实验
微机实验二 || 8253定时计数器方波实验
|
6月前
|
算法 安全 编译器
C++:模版进阶 | Priority_queue的模拟实现
C++:模版进阶 | Priority_queue的模拟实现
|
6月前
|
算法 C语言 C++
C++:priority_queue模拟实现
C++:priority_queue模拟实现
47 0
|
6月前
|
存储 算法 C++
priority_queue的模拟实现
priority_queue的模拟实现
62 0
|
C++
priority_queue 模拟实现
priority_queue 模拟实现
46 0
|
开发者
priority task2 实验过程|学习笔记
快速学习 priority task2 实验过程
101 0
priority task2 实验过程|学习笔记
|
存储 分布式计算 大数据
Spark 原理_运行过程_stage 和 task 的关系 | 学习笔记
快速学习 Spark 原理_运行过程_stage 和 task 的关系
209 0
Spark 原理_运行过程_stage 和 task 的关系 | 学习笔记