基于当时刚刚接触NACHOS时无从下手的窘迫,现在贴出一份自己的实验报告,跟大家交流下
操作系统实验3
关于调度算法的实现
我们实现的是Shortest Job First ,Shortest Remaining Next & Priority,Round-Robin 和Multiple Queues这5个调度的算法。
经过我一个多星期对文档的阅读和与同学的讨论,初步弄明白了Nachos的线程调度的基本的概念和流程。
本次的实验,Nachos用了一个叫List的模板类来维护进程的链表以及其他的链表,所有的链表操作都可以通过里面定义的函数来操作,里面有很关键的SortedInsert函数,确保可以按照一定的顺序来插入数据。另外通过对线程类型的阅读,也发现了里面有timeLeft,priority等的私有成员,可以记录剩余时间和优先级。对于其他的成员函数就不是十分熟悉他们的整个执行的流程了。
对于进程的调度,是由一个叫做scheduler的类来控制整个线程的调度,包括执行队列,线程间切换,线程的运行,处理机的时间分块运行。本次实验通过对两个函数, ReadyToRun()和ShouldISwitch()来实现我们的调度策略。
Void Scheduler::ReadyToRun (Thread *thread)
{
DEBUG('t', "Putting thread %s on ready list./n", thread->getName());
thread->setStatus(READY);
switch (policy)
{
case SCHED_PRIO:
readyList->SortedInsert(thread,20-thread->getPriority());break; // Priority
case SCHED_MQ:
readyList->SortedInsert(thread,20-thread->getPriority());break;
// Multiple Queues
case SCHED_SJF:
readyList->SortedInsert(thread,thread->getTimeLeft());
break;// Shortest Job First
case SCHED_SRTN:
readyList->SortedInsert(thread,thread->getTimeLeft());
break; // Shortest Remaining Time Next
case SCHED_FCFS:
readyList->Append(thread);
break;// First Come First Served (FCFS) scheduling
// FCFS is the NachOS default
case SCHED_RR:
readyList->Append(thread);
break;// Round Robin scheduling
default:
readyList->Append(thread);
break;
}
}
bool Scheduler::ShouldISwitch (Thread * oldThread, Thread * newThread)
{
bool answer;
switch( policy )