pintos操作系统实验一-医学资料

上传人:杰猫 文档编号:119277252 上传时间:2020-01-11 格式:PPTX 页数:24 大小:1.41MB
返回 下载 相关 举报
pintos操作系统实验一-医学资料_第1页
第1页 / 共24页
pintos操作系统实验一-医学资料_第2页
第2页 / 共24页
pintos操作系统实验一-医学资料_第3页
第3页 / 共24页
pintos操作系统实验一-医学资料_第4页
第4页 / 共24页
pintos操作系统实验一-医学资料_第5页
第5页 / 共24页
点击查看更多>>
资源描述

《pintos操作系统实验一-医学资料》由会员分享,可在线阅读,更多相关《pintos操作系统实验一-医学资料(24页珍藏版)》请在金锄头文库上搜索。

1、操作系统课程实验 TA:林璋玮 彭禹惟 冯善恒 李宏 钊 课程计划 第5周:实验环境安装与搭建(part0) 第67周:线程的休眠与唤醒(part1) 第89周:优先级调度(part2) 第1011周:线程锁、信号量与优先级继承 (part3) 第1214周:多级反馈队列调度(part4) 实验一.Non-busy waiting 通过修改pintos的线程休眠函数来保证 pintos不会在一个线程休眠时忙等待。 相关文件 pintos/src/devices目录: timer.h, timer.c pintos/src/threads目录: thread.h, thread.c 需要阅读相关

2、结构体以及函数。 Pintos的机制 出于安全性等考虑,每隔一段时间操作系 统必须获得CPU时间,进行进程调度等工作。 而操作系统是通过中断来获得CPU时间 pintos中操作系统中断频率为 、 Pintos的机制 Timer中断产生时这个函数就会被调用。 中断相关 pintos/src/threads目录: interrupt.c 和 interrupt.h 该枚举定义了中断是开还是关,在原子操作 中必须保证中断是关的。 用函数interrupt_disable()来关闭中断。 thread Pintos中定义了一个thread的结构体用于存储 线程的信息(包括优先级,状态等),位于 thr

3、ead.h。 其中thread有四个状态: Thread这个结构体贯穿整个实验。 thread 线程休眠 timer.c中实现了线程休眠的函数thread_sleep 这个函数作用是让线程休眠一定的时间。 ASSERT作用是若语句不为真则退出。 线程休眠时必须保证中断是打开的。 线程休眠 thread_sleep的实现原理是通过不断轮询检查 经过时间是否达到ticks,若还没达到则调用 thread_yield函数,达到了ticks就会结束休 眠。 thread_yield 该函数会把当前线程放进ready队 列,并调度下一个线程,线程调 度时要保证中断关闭。 schedule 专门负责线程切

4、换的函数,执行了以后会把 当前线程放进队列里并调度出下一个线程。 线程休眠问题? Thread_yield函数只是把线程放进调度队列, 然后切换线程,此时休眠线程状态是ready, 在一个tick内依然有可能会被调度,继续消耗 cpu时间,没有完全把时间让给别的进程,这 样就违反了线程休眠的原则,造成了忙等 待。 目标 通过重新设计thread_sleep函数让休眠线程不 再占用cpu时间,只在每次tick中断把时间交 给操作系统时再检查睡眠时间,tick内则把 cpu时间让给别的线程。 解决办法 1.重写timer_sleep函数,不是调用thread_yield 而是调用thread_bl

5、ock函数把线程block了,这 样在unblock之前该线程都不会被调度执行。 2.Thread结构体中新增成员变量ticks_blocked ,记录线程剩余睡眠的时间(单位:tick)。初 始化为0,在timer_sleep函数中把tick赋值为睡 眠时间。 解决办法 3.thread.c中增加函数checkInvoke判断线程是 否休眠完毕(ticks_blocked的值)。 4.处理timer中断时(timer_interrupt)遍历所有 线程(thread_for_each,详细见代码)并判断被 block线程是否睡眠完毕,睡眠完毕则唤醒。 解决办法 完成上述步骤以后,大部分的al

6、arm测试都通 过了。但是alarm_priority依然还没通过。接 下来介绍解决alarm_priority的知识。 list List的结构,list中存放的数据类型是 list_elem,存放待执行线程靠的就是 list。 Thread与list 有一个list变量ready_list专门存放待执行的线 程,由于list存放的是list_elem类型,因此 thread中有一个成员变量专门用于在ready_list 中“排队”。 Thread与list 既然在ready_list中并不是thread而只是 thread的一个成员,怎么通过list中的elem来 访问对应线程的其他变量?

7、List中已经提供了 一个宏定义解决这个问题。 解决办法 alarm-priority要求线程是根据优先级进行调 度的,而pintos的基本实现是直接把线程放进 ready_list尾部,是FIFO的调度方式。如果要 通过这个测试就必须保证在ready_list中线程 是有序的。 hints:使用list_insert_order函数可以保证 有序插入。 注意事项 1.先阅读源代码和测试的代码。把握线程 的整体结构,以后做实验也会轻松一点。 2.调用函数前要看看该函数是否要求关闭 或者打开中断。 3.修改前最好备份一下。 成功标志 make check中通过所有的alarm测试! 报告要求 1.回答问题: (1).为什么未经修改仍能通过一些测 试(alarm)? (2).为什么有些测试不能通过? 2.简单解说一下每个测试做了什么, 并描述一下过程 3.关键代码截图,实验感想

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号