开发者学堂课程【高校精品课-西安电子科技大学-操作系统课程设计: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,代表实验成功。