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

相关文章
|
移动开发 Android开发 开发者
移动应用与系统:探索移动开发与操作系统的协同进化###
本文深入探讨了移动应用开发与移动操作系统之间错综复杂的关系,揭示了技术进步如何推动用户体验的飞跃。通过案例分析和技术解析,本文阐述了开发者在适应不断变化的操作系统环境中面临的挑战与机遇,以及这种互动如何塑造了我们的数字生活。 ###
|
关系型数据库
[postgres]序列
[postgres]序列
103 0
剑指 Offer 57 - II:和为s的连续正数序列
剑指 Offer 57 - II:和为s的连续正数序列
91 0
|
Linux C语言
ZYNQ - 嵌入式Linux开发 -05- Linux C编程和Makefile(二)
ZYNQ - 嵌入式Linux开发 -05- Linux C编程和Makefile
336 0
ZYNQ - 嵌入式Linux开发 -05- Linux C编程和Makefile(二)
|
JSON Java fastjson
JackJSON的用法
网上大多数都是FastJSON的用法,很少有JackJSON的用法。我总结了几个自己经常用到的,供大家参考。
|
NoSQL MongoDB 索引
MongoDB(12)- 查询嵌入文档的数组
MongoDB(12)- 查询嵌入文档的数组
296 0
MongoDB(12)- 查询嵌入文档的数组
|
Arthas Cloud Native Dubbo
用 Arthas “庖丁解牛”
生产环境的 bug 开发环境无法复现怎么办?关键位置没有打印日志信息不足怎么办?莫慌,骚年。让强大的 Arthas法师来 carry,带你去生产环境"遨游"闯关。
用 Arthas “庖丁解牛”
|
SQL 缓存 运维
超干货连载(一)RDS for MySQL 三节点企业版 Learner 只读实例解析
本文介绍三节点企业版只读实例的相关功能和技术实现。
1640 0
超干货连载(一)RDS for MySQL 三节点企业版 Learner 只读实例解析