Lab9 设计并实现具有优先级的线程调度策略实验目标熟悉nachos中的线程调度策略设计并实现具有优先级的线程调度策略实验环境ubuntu操作系统 nachos- gcc--mips编译器关键源代码及注释通过查看nachos源代码的Thread,List和Scheduler类,我们发现nachos系统中是采用非抢占式的FCFS线程调度策略的,线程一旦占用了CPU,就会一直运行到线程结束或被阻塞。thread目录下的list类定义就绪队列的数据结构,所有的链表操作都可以通过里面定义的函数来操作。其中的SortedInsert函数,每当插入一个item时,就会根据其"sortKey”大小把item插入到合适的位置,最后list中的item是按照sortKey的大小升序排列的。voidList::SortedInsert(void*item,intsortKey)//这是实现优先级调度策略的关键{ListElement*element=newListElement(item,sortKey);ListElement*ptr; //keeptrackif(IsEmpty()){ //iflistisempty,putfirst=element;last=element;}elseif(sortKey<first->key){ //itemgoesonfrontoflist element->next=first; first=element;}else{ //lookforfirsteltinlistbiggerthanitemfor(ptr=first;ptr->next!=NULL;ptr=ptr->next){if(sortKey<ptr->next->key){ element->next=ptr->next; ptr->next=element; return; } } last->next=element; //itemgoesatendoflist last=element;}}在:Thread的Yield方法和scheduler中可以看到,当一个线程要插入到就绪队列上时,只是将该线程加到了队尾,当一个线程被阻塞或运行结束时,就让绪队列中的第一个线程运行,这样的调度只能是FCFS调度。voidThread::Yield(){Thread*nextThread;IntStatusoldLevel=interrupt->SetLevel(IntOff);ASSERT(this==currentThread);DEBUG('t',"Yieldingthread\"%s\"\n",getName());nextThread=scheduler->FindNextToRun();if(nextThread!=NULL){ scheduler->ReadyToRun(this); scheduler->Run(nextThread);}(void)interrupt->SetLevel(oldLevel);}voidScheduler::ReadyToRun(Thread*thread){DEBUG('t',"Puttingthread%sonreadylist.\n",thread->getName());thread->setStatu
nachos 实验9 来自淘豆网www.taodocs.com转载请标明出处.