logo资料库

操作系统实验2死锁的避免.doc

第1页 / 共11页
第2页 / 共11页
第3页 / 共11页
第4页 / 共11页
第5页 / 共11页
第6页 / 共11页
第7页 / 共11页
第8页 / 共11页
资料共11页,剩余部分请下载后查看
死锁的避免 实验目的和要求 1 实验目的 为了了解系统的资源分配情况,假定系统的任何一种资源在任一时刻只能被一个进程使用。 任何进程已经占用的资源只能由进程自己释放,而不能任由其他进程抢占。当进程申请的资 源不能满足时,必须等待。因此,只要资源分配算法能保证进程的资源请求,且不出现循环 等待,则系统不会出现死锁。 编写模拟系统进行资源调度的程序,一个是随机算法,即只要系统剩余资源能满足进程 的当前要求,就立即将资源分配给进程,以观察死锁产生情况;一个是采用银行家 算法, 有效地避免死锁的产生。 模拟进程的资源分配算法,了解死锁的产生和避免方法。 2 实验要求 书写实验报告,应该包括以下几项内容: (1)实验题目; (2)程序中使用的数据结构及主要符号说明; (3)程序流程图和带有注释的源程序; (4)执行程序名,并打印程序运行时的初值和运行结果; (5)通过实验后的收获与体会及对实验的改进意见和见解。 实验内容 (1)为了观察死锁的产生和避免的情况,要求设计 3~4 个并发进程,共享系统的 10 个同类 不可抢占的资源。各进程是动态进行资源的申请和释放。 (2)用随机算法和银行家算法分别设计一个资源分配程序,运行这两个程序,观察系统运 行情况,并对系统运行的每一 步情况进行显示。 由于随机算法比较简单,不需要更多的描述,只要在进程申请资源时,系统能够满足 它的请求,就立即进行分配,直到系统的全部进程完成或出现死锁为止。 设计提示如下: 初始化这组进程的资源请求和依次申请的资源序列,把进程已占用和需求的资源情况 记录在进程控制块中,假定进程控制块的格式如图 7-1 所示。 进程状态有:就绪、等待和完成。当系统不能满足进程的资源请求时,进程处于等待 态。“资源需求总量”表示进程运行过程中对资源的最大需求总量。显然每个进程的资源需 求总量不应超过系统拥有的资源总量。因此,进程在以后还需要的剩余资源量等于资源需要 量减去已占资源量。“当前申请量”是指进程运行时需要申请的资源量。 进程名 状态 资源需求总量 当前申请量 已占资源量 能执行完标志 图 7-1 进程控制块的格式
程序流程图和思想 银行家算法分配资源的原则是: (1)当某个进程资源请求时,假定先分配给它,之后调用系统安全性检查算法,进行系统 安全性检查。若系统安全,假分配变为真分配。否则作废假分配,让进程等待。 (2)系统安全性检查算法。 用系统的剩余资源量与各进程的剩余资源量进行比较,检查系统的剩余资源量是否大于或 等于其中一个进程的剩余资源量。若是,则转,否则转。 将资源分配给所选的进程,这样,该进程已获得资源最大需求量,标记这个进程“能执行 完标志”为 TRUE.并将它占有的全部资源归还给系统。转 检查所有进程的“能执行完标志”是否都为 TRUE.若是,以标识“系统安全”返回,否则, 以“系统不安全”返回。 由于银行家算法可以避免死锁,为了观察死锁现象的发生,随机算法的分配原则是: 当进程申请资源时,如果系统现存资源数能满足进程的当前申请量,就把资源分配给进 程;否则,让其等待。这样,运行的结果可能所有的进程都能顺利的完成,或系统出现死锁。
源程序 #include #include #include using namespace std; const int TASK_RUNNING=0; const int TASK_SUCCEED=1; const int TASK_WAITING=2; ofstream ff("result.txt"); const int RMAX=10; const int PMAX=4; int Rcs_left=RMAX; class pcb { public: int p_pid; int p_stat; int p_apply; int p_occupy; bool p_issuc; int p_require; pcb(int id,int require) { p_pid=id; p_require=require; p_stat=TASK_RUNNING; p_occupy=0; p_issuc=false; p_apply=0; } friend ostream & operator<<(ostream &cout,const pcb &p) { cout<&pgrp); void banker(vector&pgrp); void wakeup(vector&pgrp,int available); bool isFinished(vector&pgrp); bool isSafeState(vector&pgrp,int available);
vector::iterator getFirstRunningProcess(vector&pgrp); void readApply(vector::iterator proc); int main() { vectorpgrp; cout<<"ENTER THE MAX NUMBER FOR THE REQUESTED RESOURCE:"<>qty; cout<RMAX); } pgrp.insert(pgrp.begin(),pcb(i,qty)); } cout<<"PLEASE SELECT A ALOGRITHM:"<>choice; ff<&pgrp) { vector::iterator current; cout<<"NOW START RANDOM ALOGRITHM..."<
{ if(isFinished(pgrp)) { cout<<"SYSTEM RUNNING SUCCEED!!"<p_apply==0) readApply(current); if(current->p_apply>Rcs_left) { current->p_stat=TASK_WAITING; cout<p_pid<<" is waitting\n"; ff<p_pid<<" is waitting\n"; continue; } cout<<" "<p_apply<<" resource are accepted process"<p_pid<p_apply<<" resources are accepted process"<p_pid<p_apply; current->p_occupy+=current->p_apply; current->p_apply=0; if(current->p_occupyp_require) { pcb proc(* current); pgrp.erase(current); pgrp.insert(pgrp.end(),proc); continue; } cout<p_pid<<"\thas completed!!"<p_pid<<"has completed!"<p_occupy; current->p_occupy=0; current->p_stat=TASK_SUCCEED;
pgrp.erase(current); if(isFinished(pgrp)) { cout<<"SYSTEM RUNNING SUCCEED!!"<&pgrp) { vector::iterator current; int length; cout<<"NOW START BANKER ALOGRITHM"<p_apply==0) readApply(current); if(current->p_apply>Rcs_left) { current->p_stat=TASK_WAITING; cout<p_pid<<"is waitting!"<p_pid<<"is waitting!"<
pcb backup(* current); length=Rcs_left; current->p_occupy+=current->p_apply; length-=current->p_apply; if(current->p_require-current->p_occupy>length && !isSafeState(pgrp,length)) { current->p_occupy=backup.p_occupy; current->p_stat=TASK_WAITING; cout<p_pid<<"\tis waitting."<p_pid<<"\tis waitting."<p_apply; cout<p_pid<<"get"<p_apply<<"resource(s)!"<p_pid<<"get"<p_apply<<"resource(s)!"<p_apply=0; if(current->p_occupyp_require) { pcb proc=*current; pgrp.erase(current); pgrp.insert(pgrp.end(),proc); continue; } else if(current->p_occupy==current->p_require) { current->p_stat=TASK_SUCCEED; current->p_occupy=0; cout<p_pid<<"has finished!!!"<p_pid<<"has finished!!!"<p_require; pgrp.erase(current); wakeup(pgrp,Rcs_left); } if(isFinished(pgrp)) { cout<
vector::iterator getFirstRunningProcess(vector&pgrp) { vector::iterator p; for(p=pgrp.begin();p!=pgrp.end();p++) { if(p->p_stat==TASK_RUNNING) { return p; } } return NULL; } void readApply(vector::iterator proc) { cout<p_pid<<'\t'; ff<<"ENTER THE request FOR THE PROCESS\n"<p_pid<<" "; cin>>proc->p_apply; ff<p_apply<p_apply>proc->p_require-proc->p_occupy) { cout<p_pid<<'\t'; ff<p_pid<<" "; cin>>proc->p_apply; ff<p_apply<&pgrp) { vector::iterator p; for(p=pgrp.begin();p!=pgrp.end();p++) if(p->p_stat!=TASK_SUCCEED) return false; return true; } void wakeup(vector&pgrp,int available) { vector::iterator p; for(p=pgrp.begin();p!=pgrp.end();p++) if(p->p_stat==TASK_WAITING) {
分享到:
收藏