当前位置:首页 > 北科大操作系统实验报告
2.3支持等待超时唤醒和批量释放功能的EOS信号量实现 (给出实现方法的简要描述、源代码、测试和结果等) { }
BOOL IntState; STATUS flag;
ASSERT(KeGetIntNesting() == 0); // 中断环境下不能调用此函数。 // 目前仅实现了标准记录型信号量,不支持超时唤醒功能,所以 sWait 函数 // 的第二个参数的值只能是 INFINITE。 if (Semahore->Count>0){ } else
flag=sWait(&Semahore->WaitListHead, Milliseconds);
KeEnableInterruts(IntState); // 原子操作完成,恢复中断。 return flag;
Semahore->Count--; flag=STATUS_SUCCESS;
IntState = KeEnableInterruts(FALSE); // 开始原子操作,禁止中断。
8
实验三 时间片轮转调度(5分)
1 实验目的和要求
目的:理解进程(线程)调度的执行时机和过程,掌握调度程序实现的基本方法。 要求:
(1)跟踪调试EOS的线程调度程序,分析EOS基于优先级的抢占式调度的源代码; (2)修改EOS的调度程序,添加时间片轮转调度。
2 完成的实验内容
2.1 EOS基于优先级的抢占式调度工作过程的跟踪与源代码分析
(分析EOS基于优先级的抢占式调度的核心源代码,简要阐述其实现方法;给出在本部分实验过程中完成的主要工作,包括调试、跟踪与思考等) // 选择优先级最高的非空就绪队列的队首线程作为当前运行线程。
PspCurrentThread =
CONTAINING_RECORD(PspReadyListHeads[HighestPriority].Next, THREAD, StateListEntry);
ObRefObject(PspCurrentThread); PspUnreadyThread(PspCurrentThread); PspCurrentThread->State = Running;
2.2为EOS添加时间片轮转调度的实现
(给出实现方法的简要描述、源代码、测试和结果等) { }
运行结果:
//判断被中断进程是否仍处于运行状态
if (NULL != sCurrentThread && Running == sCurrentThread->State){ } return;
//被中断进程的时间片减少1 sCurrentThread->RemainderTicks--; //判断被中断线程的剩余时间片是否等于0 if (sCurrentThread->RemainderTicks==0){ //重新为被中断线程分配时间片
sCurrentThread->RemainderTicks=TICKS_OF_TIME_SLICE; //是否存在和被中断线程优先级相同的就绪进程 if(BIT_TEST(sReadyBitma, sCurrentThread->riority)){ //将被中断线程转入就绪状态,并插入对应就绪队列的末尾 sReadyThread(sCurrentThread);} }
9
3 其他需要说明的问题
//内核中关于线程四种状态的转换规定
// 线程的四种状态:就绪 (Ready)、运行 (Running)、等待 (Waiting) 和结束 (Terminated)。
// 注意:Zero 不是线程的有效状态,是一种游离状态,是线程状态转换的中间态。 tyedef enum _THREAD_STATE { VOID sReadyThread( {
ASSERT(NULL != Thread);
ASSERT(Zero == Thread->State || Running == Thread->State); //
10
Zero, Ready, Running, Waiting, Terminated
// 0 // 1 // 2 // 3 // 4
} THREAD_STATE;
THREAD Thread )
// 将线程插入其优先级对应的就绪队列的队尾,并设置就绪位图中对应的位。 // 最后将线程的状态修改为就绪状态。 //
ListInsertTail(&sReadyListHeads[Thread->riority], &Thread->StateListEntry); BIT_SET(sReadyBitma, Thread->riority);
实验四 物理存储器与进程逻辑地址空间的管理(1分)
1 实验目的和要求
目的:理解物理存储器以及进程逻辑地址空间的管理方法。 要求:
(1)通过查看物理存储器的使用情况,练习物理内存的分配与回收,分析相关源代码,从而理解EOS物理存储器的管理方法;
(2)通过查看进程逻辑地址空间的使用情况,练习虚拟内存的分配与回收,分析相关源代码,从而理解EOS进程逻辑地址空间的管理方法。
2 完成的实验内容
2.1 EOS物理内存分配和回收的练习以及源代码分析
(练习物理内存的分配和回收;分析相关源代码,简要说明EOS中物理存储器的管理方法;给出在本部分实验过程中完成的主要工作,包括调试、跟踪与思考等)
// 分配一个物理页 //
MiAllocateAnyPages(1, PfnArray);
fprintf(StdHandle, \fprintf(StdHandle, \fprintf(StdHandle, \fprintf(StdHandle, \// 然后再释放这个物理页 //
MiFreePages(1, PfnArray);
fprintf(StdHandle, \fprintf(StdHandle, \fprintf(StdHandle, \fprintf(StdHandle, \
MiZeroedPageCount - MiFreePageCount);
MiZeroedPageCount - MiFreePageCount);
11
共分享92篇相关文档