计算机操作系统4.doc_第1页
计算机操作系统4.doc_第2页
计算机操作系统4.doc_第3页
计算机操作系统4.doc_第4页
计算机操作系统4.doc_第5页
免费预览已结束,剩余3页可下载查看

下载本文档

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

文档简介

计算机操作系统实验报告 姓名: 班别:学号:一,实验题目: 模拟实现资源分配。二,实验目的:多个进程动态地共享系统的资源可能会产生死锁现象。死锁的产生,必须同时满足四个条件,第一个是互斥条件,即一个资源每次只能由一个进程占用;第二个为等待条件,即一个进程请求资源不能满足时,它必须等待,但它仍继续保持已得到的所有其它资源;第三个是非出让条件,任何一个进程不能抢占另一个进程已经获得且未释放的资源;第四个为循环等待条件,系统中存在若干个循环等待的进程,即其中每一个进程分别等待它前一个进程所持有的资源。防止死锁的机构只须确保上述四个条件之一不出现,则系统就不会发生死锁。在实验中假定系统中任一资源在每一时刻只能则由一个进程使用,任何进程不能抢占它进程正在使用的资源,当进程得不到资源时必须等待。因此只要资源分配策略能保证进程不出现循环等待,则系统就不会发生死锁。本实验要求学生编写和调试一个系统动态分配资源的简单模拟程序,观察死锁产生的条件,并采用适当的算法,有效地防止和避免死锁的发生。三,实验内容:用按序分配策略实现资源分配。要求:(1) 设计一个3个进程共享10个资源的系统,进程可动态地申请资源和释放资源,系统按各进程的申请动态地分配资源。(2) 设计用按序分配算法实现资源分配的资源分配程序,应具有显示或打印各进程依次要求申请的资源号以及依次分配资源地情况。(3) 确定两组各进程依次要求申请的资源号,要求其中的一组中各进程按序地申请资源,另一组中各进程申请资源不受序号限制,分别运行上述设计的资源分配程序,观察运行结果。提示:(1) 防止进程发生循环等待的另一种资源分配策略是按序分配算法,其基本思想如下:把系统中所有的资源排一个顺序,例如系统共有m个资源,用ri表示第i个资源,那么这m个资源是: r1, r2, r3 , rm规定任何进程不得在占用资源ri(1im)后再申请rj(jim),或者说,如果里程需要资源rj,那么它必须在申请ri之前申请(ji)。可以证明,按这种策略分配资源时破坏了循环等待条件,故能防止发生死锁(证明略)。(2) 把各进程申请资源的情况记录在进程控制块PCB中,现假定进程控制块PCB的格式如下:进 程 号状 态当前等待资源号上次申请资源号其中“状态”可以为就绪态、等待态和完成态。当进程处于等待态时,表示系统不能满足该进程的当前资源申请,此时,PCB中的“当前等待资源号”反映了该进程等待的资源。当系统为进程分配了一个资源后,则把分配的资源号填入“上次申请资源号”一栏中。(3) 假定系统中拥有的资源数m=10,而系统中申请资源的进程数N=3。按序分配算法程序流程见图13-4。四,实验步聚:(1) 明确设计思路。(2) 编写程序。(3) 输入数据,程序显示结果。五,实验结果:六,实验总结:本次实验我通过设计模拟资源的分配,知道了资源分配中可能会造成死锁的可能和条件。并且根据申请资源号从小到大的方法来避免死锁的发生,加深了对进程资源分配的理解。七,附录#include #include #include #define PCBSIZE 3#define RESOURCESIZE 10#define UNOCCUPIED 0#define OCCUPIED 1typedef struct PCB char name5; char status;/状态 int *resource;/需要的资源序号 int occupy;/占用数量 int sum;/所需资源总数PCB;typedef struct int status;Resource;PCB *InitPCB ()/初始化PCB PCB *p = (PCB *) malloc (PCBSIZE * sizeof (PCB); int i, j; for (i = 0; i PCBSIZE; i+) strcpy (, pcb); itoa (i + 1, &3, 10); /初始化申请的资源 printf (%s:n需要申请的资源数目:, ); scanf (%d, &pi.sum); pi.resource = (int *) malloc (pi.sum * sizeof (int); printf (输入资源的编号:); for (j = 0; j pi.sum; j+) scanf (%d, &pi.resourcej); /初始化占用的资源 pi.occupy = 0; /初始化状态 pi.status = R; return p;Resource *InitResource ()/初始化资源 Resource *r = (Resource *) malloc (RESOURCESIZE * sizeof (Resource); for (int i = 0; i RESOURCESIZE; i+) ri.status = UNOCCUPIED; return r;void PrintPCB(PCB p)/打印PCB printf(%stt, ); if(p.occupy!=0) for (int i = 0; i p.occupy; i+) printf(%d , p.resourcei); if (p.occupy 4) printf (t); printf(t); if(p.occupy != p.sum) for (int i = p.occupy; i p.sum; i+) printf (%d , p.resourcei); if (p.sum - p.occupy 4) printf (t); printf(t%cn, p.status);void Allocation (PCB *p, Resource *r)/分配资源 int finish = 0;/完成状态进程的数量 int wait = 0;/等待状态进程的数量 int number; while (finish != PCBSIZE & wait != PCBSIZE) for (int i = 0; i PCBSIZE; i+) if (pi.status = R)/pcb处于就绪状态 wait = 0; number = pi.resourcepi.occupy; /若所需进程被占用 if (rnumber.status = OCCUPIED) pi.status = W; PrintPCB(pi); else /占用资源 rnumber.status = OCCUPIED; pi.occupy+; /所需资源全部占用 if (pi.occupy = pi.sum) pi.status = E; for (int j = 0; j pi.occupy; j+) rpi.resourcej.status = UNOCCUPIED; finish+; if (finish = PCBSIZE) PrintPCB(pi); break; PrintPCB(pi); else if (pi.status = W)/pcb处于等待状态 if (rpi.resourcepi.occupy.status = UNOCCUPIED)/若申请的资源已被释放,则占用该资源 pi.status = R; i-; else wait+; if (wait = PCBSIZE) break; if (finish = PCBSIZE) printf (succeedn); else printf (fail:deadlockn);int main () /打印资源信息 printf ( %d个资源依次编号为 :, RESOURCESIZE); for (int i = 0; i RESOURCESIZE; i+) printf(%d , i); printf(nn); PCB *p = InitPCB (); Resource *r = InitResource (); /打印PCB信息 printf (n信息:n名称tt需要的资源n); for (i = 0; i PCB

温馨提示

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

评论

0/150

提交评论