實(shí)驗(yàn)三-操作系統(tǒng)實(shí)驗(yàn)Nacho(共11頁(yè))_第1頁(yè)
實(shí)驗(yàn)三-操作系統(tǒng)實(shí)驗(yàn)Nacho(共11頁(yè))_第2頁(yè)
實(shí)驗(yàn)三-操作系統(tǒng)實(shí)驗(yàn)Nacho(共11頁(yè))_第3頁(yè)
實(shí)驗(yàn)三-操作系統(tǒng)實(shí)驗(yàn)Nacho(共11頁(yè))_第4頁(yè)
實(shí)驗(yàn)三-操作系統(tǒng)實(shí)驗(yàn)Nacho(共11頁(yè))_第5頁(yè)
已閱讀5頁(yè),還剩6頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上實(shí)驗(yàn)三 操作系統(tǒng)實(shí)驗(yàn)Nacho一、實(shí)驗(yàn)人員: 二、實(shí)驗(yàn)?zāi)康模罕敬螌?shí)驗(yàn)的目的在于掌握使用nachos中的線程序解決較為復(fù)雜的并發(fā)問(wèn)題。實(shí)驗(yàn)內(nèi)容分三部分:實(shí)現(xiàn)事件柵欄原語(yǔ)并進(jìn)行正確性測(cè)試;實(shí)現(xiàn)鬧鐘原語(yǔ)并進(jìn)行正確性測(cè)試;利用事件柵欄和鬧鐘原語(yǔ)來(lái)解決電梯問(wèn)題(詳細(xì)內(nèi)容請(qǐng)看nachos-labs.pdf)。三、實(shí)驗(yàn)內(nèi)容:1.實(shí)現(xiàn)事件柵欄原語(yǔ)2.實(shí)現(xiàn)鬧鐘原語(yǔ)3. 解決電梯問(wèn)題四、實(shí)驗(yàn)步驟:1. 實(shí)現(xiàn)事件柵欄原語(yǔ)EventBarrier.h#ifndef EVENTBARRIER_H#define EVENTBARRIER_H#include "synch-sem.h&q

2、uot;#define SIGNALED 1 #define UNSIGNALED 0 class EventBarrierpublic:EventBarrier();EventBarrier();void Wait();void Signal();void Complete();int Waiters();private:bool state;Condition *waits;Condition *waitc;Lock *barrier;Lock *inbarrier;int waiter;#endifEventBarrier.cc#include "EventBarrier.h&

3、quot;#include "thread.h"EventBarrier:EventBarrier()waits=new Condition("waitsignal");waitc=new Condition("waitcomplete");barrier=new Lock("barrier");inbarrier=new Lock("inbarrier");state=UNSIGNALED;waiter=0;EventBarrier:EventBarrier()delete waits;del

4、ete waitc;void EventBarrier:Wait()barrier->Acquire();waiter+;while(state=UNSIGNALED)waits->Wait(barrier);barrier->Release();void EventBarrier:Signal()barrier->Acquire();state=SIGNALED;waits->Broadcast(barrier);barrier->Release();inbarrier->Acquire();waitc->Wait(inbarrier);inb

5、arrier->Release();state=UNSIGNALED;void EventBarrier:Complete()inbarrier->Acquire();waiter-;if(waiter=0)waitc->Broadcast(inbarrier);elsewaitc->Wait(inbarrier);inbarrier->Release();int EventBarrier:Waiters()return waiter;2. 實(shí)現(xiàn)鬧鐘原語(yǔ)Alarm.h#ifndef ALARM_H#define ALARM_H#include "syst

6、em.h"#include "list.h"class Alarmpublic:Alarm();Alarm();void Pause(int howLong);void Wakeup();int Getpausenum();private:List *queue;int pausenum;int leftime;#endifAlarm.cc#include "system.h"#include "thread.h"#include "Alarm.h"extern Alarm *alarm;void che

7、ck(int which)while(alarm->Getpausenum()!=0)currentThread->Yield();currentThread->Finish();Alarm:Alarm()queue=new List();pausenum=0;Alarm:Alarm()queue->List();void Alarm:Pause(int howLong)Thread *t;pausenum+;if(pausenum=1)t=new Thread("forked thread");t->Fork(check,0);if(howL

8、ong<=0)return;leftime=stats->totalTicks+howLong*TimerTicks*10000;IntStatus oldlevel=interrupt->SetLevel(IntOff);queue->SortedInsert(currentThread,leftime);currentThread->Sleep();(void) interrupt->SetLevel(oldlevel);void Alarm:Wakeup()Thread *thread; int ptime=-1;IntStatus oldLevel

9、= interrupt->SetLevel(IntOff); thread = (Thread *)queue->SortedRemove(&ptime); (void) interrupt->SetLevel(oldLevel); while( thread != NULL ) if(stats->totalTicks>=ptime)scheduler->ReadyToRun(thread);pausenum-;oldLevel = interrupt->SetLevel(IntOff); thread = (Thread *)queue-&

10、gt;SortedRemove(&ptime); (void) interrupt->SetLevel(oldLevel);continue; elseoldLevel = interrupt->SetLevel(IntOff); queue->SortedInsert(thread,ptime); (void) interrupt->SetLevel(oldLevel); break; intAlarm:Getpausenum()return pausenum;3.實(shí)現(xiàn)單個(gè)電梯Elevator.hclass Elevatorpublic:Elevator(ch

11、ar *debugname,int numfloors,int myid); Elevator(); char *getName() return name; void OpenDoors(); /*電梯開(kāi)門*/ void CloseDoors(int i); /*電梯關(guān)門*/ bool VisitFloor(int floor); /*查看電梯是否訪問(wèn)某層*/ bool Enter(int id); /*乘客進(jìn)入電梯*/ void Exit(int id); /*乘客離開(kāi)電梯*/ void RequestFloor(int floor); /*乘客阻塞在電梯內(nèi)部*/ int GetID()r

12、eturn id; int GetFloor()return currentfloor; int GetState()return states;void SetState(int i); /*設(shè)置電梯狀態(tài)*/ bool IFEMPTY(); /*電梯是否為空*/ void GoUp(); /*電梯上行*/ void GoDown(); /*電梯下行*/ private: char *name; int id; int numFloors;/*電梯所能到達(dá)的最大樓層*/ int currentfloor; /*目前所在樓層*/ int occupancy; /*目前乘客數(shù)目*/ int Max

13、Number;/*最大乘客數(shù)目*/ int states;/*電梯狀態(tài)*/ EventBarrier *eventbarrier;/*電梯柵欄*/ bool *ifvisitfloor;/*判斷電梯是否停留某樓層的數(shù)組*/ Lock *occlock; ;class Building public: Building(char *debugname,int numfloors,int numelevators); Building(); char *getName() return name; void CallUp(int fromFloor); void CallDown(int from

14、Floor); Elevator *AwaitUp(int fromFloor); /*乘客等待,阻塞,返回電梯指針*/ Elevator *AwaitDown(int fromFloor); /*乘客等待,阻塞,返回電梯指針*/ bool GetDownLight(int floor)return DownLightfloor; bool GetUpLight(int floor)return UpLightfloor; void SetDownLight(int t,bool i); void SetUpLight(int t,bool i);void WakeUp();void Wake

15、Down();Elevator *TellElevator(); private: char *name; int NumElevators;/*電梯數(shù)目*/ int NumFloors;/*樓層數(shù)目*/ EventBarrier *eventbarrier_up;/*上行柵欄*/EventBarrier *eventbarrier_down;/*下行柵欄*/Elevator *elevator;/*一個(gè)電梯*/bool *DownLight;/*樓層下行按鍵*/bool *UpLight;/*樓層上行按鍵*/;Elevator.cc#include "synch-sleep.h&q

16、uot;#include "system.h"#include "EventBarrier.h"EventBarrier:EventBarrier()eventlock=new Lock("eventlcok");complete=new Condition("complete");signal=new Condition("signal");SIGNALED=false;waiters_count=0;EventBarrier:EventBarrier()delete eventlock;de

17、lete signal;delete complete;void EventBarrier:Wait()eventlock->Acquire(); waiters_count+;while(!SIGNALED)/*如果事件柵狀態(tài)是UNSIGNALED,則阻塞*/signal->Wait(eventlock);eventlock->Release(); void EventBarrier:Signal()eventlock->Acquire(); SIGNALED=true;/*設(shè)置事件柵欄的狀態(tài)為SIGNALED*/printf("n set SIGNALED

18、=true,waiting for all forks WakeUp"); signal->Broadcast(eventlock);/*喚醒所有阻塞于Signal的線程*/complete->Wait(eventlock);/*阻塞于Complete*/printf("n has already signaled all waiting forks");SIGNALED=false;/*恢復(fù)事件柵欄的狀態(tài)為UNSIGNALED*/printf("n has already reset SIGNALED=falsen");eventlock->Release(); void EventBarrier:Complete()eventlock->Acquire();waiters_c

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論