操作系统实验报告

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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开关中断来实现原语操作。

相关文档
最新文档