计算机操作系统-实验报告

上传人:F****n 文档编号:100207954 上传时间:2019-09-22 格式:DOC 页数:15 大小:470KB
返回 下载 相关 举报
计算机操作系统-实验报告_第1页
第1页 / 共15页
计算机操作系统-实验报告_第2页
第2页 / 共15页
计算机操作系统-实验报告_第3页
第3页 / 共15页
计算机操作系统-实验报告_第4页
第4页 / 共15页
计算机操作系统-实验报告_第5页
第5页 / 共15页
点击查看更多>>
资源描述

《计算机操作系统-实验报告》由会员分享,可在线阅读,更多相关《计算机操作系统-实验报告(15页珍藏版)》请在金锄头文库上搜索。

1、操作系统实验报告学院:计算机与通信工程学院专业:计算机科学与技术班级:学号:姓名:指导教师:成绩: 2014年 1 月 1 日阳气决定着脏腑的工作能力,而脏腑的工作能力又决定着身体的健康状况和寿命,所以说,想要身体好一点,寿命长一点,就要学会保护好我们的阳气,增加阳气。健康人晒晒太阳,就能吸收到充足的阳气了,但对于老年人和体质特别虚弱的人来说,恐怕吸收来的阳气也不够解燃眉之急的实验一 线程的状态和转换(5分)1 实验目的和要求目的:熟悉线程的状态及其转换,理解线程状态转换与线程调度的关系。要求:(1)跟踪调试EOS线程在各种状态间的转换过程,分析EOS中线程状态及其转换的相关源代码;(2)修改

2、EOS的源代码,为线程增加挂起状态。2 完成的实验内容2.1 EOS线程状态转换过程的跟踪与源代码分析(分析EOS中线程状态及其转换的核心源代码,说明EOS定义的线程状态以及状态转换的实现方法;给出在本部分实验过程中完成的主要工作,包括调试、跟踪与思考等)1.EOS 准备了一个控制台命令“loop ”,这个命令的命令函数是 ke/sysproc.c 文件中的ConsoleCmdLoop 函数(第797行 ,在此函数中使用 LoopThreadFunction 函数(第755 行)创建了一个优先级为 8 的线程(后面简称为“loop 线程”),该线程会在控制台中不停的(死循环)输出该线程的ID和

3、执行计数,执行计数会不停的增长以表示该线程在不停的运行。loop命令执行的效果可以参见下图: 2. 线程由阻塞状态进入就绪状态 (1)在虚拟机窗口中按下一次空格键。 (2)此时EOS会在PspUnwaitThread函数中的断点处中断。在“调试”菜单中选择“快速监视”,在快速监视对话框的表达式编辑框中输入表达式“*Thread”,然后点击“重新计算”按钮,即可查看线程控制块(TCB)中的信息。其中State域的值为3(Waiting),双向链表项StateListEntry的Next和Prev指针的值都不为0,说明这个线程还处于阻塞状态,并在某个同步对象的等待队列中;StartAddr域的值为

4、IopConsoleDispatchThread,说明这个线程就是控制台派遣线程。(3)关闭快速监视对话框,激活“调用堆栈”窗口。根据当前的调用堆栈,可以看到是由键盘中断服务程序(KdbIsr)进入的。当按下空格键后,就会发生键盘中断,从而触发键盘中断服务程序。在该服务程序的最后中会唤醒控制台派遣线程,将键盘事件派遣到活动的控制台。(4)在“调用堆栈”窗口中双击PspWakeThread函数对应的堆栈项。可以看到在此函数中连续调用了PspUnwaitThread函数和PspReadyThread函数,从而使处于阻塞状态的控制台派遣线程进入就绪状态。 (5)在“调用堆栈”窗口中双击PspUnwa

5、itThread函数对应的堆栈项,先来看看此函数是如何改变线程状态的。按F10单步调试直到此函数的最后,然后再从快速监视对话框中观察“*Thread”表达式的值。此时State域的值为0(Zero),双向链表项StateListEntry的Next和Prev指针的值都为0,说明这个线程已经处于游离状态,并已不在任何线程状态的队列中。仔细阅读PspUnwaitThread函数中的源代码,理解这些源代码是如何改变线程状态的。 (6)按F5继续执行,在PspReadyThread函数中的断点处中断。按F10单步调试直到此函数的最后,然后再从快速监视对话框中观察“*Thread”表达式的值。此时Sta

6、te域的值为1(Ready),双向链表项StateListEntry的Next和Prev指针的值都不为0,说明这个线程已经处于就绪状态,并已经被放入优先级为24的就绪队列中 3.线程由运行状态进入就绪状态 (1)按F5继续执行,在PspSelectNextThread函数中的断点处中断。在快速监视对话框中查看“*PspCurrentThread”表达式的值,观察当前占用处理器的线程的情况。其中State域的值为2(Running),双向链表项StateListEntry的Next和Prev指针的值都为0,说明这个线程仍然处于运行状态,由于只能有一个处于运行状态的线程,所以这个线程不在任何线程状

7、态的队列中;StartAddr域的值为LoopThreadFunction,说明这个线程就是loop线程。注意,在本次断点被命中之前,loop线程就已经被中断执行了,并且其上下文已经保存在线程控制块中。 (2)按F10单步调试,直到对当前线程的操作完成(也就是花括号中的操作完成)。再从快速监视对话框中查看“*PspCurrentThread”表达式的值。其中State域的值为1(Ready),双向链表项StateListEntry的Next和Prev指针的值都不为0,说明loop线程已经进入了就绪状态,并已经被放入优先级为8的就绪队列中。仔细阅读PspSelectNextThread函数这个花

8、括号中的源代码,理解这些源代码是如何改变线程状态的,并与PspReadyThread函数中的源代码进行比较,说明这两段源代码的异同,体会为什么在这里不能直接调用PspReadyThread函数。 4.线程由就绪状态进入运行状态 (1)按F5继续执行,在PspUnreadyThread函数中的断点处中断。在快速监视对话框中查看“*Thread”表达式的值。其中State域的值为1(Ready),双向链表项StateListEntry的Next和Prev指针的值都不为0,说明这个线程处于就绪状态,并在优先级为24的就绪队列中;StartAddr域的值为IopConsoleDispatchThrea

9、d,说明这个线程就是控制台派遣线程。(2)关闭快速监视对话框后,在“调用堆栈”窗口中激活PspSelectNextThread函数对应的堆栈项,可以看到在PspSelectNextThread函数中已经将PspCurrentThread全局指针指向了控制台派遣线程,并在调用PspUnreadyThread函数后,将当前线程的状态改成了Running。(3)在“调用堆栈”窗口中激活PspUnreadyThread函数对应的堆栈项,然后按F10单步调试,直到返回PspSelectNextThread函数并将线程状态修改为Running。再从快速监视对话框中查看“*PspCurrentThread”

10、表达式的值,观察当前占用处理器的线程的情况。其中State域的值为2(Running),双向链表项StateListEntry的Next和Prev指针的值都为0,说明控制台派遣线程已经处于运行状态了。接下来,会将该线程的上下文从线程控制块(TCB)复制到处理器的各个寄存器中,处理器就可以从该线程上次停止运行的位置继续运行 5.线程由运行状态进入阻塞状态. (1)按F5继续执行,在PspWait函数中的断点处中断。在快速监视对话框中查看“*PspCurrentThread”表达式的值,观察当前占用处理器的线程的情况。其中State域的值为2(Running),双向链表项StateListEntr

11、y的Next和Prev指针的值都为0,说明这个线程仍然处于运行状态;StartAddr域的值为IopConsoleDispatchThread,说明这个线程就是控制台派遣线程。(2)按F10单步调试,直到左侧的黄色箭头指向代码第248行。再从快速监视对话框中查看“*PspCurrentThread”表达式的值。其中State域的值为3(Waiting),双向链表项StateListEntry的Next和Prev指针的值都不为0,说明控制台派遣线程已经处于阻塞状态了,并在某个同步对象的等待队列中。第248行代码可以触发线程调度功能,会中断执行当前已经处于阻塞状态的控制台派遣线程,并将处理器上下文

12、保存到该线程的线程控制块。2.2为线程增加挂起状态的实现(给出实现方法的简要描述、源代码、测试和结果等) 1.为线程增加挂起状态 (1)删除之前添加的所有断点。 (2)按F5启动调试。 (3)待EOS启动完毕,在EOS控制台中输入命令“loop”后按回车。此时可以看到loop线程的执行计数在不停增长,说明loop线程正在执行。记录下loop线程的ID。 (4)按Ctrl+F2切换到控制台2,输入命令“suspend 31”(如果loop线程的ID是31)后按回车。命令执行成功的结果如下图所示。 (5)按Ctrl+1切换回控制台1,可以看到由于loop线程已经成功被挂起,其执行计数已经停止增长了

13、。此时占用处理器的是EOS中的空闲线程。 2.完成Resume原语后,可以先使用suspend命令挂起loop线程,然后在控制台2中输入命令“Resume 31”(如果loop线程的ID是31)后按回车。命令执行成功的结果如下图所示。如果切换回控制台1后,发现loop线程的执行计数恢复增长就说明Resume原语可以正常工作。设计代码STATUSPsResumThread(IN HANDLE hThread)STATUS Status;BOOL IntState;PTHREAD Thread;Status = ObRefObjectByHandle(hThread, PspThreadType,

14、 (PVOID*)&Thread);if (EOS_SUCCESS(Status) IntState = KeEnableInterrupts(FALSE);/ 关中断if (Zero = Thread-State) ListRemoveEntry(&Thread-StateListEntry);PspReadyThread(Thread);PspThreadSchedule();Status = STATUS_SUCCESS; else Status = STATUS_NOT_SUPPORTED;KeEnableInterrupts(IntState);/ 开中断ObDerefObject(

15、Thread);return Status;1. 首先调用 ListRemoveEntry 函数将线程从挂起线程队列中移除。 2. 然后调用 PspReadyThread 函数将线程恢复为就绪状态。 3. 最后调用 PspThreadSchedule 宏函数执行线程调度,让刚刚恢复的线程有机会执行。3 其他需要说明的问题 实验二 进程的同步(7分)1 实验目的和要求目的:理解进程同步的原理和意义,掌握信号量的实现方法和应用。要求:(1)使用EOS的信号量,实现生产者-消费者问题; (2)跟踪调试EOS信号量的工作过程,分析EOS信号量实现的源代码;(3)修改EOS信号量的实现代码,使之支持等待超时唤醒和批量释放功能。2 完成的实验内容2.1 使用EOS的信号量实现生产者-消费者问题(简要说明使用EOS的信号量解决生产者-消费者问题的实现方法;给出在本部分实验过程中完成的主要工作,包括调试、跟踪、测试与思考等)EOS使用CreateThread

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > 教学/培训

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