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,代表实验成功。

相关文章
|
2月前
|
存储
向量化代码实践问题之Task<T>类中的on_completed函数是如何工作的
向量化代码实践问题之Task<T>类中的on_completed函数是如何工作的
|
3月前
|
Java C#
经验大分享:Task的用法
经验大分享:Task的用法
17 0
|
3月前
|
芯片
微机实验二 || 8253定时计数器方波实验
微机实验二 || 8253定时计数器方波实验
|
4月前
|
算法 安全 编译器
C++:模版进阶 | Priority_queue的模拟实现
C++:模版进阶 | Priority_queue的模拟实现
|
11月前
|
算法 C++ 容器
C++初阶之一篇文章教会你queue和priority_queue(理解使用和模拟实现)(下)
优先队列是一种容器适配器,根据严格的弱排序标准,它的第一个元素总是它所包含的元素中最大的。 此上下文类似于堆,在堆中可以随时插入元素,并且只能检索最大堆元素(优先队列中位于顶部的元素)。 优先队列被实现为容器适配器,容器适配器即将特定容器类封装作为其底层容器
|
11月前
|
存储 C++ 容器
C++初阶之一篇文章教会你queue和priority_queue(理解使用和模拟实现)(上)
队列是一种容器适配器,专门用于在FIFO上下文(先进先出)中操作,其中从容器一端插入元素,另一端提取元素。
|
调度 芯片
【玩转RT-Thread】 时钟管理(原理+实战)
【玩转RT-Thread】 时钟管理(原理+实战)
316 0
|
传感器 调度 芯片
【玩转RT-Thread】线程管理(详细原理)(上)
【玩转RT-Thread】线程管理(详细原理)(上)
267 0
|
API 调度
【玩转RT-Thread】线程管理(详细原理)(下)
【玩转RT-Thread】线程管理(详细原理)
262 0
|
设计模式 C++ 容器
C++学习笔记(十九)——stack和queue的模拟实现
C++学习笔记(十九)——stack和queue的模拟实现
C++学习笔记(十九)——stack和queue的模拟实现