1、循环链表3.测试用例和结果:初始内存状况:(选择最坏适应法)*=开始地址= =大小= =结束地址= =状态=80 60 140 030 40 70 00 20 20 0第一次分配32,第二次分配14,第三次分配23最终结果:空闲内存如下 :* 44 26 70 0 0 20 20 0 135 5 140 0已分配区如下 :* 开始地址 大小 结束地址 状态 进程号 80 32 112 1 1 112 23 135 1 1 30 14 44 1 24.注释已在代码中5.实验总结:存储器的分配与回收算法实现方法,采用最先适应法、最佳适应法、最坏适应法分配主存空间。当一个新作业要求装入主存时,必须查
2、空闲区表,从中找出一个足够大的空闲区。当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。本次实验对于队列数据结构有些陌生,发现自己对课程的掌握不太牢固,课后应进行仔细的复习,加深印象。对某些算法的理解不太透彻,应该巩固完善。在网络和同学的帮助下最终得以解决。并使我更加深刻的了解了计算机操作系统中内存分配的执行过程,内存回收的执行过程的方式。对以后的学习和应用奠定了良好的基础。6.实验源代码:#includestdlib.hstring.hiostream.hwindows.h/链式结构typedef struct rt /起始地址 int start
3、address; /内存区大小 int size; /内存区状态 int state; struct rt *next; struct rt *last; /已分配区的进程号 int thread;memory;/空闲区链表memory *head=NULL;/已分配区链表memory *top=NULL;/全局进程号int threadnum;/按首地址排序void sort() /循环指针变量 memory *p,*q; int r; int t; /交换记录变量 int s; p=head; /冒泡排序 for(p=p-next;p!=NULL;p=p-next) for(q=p-q!q
4、=q- if(q-startaddressstartaddress) t=p-startaddress;startaddress=q-q-startaddress=t; s=p-size;size=q-size=s; t=r;s=r-r=r-last; /改变指针操作,建立r和s之间的指针关系,“孤立”t r-next=s;if(s!=NULL) s-last=r; /释放t free(t); /开始端重叠,或者开始端在当前结点的左边,结束端在当前结点的左右端之间 else if(start=left&leftend&endright|startsize-=(end-left);state=0
5、;thread=0; /结束端重叠,或者结束端在当前结点的右边,开始端在当前结点的左右端之间 else if(leftstart&startright&end=right|leftstartaddress=left;size=(start-left); /开始和结束端都被包含,则结点被拆成了两个 else if(start /内存被局部释放,进程遭破坏,标记状态为结束,进程号清零,前一部分为r /新建一个结点 w=(memory *)malloc(sizeof(memory); /后一部分为w w-state=1;w-size=(right-end); /将w加入以已配表 if(r-next!
6、=NULL) r-next-last=w;next=r-next=w; /在空闲区里寻找与需要释放的内存区域有公共区域的结点 for(r=head-r! /记录当前结点的左右端 left=r-right=r-startaddress+r- /s-e l-r 两段无重叠,在结点左边 if(endleft) /增加一个空闲区的结点 /结点状态为结束,起始地址为start,大小为sizestartaddress=start;size=size; /改变指针操作 cout回收完内存后,已分配区状态如下 : n; if(which=1) sortn();/首次适应法 if(which=2) sortn2
7、();/最佳适应法 if(which=3) sortn3();/最坏适应法 printn(); cout新一轮操作即将开始,请按任意键继续. /下一组开始 /5秒过后,重新发问 else if(type=n) Sleep(5000); /停止 else if(type=EOF) break; return 0;7.实验截图:分配块数为3,最坏适应法:分配完成:实验二 死锁一、实验题目设计一个n 个并发进程共享m 个系统资源的系统。进程可动态申请资源和释放资源,系统按各进程的申请动态的分配资源。要求采用银行家算法防止死锁。二、实验目的死锁会引起计算机工作僵死,造成整个系统瘫痪。因此,死锁现象是操
8、作系统特别是大型系统中必须设法防止的。通过本次实验,使学生掌握死锁的概念和产生死锁的原因和必要条件, 预防和避免死锁的方法,死锁的检测与解除。通过本次实验,使学生加深了对死锁概念的理解和掌握,深刻领会银行家算法的实质及实现过程。三、设计思想1程序流程图安全(safe)函数框图如下:2逻辑设计用结构体数组表示3 个进程,其中包括使用数组形式的线性表表示某个进程申请资源的列表(队列),以及进程需要的总资源数、进程当前已经运行到的位置等信息。模拟分配的程序部分,采用循环队列对各进程进行调度。3、物理设计全局变量的结构定义如下:bool avoid;struct info/进程信息long tot,n
9、;/最大占用资源,申请次数long list16;/申请资源列表long pre16;/已占用资源数long p;/已分配状况的指针pro4;long LeftRes;程序的结构定义如下:int main()/主函数init();allot();void init()/函数功能:输入和初始化void allot()/函数功能:模拟资源分配过程allot()使用以下函数模拟分配过程:bool require(long x)/函数功能:尝试分配资源给进程xbool safe(long x)/函数功能:检查分配是否安全可以处理3 种资源的程序全局变量结构如下:/共有3 种资源,3 个进程long t
10、ot4;/最大占用资源数long p4;/已经占有的资源数pro5;long LeftRes4;/剩余资源数long qu4;四、测试结果对于一组会导致死锁的数据,分别选择采用和不采用避免算法,结果如下:Avoid deadlock?(Y/N)YPlease input the resourse-require lists of these 3 processes, one lists in a line:2 3 42 3 33 1=Process1 : 2 3 4 (Sum=9)Process2 : 2 3 3 (Sum=8)Process3 : 3 1 (Sum=4)Process1 re
11、quire 2 unit(s) resourse.Success! LeftResourse=8Process2 require 2 unit(s) resourse.Success! LeftResourse=6Process3 require 3 unit(s) resourse.Success! LeftResourse=3Process1 require 3 unit(s) resourse.Denied! Not safeProcess2 require 3 unit(s) resourse.Denied!Process3 require 1 unit(s) resourse.Suc
12、cess! LeftResourse=2Process3 finish. LeftResourse=6Process2 require 3 unit(s) resourse.Success! LeftResourse=0Process2 finish. LeftResourse=8Process1 require 3 unit(s) resourse.Success! LeftResourse=5Process1 require 4 unit(s) resourse.Success! LeftResourse=1Process1 finish. LeftResourse=10Finish如果不
13、避免死锁:(Y/N)NPlease input the resourse-require lists of these 3 processes, one lists in a line: No enough resourseProcess3 require 1 unit(s) resourse.Denied!Process1 require 4 unit(s) resourse.Denied!Already Deadlock改进版本(可以使用3 种资源的程序)测试结果如下:五、实验总结银行家算法是一个经典的避免死锁的算法,它可以有效的避免资源分配时产生死锁。但死锁的避免时相当复杂的,而且浪费时
14、间。每次分配时都要进行分配检查看是否会产生死锁,通过实验加深对银行家算法的了解和认识,同时对避免死锁的机制也有所了解。实验不仅锻炼了我动手能力,也巩固了我课堂所学的知识。只有在实验过程中我们才能深刻的认识到课本知识的重要性。实验采用银行家算法避免在资源分配时产生死锁现象。六、附录:源代码(带注释)#include cstringcstdlibctimeif (avoid)if (safe(x)elseprintf(申请被拒绝! 不符合安全规则。n);return ;申请成功!n=nfor (i=1;i=3;i+)n%s%ld%-15s,进程,i,(占用/最大)for (j=1;jj+)if (
15、i=x & !avoid)proi.pj+=qui;%4ld/%3ld,proi.pj,proi.totj);=nnlong i,j;请输入申请资源的进程ID,以及申请的各种资源数量:scanf(%ld,&i);quj);require(i);int main()return 0;实验三 主存空间的分配和回收一、实验目的熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。二、实验内容和要求主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配,就是解决多道作业或多进程如何共享主存空间
16、的问题。所谓回收,就是当作业运行完成时将作业或进程所占的主存空间归还给系统。可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法、循环首次适应算法、最佳适应算法三种算法来实现主存的分配与回收
17、。同时,要求设计一个实用友好的用户界面,并显示分配与回收的过程。三、实验主要仪器设备和材料硬件环境:IBM-PC或兼容机软件环境:VC+ 6.0四、实验原理及设计方案1、循环首次适应算法在该算法中,把主存中所有空闲区按其物理地址递增的次序排列。在为作业分配存储空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能满足要求的空闲区,从中划出与请求的大小相等的存储空间分配给作业,余下的空闲区仍留在空闲区表或链中。1、实验步骤(1)初始化空闲分区;(2)反复对现有的空闲分区进行进程创建和撤消,即内存分配和回收;(3)退出。3、流程图五、结果过程及截图初始化主存大小后的状态按1后分配一块内存:按2释放内存:六、实验总结总之,编写主存空间的分配和回收的过程有(如解决实际问题)。从解决实际问题的角度,我们可以这样来看:首先要了解这个问题的基本要求,即输入、输出、完成从输入到输出的要求是什么;其次,从问题的要害入手,从前到后的解决问题的每个方面,即从输入开始入手,着重考虑如何从输入导出输出。在这个过程中,可确定所需的变量、
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1