没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
操作系统实验报告
实验一 线程的状态和转换(5分)
1 实验目的和要求
目的:熟悉线程的状态及其转换,理解线程状态转换与线程调度的关系。
要求:
(1)跟踪调试EOS线程在各种状态间的转换过程,分析EOS中线程状态及其
转换的相关源代码;
(2)修改EOS的源代码,为线程增加挂起状态。
2 完成的实验内容
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);
1
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);
}
}
2
将线程从等待队列中移除
将线程的状态由 Waiting 修改为 Zero
将线程插入其优先级对应的就绪队
列的队尾
将线程的状态由 Zero 修改为 Ready
剩余39页未读,继续阅读
资源评论
快乐->成功
- 粉丝: 6
- 资源: 11
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功