




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、中山大学移动信息工程学院本科生实验报告(2016学年秋季学期)课程名称:Operating System 任课教师:饶洋辉 批改人(此处为TA填写):年级+班级xxxxx专业(方向)移动信息工程学院学号xxxxx姓名tiger BeA电话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中找到定义thread_mlfq
3、s表示调度制度,true则采用多级反馈调度程序,false则采用循环调度程序,那么可以得到这个ASSRT是确保采用的是多级反馈队列调度。那么多级反馈队列调度是什么呢?在我们所学的调度算法中,多级反馈队列调度算法允许进程在队列直接移动。是根据不同的CPU区间的特点来区分进程。第一,如果进程使用过多的CPU时间,那么它就会被转移到更低优先级队列;第二,在较低优先级队列中等待时间过程的进程会被转移到更高优先级队列中去。总之,多级反馈队列调度阻止了饥饿的发生,也提高了CPU的利用率。再来看第二个ASSERT,保证当前线程优先级不是默认优先级PRI_DEFAULT,即最高优先级 接着用thread_cr
4、eate()函数创建一个新线程,其优先级为PRI_DEFAULT+1,即保证新创建的线程是当前ready_list中优先级最高的线程,应当发生抢占,故而开始执行该线程的内置函数simple_thread_func()(在该test中实现) 可以看出,test的输出顺序应该是,先输出thread 04线程的msg信息,循环后再输出Thread high-priority done!,随后该抢占的线程运行完毕,再回到test_priority_preempt()中,输出最后一条msg(The high-priority thread should have already completed.)可
5、是输出结果中并没有发生抢占,这就说明我们在thread_create()中就应该判断新创建线程的优先级是否高于当前CPU运行线程,进而判断是否进行抢占2) priority-change分析这个test是为了验证当降低当前拥有最高优先级线程的优先级时,CPU是否会被立即抢占首先来看看test_priority_change()函数的实现首先和priority-preempt.c中一样,ASSRT来确保系统采用的是多级反馈队列调度。其次创建了一个新线程,其优先级设置为PRI_DEFAULT+1(即当前有最高优先级的线程),故而应该发生抢占,开始执行changing_thread()函数 而cha
6、nging_thread()中又降低了该线程的优先级变为PRI_DEFAULT-1,故而该线程的优先级小于父线程的优先级(PRI_DEFAULT),故而又被抢占,CPU开始继续执行test_priority_change()函数剩余的部分 而父线程的优先级又被降低PRI_DEFAULT-2,故而子线程又发生抢占,再继续执行changing_thread()剩余部分,输出msg执行完成,然后再回到test_priority_change()中输出最后一条msg。整理一下输出顺序:首先输出:新create的子线程优先级最高,发生抢占,输出:子线程的优先级被降低,父线程发生抢占,输出:父线程的优先级
7、被降低,子线程发生抢占,输出:子线程执行完毕,继续执行父线程,输出:执行原版本的test,运行结果如下:可以看到,在新create线程和更改线程优先级后,并没有发生抢占,因此,可以知道,我们需要更改thread_set_priority()函数,使得在设置线程优先级后,就判断是否优先级最高,进而判断是否需要抢占2. 函数修改通过之前的test分析,我们需要理清楚了哪些情况下需要考虑优先级调度:1) 当线程 A 占用 CPU 时,有一个更高优先级的线程 B 进入 ready_list,则原线程必须立即让出 CPU,而 B 线程占用 CPU。这种情况的发生原因有二,一是新线程的生成,二是一个线程被
8、唤醒进入 ready_list。后一原因暂且先只考虑调用thread_unblock()进行唤醒的情况2) 当一个线程正在运行时,若其优先级被改变(降低),以至于其优先级比 ready_list 中队首线程的优先级还要低,则让出 CPU故而我们的目标是:1) 当操作系统新创建线程(thread_create()函数),操作系统也需要做相应的检测。每一次创建线程,并加入ready队列后,检测这个加入ready队列的线程的优先级是否大于当前线程,若是,则当前线程退出CPU2) 通过重新设计thread_set_priority()函数,每次修改当前线程的优先级,检测新优先级是否小于ready队列中
9、最高优先级的线程的优先级,如果小于,则当前线程让出CPU下图为具体调用关系;开始函数分析与修改:1) thread_create()中先来看看原函数的实现:第一部分,声明各种变量,给thread t分配空间上面与优先级关系不大,大致说明,就是用palloc_get_page()给t分配了1个的空页,因为这里传入的palloc_flags是PAL_ZERO,故而该页面充满了0。那为什么要用分页的行为来分配空间呢?分页的基本方法就是将逻辑内存(页)和物理内存(帧)分为同样大小的块,当需要执行进程的时候,其页从备份内存中调入到可用的内存帧中。这样就避免了将不同大小的内存块匹配到交换空间上这样的麻烦,
10、分页内存管理方案通过允许物理地址空间为非连续,从而有效解决了外部碎片问题。接着thread_create()中,初始化线程t这里出现了allocate_tid()函数,就是为了给当前线程的贴标签,现在tid持有了这个新线程的标签接着,intr_disable()和intr_set_level()两行配套使用,保证这两行之间为一个原子性操作不可被中断。这中间就是通过初始化这个thread的栈来为其首次run做准备,因为这个过程是自动的,所以中间值stack成员是不能观察到这个过程的。这里与优先级关系不大,故不再详解。在上次实验中,实现优先级调度,已经实现了每次将线程插入就绪队列中,都以优先级顺序
11、插入,所以在thread_create()函数中,只需要在最后加上新线程优先级与当前运行线程优先级的比较, 若高于当前运行线程, 调用thread_yield()使其让出CPU即可(这里的thread_yield()函数,在上次实验报告中剖析的很清楚,其实就是把当前线程扔到就绪队列里, 然后重新schedule(),注意这里如果ready队列为空的话当前线程会继续在CPU执行) 函数修改如下:在末尾的返回tid之前加入2) thread_set_priority()中:先贴出原函数的实现:可以看到,原函数中只是设置了当前线程的优先级,并没有做其他的改变,我们需要的是在设置优先级后,将加入的新优
12、先级线程与ready_list队首的线程优先级比较,若新优先级低于队首线程的优先级,则调用thread_yield()函数切换函数修改如下:修改当前线程的优先级后,加入三、 运行结果1. 总test通过结果:2. priority-preempt测试结果:一个新的线程被创建,优先级高于父线程故而抢占,输出循环结果0-1的迭代过程msg,子线程运行完后输出运行完毕msg,然后回到父线程继续运行,输出运行完毕msg (如图,橙色表示子线程运行输出,其余为父线程运行输出)3. priority-change测试结果:一个新的线程被创建,输出创建msg,优先级高于父线程故而抢占,而后输出降低优先级ms
13、g后,父线程优先级高于子线程优先级故而再次抢占,回到父线程输出子线程优先级低的msg,而后父线程的优先级降低,子线程再次抢占父线程,输出子线程thread2结束msg后,回到父线程继续运行,输出子线程刚刚运行完毕msg,结束(如图,橙色表示子线程运行输出,其余为父线程运行输出)四、 问答题1. 如果不考虑thread_create的情况,test能通过吗?如果不能,会出现什么结果(请截图),并解释为什么会出现这个结果?不考虑create过程的test结果,则两个test都无法pass,原因是当线程A占用CPU 时,有一个更高优先级的线程 B被创建进入ready_list,B线程没有立即抢占CP
14、U2. 什么是PV操作? 什么是信号量1) 信号量:为什么会有信号量呢?为了防止出现因多个程序同时访问一个共享资源而引发的一系列问题,我们需要一种方法,它可以通过生成并使用令牌来授权,在任一时刻只能有一个执行线程访问代码的临界区域。临界区域是指执行数据更新的代码需要独占式地执行。而信号量就可以提供这样的一种访问机制,让一个临界区同一时间只有一个线程在访问它, 也就是说信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程)所拥有,从而解决进程同步与互斥问题。信号量由一个值和一个指针组成,指针指向等待该信号量的进程。信号量的值表示相应资源的使用情况。信号量S>=0时(S表
15、示可用资源的数量)。2) PV操作:进程通常分为就绪、运行和等待(一般为阻塞)三个工作状态。三种状态在某些条件下可以转换,三者之间的转换关系如下:进程三个状态之间的转换就是靠PV操作来控制的。PV操作主要就是P操作、V操作和信号量。其中信号量起到了至关重要的作用。P操作:请求分配一个资源。将信号量S的值减1,即S=S-1;如果S>=0,则该进程继续执行;当S<0时,表示已经没有可用资源,该进程置为等待状态,排入等待队列,S的绝对值表示当前等待该资源的进程数。请求者必须等待其他进程释放该类资源,才能继续运行。V操作:释放一个资源。将信号量S的值加1,即S=S+1;如果S>0,则该进程继续执行;若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。五、 实验感想1. 在分析抢占式优先级时,发现需要考虑优先级调度的还有一种情况:当多个线程因为等待同一把锁、同一个信号量或
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年第二季度(第一次)贵州黔东南州天柱县招聘全日制城镇公益性岗位8人考前自测高频考点模拟试题及答案详解(必刷)
- 2025福建漳州市长泰区中医院社会招聘护理人员2人考前自测高频考点模拟试题及一套答案详解
- 2025年4月广东广州市民政局幼儿园编外教辅人员招聘1名考前自测高频考点模拟试题及答案详解一套
- 2025年南平武夷山职业学院人才招聘考前自测高频考点模拟试题含答案详解
- 2025年永新县面向社会公开招聘城市社区专职网格员【37人】考前自测高频考点模拟试题及答案详解(新)
- 2025年芜湖市残疾人综合服务中心编外工作人员招聘2人考前自测高频考点模拟试题及1套完整答案详解
- 2025湖北大学博士后、师资博士后招聘考前自测高频考点模拟试题及答案详解(历年真题)
- 2025江西科晨技术有限公司高校毕业生招聘(第三批)考前自测高频考点模拟试题附答案详解(完整版)
- 2025福建厦门市集美区实验小学顶岗教师招聘1人模拟试卷及答案详解参考
- 2025春季中国太平校园招聘考前自测高频考点模拟试题及答案详解一套
- 2025年纪检监察业务知识试题库及参考答案
- 国开2025年《行政领导学》形考作业1-4答案
- 广东省广州市天河执信中学2024-2025学年九年级上学期期中考试化学试卷(含答案)
- 2025年甘肃省辅警考试真题及答案
- 安徽省蚌埠市2025-2026学年高三上学期调研性监测语文(含答案)
- 顶管沉井专项施工方案
- GA 1167-2014探火管式灭火装置
- 2022年国家电网有限公司特高压建设分公司校园招聘笔试试题及答案解析
- 文物保护施工方案
- 建筑施工现场消防专题培训课件
- 高中通用技术(相框)设计方案
评论
0/150
提交评论