当前位置:首页 > 北科大操作系统实验报告
操作系统实验报告
学院: 专业: 班级: 学号: 姓名: 指导教师:
成绩:
计算机与通信工程学院 计算机与科学技术
王成耀
2015年 1 月4 日
实验一 线程的状态和转换(5分)
1 实验目的和要求
目的:熟悉线程的状态及其转换,理解线程状态转换与线程调度的关系。 要求:
(1)跟踪调试EOS线程在各种状态间的转换过程,分析EOS中线程状态及其转换的相关源代码;
(2)修改EOS的源代码,为线程增加挂起状态。
2 完成的实验内容
2.1 EOS线程状态转换过程的跟踪与源代码分析
(分析EOS中线程状态及其转换的核心源代码,说明EOS定义的线程状态以及状态转换的实现方法;给出在本部分实验过程中完成的主要工作,包括调试、跟踪与思考等) //使 Zero 状态或者运行状态的线程转入就绪状态 VOID
PspReadyThread( { }
//取消线程的就绪状态,使线程转入 Zero 状态 VOID
PspUnreadyThread( {
ASSERT(NULL != Thread && Ready == Thread->State);
// 将线程从所在的就绪队列中取出,如果线程优先级对应的就绪队列变为空, // 则清除就绪位图中对应的位。
ListRemoveEntry(&Thread->StateListEntry);
if(ListIsEmpty(&PspReadyListHeads[Thread->Priority])) {
BIT_CLEAR(PspReadyBitmap, Thread->Priority);
1
PTHREAD Thread )
ASSERT(NULL != Thread);
ASSERT(Zero == Thread->State || Running == Thread->State);
// 将线程插入其优先级对应的就绪队列的队尾,并设置就绪位图中对应的位。 // 最后将线程的状态修改为就绪状态。
ListInsertTail(&PspReadyListHeads[Thread->Priority], &Thread-BIT_SET(PspReadyBitmap, Thread->Priority); Thread->State = Ready;
>StateListEntry);
PTHREAD Thread )
}
}
Thread->State = Zero;
//使处于等待状态的线程脱离等待队列并转入 Zero 状态 VOID
PspUnwaitThread( { }
2.2为线程增加挂起状态的实现
(给出实现方法的简要描述、源代码、测试和结果等) {
STATUS Status; BOOL IntState; THREAD Thread;
// 根据线程句柄获得线程对象的指针
Status = ObRefObjectByHandle(hThread, sThreadTye, (VOID*)&Thread); if (EOS_SUCCESS(Status)) { }
2
IN PTHREAD Thread )
ASSERT(Waiting == Thread->State);
// 将线程从所在等待队列中移除并修改状态码为Zero。 ListRemoveEntry(&Thread->StateListEntry); Thread->State = Zero;
// 如果线程注册了等待计时器,则注销等待计时器。 if (STATUS_TIMEOUT == Thread->WaitStatus) { }
KeUnregisterTimer(&Thread->WaitTimer);
IntState = KeEnableInterruts(FALSE); // 关中断 if (Zero == Thread->State) { }
KeEnableInterruts(IntState); ObDerefObject(Thread);
// 开中断
ListRemoveEntry(&Thread->StateListEntry); sReadyThread(Thread); sThreadSchedule();
Status = STATUS_SUCCESS; Status = STATUS_NOT_SUORTED;
} else {
}
return Status;
3
共分享92篇相关文档