北科大操作系统实验报告 联系客服

发布时间 : 星期日 文章北科大操作系统实验报告更新完毕开始阅读8494fe40aa00b52acfc7cae6

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