pintos抢占式优先级

pintos抢占式优先级

ID:40493621

大小:590.63 KB

页数:14页

时间:2019-08-03

pintos抢占式优先级_第1页
pintos抢占式优先级_第2页
pintos抢占式优先级_第3页
pintos抢占式优先级_第4页
pintos抢占式优先级_第5页
资源描述:

《pintos抢占式优先级》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、中山大学移动信息工程学院本科生实验报告(2016学年秋季学期)课程名称:OperatingSystem任课教师:饶洋辉批改人(此处为TA填写):年级+班级xxxxx专业(方向)移动信息工程学院学号xxxxx姓名tigerBeA电话xxxxxEmailxxxxxxxxx开始日期2016.4.24完成日期2016.4.24目录:一、实验目的二、实验过程1.Test分析1)priority-preempt分析2)priority-change分析2.函数修改1)thread_create()修改2)thread_set_priority()修改三、实验结果四、问答题五、

2、实验感想一、实验目的原始Pintos系统对线程的调度采用最简单的FCFS策略,在本实验中,需要为Pintos建立抢占式优先级调度机制,确保任何时刻CPU上运行的都是最高优先级线程。通过对本实验的完成,掌握优先级机制的原理,加深对各等待队列的了解一、实验过程1.Test分析先通过阅读test代码,把握线程的整体结构,然后再做函数修改实现实验目的1)priority-preempt分析这个test是为了测试,最高优先级的线程是否真的抢占首先看看test_priority_preempt()函数第一个ASSERT出现thread_mlfqs,在thread.h中找到定义

3、thread_mlfqs表示调度制度,true则采用多级反馈调度程序,false则采用循环调度程序,那么可以得到这个ASSRT是确保采用的是多级反馈队列调度。那么多级反馈队列调度是什么呢?在我们所学的调度算法中,多级反馈队列调度算法允许进程在队列直接移动。是根据不同的CPU区间的特点来区分进程。第一,如果进程使用过多的CPU时间,那么它就会被转移到更低优先级队列;第二,在较低优先级队列中等待时间过程的进程会被转移到更高优先级队列中去。总之,多级反馈队列调度阻止了饥饿的发生,也提高了CPU的利用率。再来看第二个ASSERT,保证当前线程优先级不是默认优先级PRI_D

4、EFAULT,即最高优先级接着用thread_create()函数创建一个新线程,其优先级为PRI_DEFAULT+1,即保证新创建的线程是当前ready_list中优先级最高的线程,应当发生抢占,故而开始执行该线程的内置函数simple_thread_func()(在该test中实现)可以看出,test的输出顺序应该是,先输出thread0~4线程的msg信息,循环后再输出‘Threadhigh-prioritydone!’,随后该抢占的线程运行完毕,再回到test_priority_preempt()中,输出最后一条msg(‘Thehigh-priorityt

5、hreadshouldhavealreadycompleted.’)可是输出结果中并没有发生抢占,这就说明我们在thread_create()中就应该判断新创建线程的优先级是否高于当前CPU运行线程,进而判断是否进行抢占1)priority-change分析这个test是为了验证当降低当前拥有最高优先级线程的优先级时,CPU是否会被立即抢占首先来看看test_priority_change()函数的实现首先和priority-preempt.c中一样,ASSRT来确保系统采用的是多级反馈队列调度。其次创建了一个新线程,其优先级设置为PRI_DEFAULT+1(即当

6、前有最高优先级的线程),故而应该发生抢占,开始执行changing_thread()函数而changing_thread()中又降低了该线程的优先级变为PRI_DEFAULT-1,故而该线程的优先级小于父线程的优先级(PRI_DEFAULT),故而又被抢占,CPU开始继续执行test_priority_change()函数剩余的部分而父线程的优先级又被降低PRI_DEFAULT-2,故而子线程又发生抢占,再继续执行changing_thread()剩余部分,输出msg执行完成,然后再回到test_priority_change()中输出最后一条msg。整理一下输出

7、顺序:首先输出:新create的子线程优先级最高,发生抢占,输出:子线程的优先级被降低,父线程发生抢占,输出:父线程的优先级被降低,子线程发生抢占,输出:子线程执行完毕,继续执行父线程,输出:执行原版本的test,运行结果如下:可以看到,在新create线程和更改线程优先级后,并没有发生抢占,因此,可以知道,我们需要更改thread_set_priority()函数,使得在设置线程优先级后,就判断是否优先级最高,进而判断是否需要抢占1.函数修改通过之前的test分析,我们需要理清楚了哪些情况下需要考虑优先级调度:1)当线程A占用CPU时,有一个更高优先级的线程B进

8、入read

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。