操作系统实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统实验报告
学院:计算机与通信工程学院
专业:计算机
班级:
学号:
姓名:
指导教师:
成绩:
2014年12月25日
实验一线程的状态和转换(5分)
1 实验目的和要求
目的:熟悉线程的状态及其转换,理解线程状态转换与线程调度的关系。
要求:
(1)跟踪调试EOS线程在各种状态间的转换过程,分析EOS中线程状态及其转换的相关源代码;
(2)修改EOS的源代码,为线程增加挂起状态。
2 完成的实验内容
2.1 EOS线程状态转换过程的跟踪与源代码分析
(分析EOS中线程状态及其转换的核心源代码,说明EOS定义的线程状态以及状态转换的实现方法;给出在本部分实验过程中完成的主要工作,包括调试、跟踪与思考等)EOS定义的线程状态在ps/psp.h的THREAD_STATE枚举中,包含Zero(线程状态转换过程中的中间状态)、Ready(就绪)、Running(运行)、Waiting(等待)、Terminated (结束)。
线程在不同的状态间相互转换时,通过调用ps/sched.c文件中的下面几个函数完成:PspReadyThread(将指定线程插入其优先级对应的就绪队列的队尾,并修改其状态码为Ready)、PspUnreadyThread(将指定线程从就绪队列中移除,并修改其状态码为Zero)、PspWait(将当前运行线程插入指定等待队列的队尾,并修改状态码为Waiting,然后执行线程调度)、PspUnwaitThread(将阻塞线程从其所在的等待队列中移除,并修改其状态码为Zero)、PspWakeThread(调用PspUnwaitThread 函数使线程脱离阻塞状态,然后调用PspReadyThread函数使线程进入就绪状态,从而唤醒被阻塞的线程)、PspSelectNextThread(使被抢先的线程从运行状态进入就绪状态,并决定哪个就绪线程应该进入运行状态)。
实验中通过对上述函数添加断点,通过EOS的loop命令观察线程状态的变化、使用pt命令查看各线程状态。
2.2为线程增加挂起状态的实现
(给出实现方法的简要描述、源代码、测试和结果等)
在psp.h中为THREAD_STATE添加Hang作为挂起状态的标志:
typedef enum _THREAD_STATE {
Zero, // 0
Ready, // 1
Running, // 2
Waiting, // 3
Terminated, // 4
Hang // 5
} THREAD_STATE;
修改psspng.c中PsSuspendThread函数如下:
{
STATUS Status;
BOOL IntState;
PTHREAD Thread;
Status = ObRefObjectByHandle(hThread, PspThreadType,
(PVOID*)&Thread);
if (EOS_SUCCESS(Status)) {
IntState = KeEnableInterrupts(FALSE);
if (Ready == Thread->State) {
PspUnreadyThread(Thread);
Thread->State = Hang; //修改为挂起状态
ListInsertTail(&SuspendListHead, &Thread-
>StateListEntry);
Status = STATUS_SUCCESS;
} else {
Status = STATUS_NOT_SUPPORTED;
}
KeEnableInterrupts(IntState);
ObDerefObject(Thread);
}
return Status;
}
修改PsResumThread函数如下:
STATUS Status;
BOOL IntState;
PTHREAD Thread;
Status = ObRefObjectByHandle(hThread, PspThreadType, (PVOID*)&Thread);
if (EOS_SUCCESS(Status)) {
IntState = KeEnableInterrupts(FALSE);
if (Hang == Thread->State) {
Thread->State = Zero; //恢复为zero状态
ListRemoveEntry(&Thread->StateListEntry); //从挂起列队删除
PspReadyThread(Thread); //加入到就绪列队
PspThreadSchedule(); //调度线程
Status = STATUS_SUCCESS;
} else {
Status = STATUS_NOT_SUPPORTED;
}
KeEnableInterrupts(IntState);
ObDerefObject(Thread);
}
return Status;
}
在sysproc.c中修改ConsoleCmdProcAndThread函数为pt命令添加Hang显示:switch(pThread->State) {
case Zero:
ThreadState = "Zero ";
break;
case Ready:
ThreadState = "Ready ";
break;
case Running:
ThreadState = "Running ";
break;
case Waiting:
ThreadState = "Waiting ";
break;
case Terminated:
ThreadState = "Terminated";
break;;
case Hang:
ThreadState = "Hang";
break;;
default:
ThreadState = "Undefined ";
}
测试用suspend命令挂起loop命令的线程后,loop的循环暂停。pt中查看loop 的线程状态变为Hang。之后用resume命令恢复loop线程,循环恢复,pt中查看loop 线程状态为Ready。
3 其他需要说明的问题
在pt中还列出了loop的31号线程以外的多个系统线程。其中loop线程状态不是Running而是Ready是因为EOS是单处理器系统,执行pt命令时pt的线程成为Running而loop线程进入就绪状态变为Ready。
EOS使用KeEnableInterrupts开关中断来实现原语操作。