- 1、本文档共36页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)