1 / 36
文档名称:

操作系统实验报告.doc

格式:doc   大小:927KB   页数:36页
下载后只包含 1 个 DOC 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

操作系统实验报告.doc

上传人:陈潇睡不醒 2018/1/23 文件大小:927 KB

下载得到文件列表

操作系统实验报告.doc

文档介绍

文档介绍:操作系统实验报告
实验一线程的状态和转换(5分)
1 实验目的和要求
目的:熟悉线程的状态及其转换,理解线程状态转换与线程调度的关系。
要求:
(1)跟踪调试EOS线程在各种状态间的转换过程,分析EOS中线程状态及其转换的相关源代码;
(2)修改EOS的源代码,为线程增加挂起状态。
2 完成的实验内容
EOS线程状态转换过程的跟踪与源代码分析
(分析EOS中线程状态及其转换的核心源代码,说明EOS定义的线程状态以及状态转换的实现方法;给出在本部分实验过程中完成的主要工作,包括调试、跟踪与思考等)
实验主要分析EOS的下列线程状态转换:
①线程由阻塞状态进入就绪状态。
②线程由运行状态进入就绪状态。
③线程由就绪状态进入运行状态。
④线程由运行状态进入阻塞状态。
Loop函数:
系统准备了控制台命令“loop”,命令函数是ke/(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");} // 清理整个屏幕的内容。
= 0; // 设置线程输出内容显示的位置
= 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行的循环函数.

通过实验步骤的调试,可以将线程由阻塞状态进入就绪状态的步骤总结如下:
将线程从等待队列中移除

将线程的状态由 Waiting 修改为 Zero
将线程插入其优先级对应的就绪队列的队尾
将线程的状态由 Zero 修改为 Ready
状态转换过程中使用到的函数为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);
首先测试线程是不是在等待队列,如果不是则结束函数的执行,在程序运行时,主要用于调试,使其不容易出现错误或异常。
②L