操作系统实验解剖.doc

  1. 1、本文档共36页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
操作系统实验报告 实验一 线程的状态和转换理解跟踪调试 (2)修改EOS,2.1 EOS线程状态转换过程的跟踪与源代码分析 (分析EOS中线程状态及其转换的核心源代码,说明EOS定义的线程状态以及状态转换的实现方法;给出在本部分实验过程中完成的主要工作,包括调试、跟踪 实验主要分析EOS的下列线程状态转换: ①线程由阻塞状态进入就绪状态。 ②线程由运行状态进入就绪状态。 ③线程由就绪状态进入运行状态。 ④线程由运行状态进入阻塞状态。 Loop函数: 系统准备了控制台命令“loop”,命令函数是ke/sysproc.c文件中ConsoleCmdLoop函数(Line 797),此函数中使用LoopThreadFunction创建优先级为8的线程。在线程转换实验中,loop线程的主要作用是表示线程的状态,如运行、阻塞、挂起、就绪、恢复状态。loop线程代码分析如下: LoopThreadFunction(PVOID Param) { ULONG i; ULONG ThreadID = GetCurrentThreadId(); COORD CursorPosition; HANDLE StdHandle = (HANDLE)Param; for (i = 0; i 24; i++) { fprintf(StdHandle, \n);} // 清理整个屏幕的内容。 CursorPosition.X = 0; // 设置线程输出内容显示的位置 CursorPosition.Y = 0; for (i=0;;i++) { // 死循环。 SetConsoleCursorPosition(StdHandle, CursorPosition); fprintf(StdHandle, Loop thread ID %d : %u , ThreadID, i); } // 格式:Thread ID 线程ID : 执行计数 return 0; } 分析:CreateThread用于创建线程,第一个“0”对应于LPSECURITY_ATTRIBUTES,即对象描述符,这个结构为很多函数创建对象是提供安全性设置,第二个“0”和“NULL”为CreateThread的配置参数。LoopThreadFunction是创建loop循环线程,在这个函数中用于在控制台显示的代码在787行的循环函数. 2.1.1线程由阻塞状态进入就绪状态 通过实验步骤的调试,可以将线程由阻塞状态进入就绪状态的步骤总结如下: 状态转换过程中使用到的函数为PspUnwaitThread函数和PspWakeThread 函数,其中PspUnwaitThread函数是使处于等待状态的线程脱离等待队列并转入Zero状态,即使线程脱离阻塞状态。PspWakeThread函数是改变线程的转台值,使Zero状态或者运行状态的线程转入就绪状态。从函数代码分析转换的功能 PspUnwaitThread函数 VOID PspUnwaitThread( IN PTHREAD Thread ) //功能描述:使处于等待状态的线程脱离等待队列并转入 Zero 状态。 //参数: Thread -- 目标线程对象指针。 { ASSERT(Waiting == Thread-State); // 将线程从所在等待队列中移除并修改状态码为Zero。 ListRemoveEntry (Thread-StateListEntry); Thread-State = Zero; // 如果线程注册了等待计时器,则注销等待计时器。 if (STATUS_TIMEOUT == Thread-WaitStatus) { KeUnregisterTimer(Thread-WaitTimer); } } 分析: 函数的参数Thread是目标线程对象指针,执行如下。 ①ASSERT(Waiting == Thread-State); 首先测试线程是不是在等待队列,如果不是则结束函数的执行,在程序运行时,主要用于调试,使其不容易出现错误或异常。 ②ListRemoveEntry(Thread-StateListEntry); Thread-State = Zero

文档评论(0)

妈妈王子 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档