实验三-操作系统实验Nacho_第1页
实验三-操作系统实验Nacho_第2页
实验三-操作系统实验Nacho_第3页
实验三-操作系统实验Nacho_第4页
实验三-操作系统实验Nacho_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验三 操作系统实验Nacho一、实验人员: 二、实验目的:本次实验的目的在于掌握使用nachos中的线程序解决较为复杂的并发问题。实验内容分三部分:实现事件栅栏原语并进行正确性测试;实现闹钟原语并进行正确性测试;利用事件栅栏和闹钟原语来解决电梯问题(详细内容请看nachos-labs.pdf)。三、实验内容:1.实现事件栅栏原语2.实现闹钟原语3. 解决电梯问题四、实验步骤:1. 实现事件栅栏原语EventBarrier.h#ifndef EVENTBARRIER_H#define EVENTBARRIER_H#include synch-sem.h#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#include thread.hEventBarrier: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;delete 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);inbarrier-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. 实现闹钟原语Alarm.h#ifndef ALARM_H#define ALARM_H#include system.h#include list.hclass 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.hextern Alarm *alarm;void check(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(howLongtotalTicks+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 = 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-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.实现单个电梯Elevator.hclass Elevatorpublic:Elevator(char *debugname,int numfloors,int myid); Elevator(); char *getName() return name; void OpenDoors(); /*电梯开门*/ void CloseDoors(int i); /*电梯关门*/ bool VisitFloor(int floor); /*查看电梯是否访问某层*/ bool Enter(int id); /*乘客进入电梯*/ void Exit(int id); /*乘客离开电梯*/ void RequestFloor(int floor); /*乘客阻塞在电梯内部*/ int GetID()return id; int GetFloor()return currentfloor; int GetState()return states;void SetState(int i); /*设置电梯状态*/ bool IFEMPTY(); /*电梯是否为空*/ void GoUp(); /*电梯上行*/ void GoDown(); /*电梯下行*/ private: char *name; int id; int numFloors;/*电梯所能到达的最大楼层*/ int currentfloor; /*目前所在楼层*/ int occupancy; /*目前乘客数目*/ int MaxNumber;/*最大乘客数目*/ int states;/*电梯状态*/ EventBarrier *eventbarrier;/*电梯栅栏*/ bool *ifvisitfloor;/*判断电梯是否停留某楼层的数组*/ Lock *occlock; ;class Building public: Building(char *debugname,int numfloors,int numelevators); Building(); char *getName() return name; void CallUp(int fromFloor); void CallDown(int fromFloor); 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 WakeDown();Elevator *TellElevator(); private: char *name; int NumElevators;/*电梯数目*/ int NumFloors;/*楼层数目*/ EventBarrier *eventbarrier_up;/*上行栅栏*/EventBarrier *eventbarrier_down;/*下行栅栏*/Elevator *elevator;/*一个电梯*/bool *DownLight;/*楼层下行按键*/bool *UpLight;/*楼层上行按键*/;Elevator.cc#include synch-sleep.h#include system.h#include EventBarrier.hEventBarrier:EventBarrier()eventlock=new Lock(eventlcok);complete=new Condition(complete);signal=new Condition(signal);SIGNALED=false;waiters_count=0;EventBarrier:EventBarrier()delete eventlock;delete signal;delete complete;void EventBarrier:Wait()eventlock-Acquire(); waiters_count+;while(!SIGNALED)/*如果事件栅状态是UNSIGNALED,则阻塞*/signal-Wait(eventlock);eventlock-Release(); void EventBarrier:Signal()eventlock-Acquire(); SIGNALED=true;/*设置事件栅栏的状态为SIGNALED*/printf(n set SIGNALED=true,waiting for all forks WakeUp); signal-Broadcast(eventlock);/*唤醒所有阻塞于Signal的线程*/complete-Wait(eventlock);/*阻塞于Complete*/printf(n has already signaled all waiting forks);SIGNALED=false;/*恢复事件栅栏的状态为UNSIGNALED*/printf(n has already reset SIGNALED=falsen);eventlock-Release(); void EventBarrier:Complete()eventlock-Acquire();waiters_count-; if(waiters_count=0)/*最后一个应答,唤醒所有阻塞在complete的线程*/complete-Broadcast(eventlock);else if(waiters_count0)/*并非最后一个应答,阻塞在complete*/complete-Wait(eventlock);else printf(n waiters_count error!);eventlock-Release(); int EventBarrier:Waiters()return waiters_count;五、实验结果1.事件栅栏测试结果2.闹钟测试结果3.电梯测试结果普通

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论