1、*mutex+;if(*mutex =0) /唤醒等待中的进程程序实现 /生产者程序 void producer() P(& empty);/若此时存储区空,则可以生产,否则程序挂起等待 /生产一个产品操作 printf(“生产一个产品”);显示目前产品的个数;V(&full);/通知消费者进程,可以取产品 /消费者程序 void consumer() /若此时存储区不空,则可以取产品,否则消费者程序挂起等待 /取走一个产品操作 printf(“消费一个产品”);显示目前剩余产品的个数;/通知生产者进程可以生产 /主函数 void main() /分别调用生产者,消费者程序,顺序不限,因为已经
2、完成信号量的同步,若发生同步问题就会等待 producer();consumer(); 实验三 死锁的检测和解除(2学时)掌握死锁的概念,深入理解死锁的避免算法。(1) 编程实现银行家算法(2) 编程实现安全性算法能够根据给定的资源分配情况,及某进程提出的资源请求,通过算法得出是否能进行分配。如能分配,需得出相应的安全序列。(1) 安全性算法函数: 根据安全性算法进行计算。 如果处于安全状态,需在屏幕上打印输出如下内容: 时刻系统处于安全状态,安全序列为 . . 。否则,输出:时刻系统处于不安全状态。 返回主函数。(2) 银行家算法函数: 根据银行家算法进行计算。在计算过程中,需要调用安全性算
3、法函数。 如果可以分配,需在屏幕上打印输出如下内容: 可以满足进程的资源分配请求Requesti= . . 。 分配后的资源分配表为: . . .不能满足进程的资源请求Requesti= . . 。(3) 主函数:假定已知T0时刻的资源分配情况,即已知可利用资源向量Available分配矩阵Allocation、最大需求矩阵Max,判断目前是否处于安全状态。如果处于安全状态,某进程进行资源申请,用银行家算法检测能否分配;否则,提示目前系统处于不安全状态,不能再进行资源申请。 进行变量定义,包括: 二维数组:Allocation、Max、Need。 一维数组:Available、Work、Fin
4、ish、Requesti。 其余变量定义根据需要指定。 Allocation、Max、Available的值可以从键盘输入,也可在定义时直接给定。Need值需要通过计算获得。Requesti的值需要从键盘接收。 进行T0时刻安全性检测,调用安全性算法函数。 如果需要进行资源申请,循环调用进行银行家算法函数,直至用户要求结束或不能满足进程的资源请求为止。实验四 页面置换算法的实现(2学时)熟练掌握有关的存储管理算法,巩固有关存储器管理的教学内容。(1)编程实现最优置换算法(OPT)算法(2)编程实现先进先出(FIFO)算法(3)编程实现最近最久未使用(LRU)算法或简单CLOCK置换算法任选以上
5、两种算法进行实现。能够根据给定的引用串及物理块数,在屏幕上输出该算法对应的置换图,及其缺页次数和缺页率。参考实验步骤如下: 现定义数据结构和全局变量。#includeconio.h#define M 4 #define N 17 #define Myprintf printf(|-+-+-+-+-+-+-+-+-|n) /*表格控制*/ typedef struct page int num; /*记录页面号*/ int time; /*记录调入内存时间*/ Page; /* 页面逻辑结构,结构为方便算法实现设计*/ Page bM; /*内存单元数*/ int cMN; /*暂保存内存当前的
6、状态:缓冲区*/ int queue100; /*记录调入队列*/ int K; /*调入队列计数变量*/ 初始化内存单元、缓冲区void Init(Page *b,int cMN) int i,j; for(i=0;iN;i+) bi.num=-1; bi.time=N-i-1; M; for(j=0;jmax) max=bi.time; tag=i; return tag; 判断页面是否已在内存中int Equation(int fold,Page *b) if (fold= =bi.num) return i; return -1; LRU算法void Lru(int fold,Page
7、 *b) int val; val=Equation(fold,b); if (val bval.time=0; for(i=0; if (i!=val) bi.time+; else queue+K=fold; /*记录调入页面*/ val=GetMax(b); bval.num=fold; bval.time=0; FIFO与OPT的算法描述省略。 主程序 int aN=1,0,1,0,2,4,1,0,0,8,7,5,4,3,2,3,4; int i,j; start: K=-1; Init(b, c); Lru(ai,b); c0i=ai; /*记录当前的内存单元中的页面*/ cji=b
8、j.num; /*结果输出*/ printf(内存状态为:n); Myprintf; for(j=0; printf(|%2d ,aj);|n for(j=0; if(cij=-1) printf(|%2c ,32); else printf(,cij);n调入队列为:K+1;%3d,queuei);n缺页次数为:%6dn缺页率:%16.6f,K+1,(float)(K+1)/N);nAre you continuing!ty? if(getche()=y) goto start;5、说明:该代码仅供参考,照抄者实验成绩全部记为0分。认真完成实验, 并按照要求认真填写实验报告实验五 动态分区分
9、配方式的模拟(2学时)了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区分配管理方式及其实现过程的理解。2、实验任务及要求:(1)用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲分区链(表)来管理:在进行内存分配时,系统优先使用空闲区低端的空间。(2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列: 作业1申请130KB; 作业2申请60KB; 作业3申请100KB; 作业2释放60KB; 作业4申请200KB; 作业3释放100KB; 作业1释放130KB; 作业5申请140KB;
10、 作业6申请60KB; 作业7申请50KB; 作业6释放60KB;请分别采用首次适应算法和最佳适应算法进行内存块的分配和回收, 要求每次分配和回后显示出空闲内存分区链的情况(共有多个空闲分区,每个空闲分区的大小分别为多大)。/* 动态分区分配方式的模拟 *iostream.hstdlib.h#define Free 0 /空闲状态#define Busy 1 /已用状态#define OK 1 /完成#define ERROR 0 /出错#define MAX_length 640 /最大内存空间为640KBtypedef int Status;typedef struct freearea/
11、定义一个空闲区说明表结构 int ID; /分区号 long size; /分区大小 long address; /分区地址 int state; /状态ElemType;/- 线性表的双向链表存储结构 -typedef struct DuLNode /double linked list ElemType data; struct DuLNode *prior; /前趋指针 struct DuLNode *next; /后继指针DuLNode,*DuLinkList;DuLinkList block_first; /头结点DuLinkList block_last; /尾结点Status a
12、lloc(int);/内存分配Status free(int); /内存回收Status First_fit(int,int);/首次适应算法Status Best_fit(int,int); /最佳适应算法void show();/查看分配Status Initblock();/开创空间表Status Initblock()/开创带头结点的内存空间链表 block_first=(DuLinkList)malloc(sizeof(DuLNode); block_last=(DuLinkList)malloc(sizeof(DuLNode); block_first-prior=NULL;nex
13、t=block_last; block_last-prior=block_first;next=NULL;data.address=0;data.size=MAX_length;data.ID=0;data.state=Free; return OK;/- 分 配 主 存 -Status alloc(int ch) int ID,request; coutID;请输入需要分配的主存大小(单位:KB):request; if(request0 |request=0) cout分配大小不合适,请重试!endl; return ERROR; if(ch=2) /选择最佳适应算法 if(Best_fi
14、t(ID,request)=OK) cout分配成功! else cout内存不足,分配失败! return OK; else /默认首次适应算法 if(First_fit(ID,request)=OK) coutdata.ID=ID;data.size=request;data.state=Busy; DuLNode *p=block_first-next; while(p) if(p-data.state=Free & p-data.size=request) /有大小恰好合适的空闲块 p- return OK; break; data.sizerequest) /有空闲块能满足需求且有剩
15、余 temp-prior=p-prior;next=p;data.address=p-data.address;prior-next=temp;prior=temp;data.address=temp-data.address+temp-data.size;data.size-=request; p=p- return ERROR;/- 最佳适应算法 -Status Best_fit(int ID,int request) /传入作业名及申请量/- 主 存 回 收 -Status free(int ID) DuLNode *p=block_first; if(p-data.ID=ID) dat
16、a.ID=Free; if(p-data.state=Free)/与前面的空闲块相连 p-data.size+=p- p-next=p-next- data.state=Free)/与后面的空闲块相连 prior=p; break;/- 显示主存分配情况 -void show() cout+n+ 主 存 分 配 情 况 +n cout分 区 号:data.ID=Free) coutdata.ID起始地址:data.address分区大小:data.size KB状 态:data.state=Free) coutchoice; if(choice=1) alloc(ch); / 分配内存 else if(choice=2) / 内存回收 int ID; cout free(ID); else if(choice=3) show();/显示主存 else if(choice=0) break; /退出 else /输入操作有误 cout输入有误,请重试! continue;4、说明:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1