计算机操作系统报告.doc

上传人:w****2 文档编号:6529498 上传时间:2020-02-28 格式:DOC 页数:30 大小:682.50KB
返回 下载 相关 举报
计算机操作系统报告.doc_第1页
第1页 / 共30页
计算机操作系统报告.doc_第2页
第2页 / 共30页
计算机操作系统报告.doc_第3页
第3页 / 共30页
点击查看更多>>
资源描述
淮 阴 工 学 院计算机操作系统报告姓 名:学 号:班 级:学 院:计算机与软件工程学院专 业:计算机科学与技术指导教师: 2017年12月实验一:存储器的分配与回收算法实现一、实验内容1. 模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。2. 采用最先适应法、最佳适应法、最坏适应法分配主存空间。3. 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。4. 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。5. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。二、实验要求:1 详细描述实验设计思想、程序结构及各模块设计思路;2 详细描述程序所用数据结构及算法;3 明确给出测试用例和实验结果;4 为增加程序可读性,在程序中进行适当注释说明;5 认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;6 实验报告撰写要求结构清晰、描述准确逻辑性强;3、 实验过程1.设计思想:运用可变分区的存储管理算法设计主存分配和回收。一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。开始添加并创建循环链表确定内存块数选择分配算法最先适应法最坏适应法最佳适应法打印输出当前内存分配情况分配作业回收内存输入回收地址及大小输入作业大小分配作业输出已分配情况结束退出设计思路:利用链表对已有作业进行排序,并根据地址判断该作业状态。2.所用数据库结构:循环链表3.测试用例和结果:初始内存状况:(选择最坏适应法)*=开始地址= =大小= =结束地址= =状态=*80 60 140 0*30 40 70 0*0 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 2*4.注释已在代码中5.实验总结:存储器的分配与回收算法实现方法,采用最先适应法、最佳适应法、最坏适应法分配主存空间。当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。本次实验对于队列数据结构有些陌生,发现自己对课程的掌握不太牢固,课后应进行仔细的复习,加深印象。对某些算法的理解不太透彻,应该巩固完善。在网络和同学的帮助下最终得以解决。并使我更加深刻的了解了计算机操作系统中内存分配的执行过程,内存回收的执行过程的方式。对以后的学习和应用奠定了良好的基础。6.实验源代码:#include#include#include#include#include/链式结构typedef struct rt/起始地址int startaddress;/内存区大小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-next;q!=NULL;q=q-next)if(q-startaddressstartaddress)t=p-startaddress;p-startaddress=q-startaddress;q-startaddress=t;s=p-size;p-size=q-size;q-size=s;t=r;s=r-next;r=r-last;/改变指针操作,建立r和s之间的指针关系,“孤立”tr-next=s;if(s!=NULL) s-last=r;/释放tfree(t);/开始端重叠,或者开始端在当前结点的左边,结束端在当前结点的左右端之间else if(start=left&leftend&endright|startleft&leftend&endstartaddress=end;r-size-=(end-left);r-state=0;r-thread=0;/结束端重叠,或者结束端在当前结点的右边,开始端在当前结点的左右端之间else if(leftstart&startright&end=right|leftstart&startright)/内存被局部释放,进程遭破坏,标记状态为结束,进程号清零r-startaddress=left;r-size=(start-left);r-state=0;/开始和结束端都被包含,则结点被拆成了两个else if(startleft&endstartaddress=left;r-size=(start-left);r-state=0;r-thread=0;/新建一个结点w=(memory *)malloc(sizeof(memory);/后一部分为ww-state=1;w-startaddress=end;w-size=(right-end);w-state=0;w-thread=0;/将w加入以已配表if(r-next!=NULL) r-next-last=w;w-next=r-next;r-next=w;w-last=r;/在空闲区里寻找与需要释放的内存区域有公共区域的结点for(r=head-next;r!=NULL;r=r-next)/记录当前结点的左右端left=r-startaddress;right=r-startaddress+r-size;/s-e l-r 两段无重叠,在结点左边if(endstate=0;w-startaddress=start;w-size=size;/改变指针操作cout回收完内存后,已分配区状态如下 : n;if(which=1) sortn();/首次适应法if(which=2) sortn2();/最佳适应法if(which=3) sortn3();/最坏适应法printn();cout新一轮操作即将开始,请按任意键继续.;/下一组开始/5秒过后,重新发问else if(type=n) Sleep(5000);/停止else if(type=EOF)break;return 0;7.实验截图:分配块数为3,最坏适应法:分配完成:实验二 死锁一、实验题目设计一个n 个并发进程共享m 个系统资源的系统。进程可动态申请资源和释放资源,系统按各进程的申请动态的分配资源。要求采用银行家算法防止死锁。二、实验目的死锁会引起计算机工作僵死,造成整个系统瘫痪。因此,死锁现象是操作系统特别是大型系统中必须设法防止的。通过本次实验,使学生掌握死锁的概念和产生死锁的原因和必要条件, 预防和避免死锁的方法,死锁的检测与解除。通过本次实验,使学生加深了对死锁概念的理解和掌握,深刻领会银行家算法的实质及实现过程。三、设计思想1 程序流程图安全(safe)函数框图如下:2逻辑设计用结构体数组表示3 个进程,其中包括使用数组形式的线性表表示某个进程申请资源的列表(队列),以及进程需要的总资源数、进程当前已经运行到的位置等信息。模拟分配的程序部分,采用循环队列对各进程进行调度。3、物理设计全局变量的结构定义如下:bool avoid;struct info/进程信息long tot,n;/最大占用资源,申请次数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 个进程bool avoid;struct info/进程信息long tot4;/最大占用资源数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 require 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! Not safeProcess3 require 1 unit(s) resourse.Success! LeftResourse=2Process3 finish. LeftResourse=6Process1 require 3 unit(s) resourse.Denied! Not safeProcess2 require 3 unit(s) resourse.Success! LeftResourse=3Process1 require 3 unit(s) resourse.Denied! Not safeProcess2 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如果不避免死锁:Avoid deadlock?(Y/N)NPlease 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 require 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.Success! LeftResourse=0Process2 require 3 unit(s) resourse.Denied! No enough resourseProcess3 require 1 unit(s) resourse.Denied! No enough resourseProcess1 require 4 unit(s) resourse.Denied! No enough resourseAlready DeadlockFinish改进版本(可以使用3 种资源的程序)测试结果如下:五、实验总结银行家算法是一个经典的避免死锁的算法,它可以有效的避免资源分配时产生死锁。但死锁的避免时相当复杂的,而且浪费时间。每次分配时都要进行分配检查看是否会产生死锁,通过实验加深对银行家算法的了解和认识,同时对避免死锁的机制也有所了解。实验不仅锻炼了我动手能力,也巩固了我课堂所学的知识。只有在实验过程中我们才能深刻的认识到课本知识的重要性。实验采用银行家算法避免在资源分配时产生死锁现象。六、附录:源代码(带注释)#include #include #include #include /共有3 种资源,3 个进程bool avoid;struct info/进程信息long tot4;/最大占用资源数long p4;/已经占有的资源数pro5;long LeftRes4;/剩余资源数long qu4;void init()/函数功能:输入和初始化if (avoid)if (safe(x);elseprintf(申请被拒绝! 不符合安全规则。n);return ;elseprintf(申请成功!n);printf(n=n);for (i=1;i=3;i+)printf(n%s%ld%-15s,进程,i,(占用/最大);for (j=1;j=3;j+)if (i=x & !avoid)proi.pj+=qui;printf(%4ld/%3ld,proi.pj,proi.totj);printf(n=nn);void allot()/函数功能:模拟资源分配过程long i,j;printf(请输入申请资源的进程ID,以及申请的各种资源数量:n);scanf(%ld,&i);for (j=1;j=3;j+)scanf(%ld,&quj);require(i);int main()init();allot();return 0;实验三 主存空间的分配和回收一、实验目的熟悉主存的分配与回收。理解在不同的存储管理方式下,如何实现主存空间的分配与回收。掌握动态分区分配方式中的数据结构和分配算法及动态分区存储管理方式及其实现过程。二、实验内容和要求主存的分配和回收的实现是与主存储器的管理方式有关的。所谓分配,就是解决多道作业或多进程如何共享主存空间的问题。所谓回收,就是当作业运行完成时将作业或进程所占的主存空间归还给系统。可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。实验要求使用可变分区存储管理方式,分区分配中所用的数据结构采用空闲分区表和空闲分区链来进行,分区分配中所用的算法采用首次适应算法、循环首次适应算法、最佳适应算法三种算法来实现主存的分配与回收。同时,要求设计一个实用友好的用户界面,并显示分配与回收的过程。三、实验主要仪器设备和材料硬件环境:IBM-PC或兼容机软件环境:VC+ 6.0四、实验原理及设计方案1、循环首次适应算法在该算法中,把主存中所有空闲区按其物理地址递增的次序排列。在为作业分配存储空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直到找到第一个能满足要求的空闲区,从中划出与请求的大小相等的存储空间分配给作业,余下的空闲区仍留在空闲区表或链中。1、 实验步骤(1)初始化空闲分区;(2)反复对现有的空闲分区进行进程创建和撤消,即内存分配和回收;(3)退出。3、流程图输入要释放内存的基地址和大小五、结果过程及截图初始化主存大小后的状态按1后分配一块内存:按1后分配一块内存:按2释放内存:六、实验总结总之,编写主存空间的分配和回收的过程有(如解决实际问题)。从解决实际问题的角度,我们可以这样来看:首先要了解这个问题的基本要求,即输入、输出、完成从输入到输出的要求是什么;其次,从问题的要害入手,从前到后的解决问题的每个方面,即从输入开始入手,着重考虑如何从输入导出输出。在这个过程中,可确定所需的变量、数组、函数,然后确定处理的过程算法。可得出最后的结论,进而完成程序的编写。经过这次实验,我对主存空间的分配和回收有了深一步的了解,同时也初步了解了内存空间的工作原理。总的来说这个实验不是很难,还有这个实验很有趣。七、源代码#include #include #include#define getMEM()(MEM*)(malloc(sizeof(MEM)typedef struct Memory/可用分区链表节点int base;/基地址int size;/大小struct Memory *next;MEM;MEM *pm = getMEM();/可用分区的链表头MEM *temp;/int SIZE;/总的内存的大小,由用户输入int geti()/让用户只能输入正整数char ch;int i = 0;fflush(stdin);ch = getchar();while(ch = n)printf(tf输入不能为空.请重新输入n);fflush(stdin);ch = getchar();while(ch != n)if(ch 9 | ch base,p-size);p = p-next;puts(n*主存空间占用情况表:*n);puts(基地址tttt大小n);p = pm;int main()int size = 0,base = 0;int ch;init();print(pm);while(1)puts(分配空间请按1,释放空间请按2n);ch = getche();if( ch = 1)puts(n请输入需要分配的空间大小: );size =geti();if(base = allocMem(pm, size) = -1)puts(空闲内存分区大小不足n);elseprintf(n分配内存成功,此次分配的内存基地址为%dn,base);print(pm);else if(ch = 2)puts(n请输入要释放内存的基地址: );base = geti();puts(n请输入要释放内存的大小: );size = geti();if(release(pm, base, size)puts(n释放内存成功!n);print(pm);elseputs(非法操作,您所给的内存范围没有被分配出去:n);return 0;实验四 银行家算法一、目的通过银行家算法设计与实现,可以加深学生对死锁的理解,掌握死锁的预防、避免、检测和解除的基本原理,重点掌握死锁的避免方法银行家算法。使学生初步具有研究、设计、编制和调试操作系统模块的能力。二、要求1问题描述系统在进行资源分配的过程中,允许进程动态的申请资源,为了避免发生死锁,在分配资源前要进行安全性检查,若此次分配不会导致系统进入不安全状态,便将资源分配给进程,否则,进程等待。2基本要求1分析设计内容,给出解决方案(要说明设计实现的原理,采用的数据结构)。2画出程序的基本结构框图和流程图。3对程序的每一部分要有详细的设计分析说明。4源代码格式要规范。5设计合适的测试用例,对得到的运行结果要有分析。6设计中遇到的问题,设计的心得体会。7按期提交完整的程序代码、可执行程序和课程设计报告。三、设计题目描述 银行家算法是一种最有代表性的避免死锁的算法。要解释银行家算法,必须先解释操作系统安全状态和不安全状态。安全状态:如果存在一个由系统中所有进程构成的安全序列P1,Pn,则系统处于安全状态。安全状态一定是没有死锁发生。不安全状态:不存在一个安全序列。不安全状态不一定导致死锁。那么什么是安全序列呢?安全序列:一个进程序列P1,Pn是安全的,如果对于每一个进程Pi(1in),它以后尚需要的资源量不超过系统当前剩余资源量与所有进程Pj (j i )当前占有资源量之和。银行家算法:我们可以把操作系统看作是银行家,操作系统管理的资源相当于银行家管理的资金,进程向操作系统请求分配资源相当于用户向银行家贷款。操作系统按照银行家制定的规则为进程分配资源,当进程首次申请资源时,要测试该进程对资源的最大需求量,如果系统现存的资源可以满足它的最大需求量则按当前的申请量分配资源,否则就推迟分配。当进程在执行中继续申请资源时,先测试该进程已占用的资源数与本次申请的资源数之和是否超过了该进程对资源的最大需求量。若超过则拒绝分配资源,若没有超过则再测试系统现存的资源能否满足该进程尚需的最大资源量,若能满足则按当前的申请量分配资源,否则也要推迟分配。四、设计思想、环境1设计思想输入当前进程资源的使用情况以及整个系统的资源使用情况,并进行初始化安全性检查;如果是不安全状态,重新初始化系统;否则,从等待队列中提取一个等待进程,使用银行家算法进行检测,输出当前系统的状态和安全序列;如果是安全状态,系统继续从等待队列中提取等待进程进行检查;如果是不安全状态,进程回到等待队列,系统从等待队列中提取等待进程进行检查。系统中申请资源的进程全部进入等待队列等候处理。2环境说明工具:C语言。在WINDOWS环境下使用VC+6.0进行开发。五、源程序结构分析及代码实现1程序结构程序共有以下五个部分:(1) .初始化chushihua():用于程序开始进行初始化输入数据:进程数量、资源种类、各种资源可利用数量、各进程的各种资源已分配数量、各进程对各类资源最大需求数等。(2).当前安全性检查safe():用于判断当前状态安全性,根据不同地方的调用提示处理不同。(3).银行家算法bank():进行银行家算法模拟实现的模块,调用其他各个模块进行银行家算法模拟过程。(4).显示当前状态show():显示当前资源分配详细情况,包括:各种资源的总数量(all)、系统目前各种资源可用的数量、各进程已经得到的资源数量、各进程还需要的资源量。(5).主程序main()逐个调用初始化、显示状态、安全性检查、银行家算法函数,使程序有序的进行。2数据结构程序使用的全局变量:const int x=10,y=10; /定义常量int Availablex; /各种资源可利用的数量int Allocationyy; /各进程当前已分配的资源数量int Maxyy; /各进程对各类资源的最大需求数int Needyy; /还需求矩阵int Requestx; /申请各类资源的数量int Workx; /工作向量,表系统可提供给进程运行所需各类资源数量int Finishy; /表系统是否有足够的资源分配给进程,0为否,1为是int py; /存储安全序列int i,j; /全局变量,主要用于循环语句中int n,m; /n为进程的数量,m为资源种类数int l=0,counter=0;3函数声明void chushihua(); /系统初始化函数void safe(); /安全性算法函数void bank(); /银行家算法函数void show (); /输出当前资源分配情况5. 操作系统银行家算法流程图:初始化函数chushihua()开始AVAILABLEi-=REQUESTi;ALLOCATIONi+=REQUESTi;NEEDi-=REQUESTi; 输入进程的数量 输入资源种类数输入个资源当前可用资源数输入各进程当前已分配的资源数输入各进程对各类资源的最大需求输出提示:输入有误,请重新输入初始化函数chushihua()结束,银行家函数Bank()提出请求REQUESTiError;REQUESTi=NEEDiREQUESTi=AVAILABLEiError;Safe();输出提示:你的请求被拒!AVAILABLEi-=REQUESTi;ALLOCATIONi-=REQUESTi;NEEDi+=REQUESTi;输出提示:同意分配请求是否进行再次分配退出程序,银行家算法Bank()结束;安全性算法Safe()开始Work=AVAILABLE;FINISH=false;NEEDi=Work&FINISHi=false;Work+=ALLOCATIONi;FINISHi=ture;所有进程的FINISH=ture;输出提示:系统是不安全的安全,输出安全序列Return ture;安全算法safe()结束2. 源程序代码:#include #include #include #include /定义全局变量const int x=10,y=10; /常量,便于修改int Availablex; /各资源可利用的数量int Allocationyy; /各进程当前已分配的资源数量int Maxyy; /各进程对各类资源的最大需求数int Needyy; /尚需多少资源int Requestx; /申请多少资源int Workx; /工作向量,表示系统可提供给进程继续运行所需的各类资源数量 l=0; coutn试分配后,状态不安全,所以不予分配!恢复原状态endl; /恢复数据 for (j=0; jm; j+) else l=0; if(l!=1) /进程可以执行,则释放该进程的所有资源 for (j=0;jm;j+) Availablej=Availablej+Allocationkj; Allocationkj=0; cout该进程已得到所有需求资源,执行后将释放其所有拥有资源!endl; l=0; /归零 coutn安全的状态!endl; cout安全序列为: ; coutendl进程(p0); /输出安全序列,考虑显示格式,先输出第一个 Finish0=0; for (i=1; in; i+) cout进程(pi); Finishi=0; /所有进程置为未分配状态 coutendlendl; show(); /显示当前状态ppp: /申请大于可利用量, 应该阻塞等待,结束本次资源申请,GOTO 语句跳转至此 coutendl是否继续申请资源(y/n) ?; char* b=new char; /输入y/n,判断是否继续申请 b; coutendl; cout-endlendl; coutendl; int i; /局部变量 l=0; coutendln当前的状态是安全的!安全序列为:endl; cout进程(p0); /输出安全序列 for (i=1; in; i+) cout进程(pi); for (i=0; in; i+) Finishi=0; /所有进程置为未分配状态 coutendl; bank(); /调用银行家算法函数 couttt 演示计算完毕endl; return 0;运行结果:1.初始化结果六、课程设计的总结 这次实验,我通过操作系统的银行家算法的学习,编写出了本次实验的代码。从开始程序用到的数据结构的设置到函数的架构都是经过无数次的尝试与改正才得到最终的效果。实验过程中遇到很多细节性的小问题,正是因为这些问题的出现与解决的过程是我感觉收获颇多。这次实验是我真正的将一个算法,或者说是一种思想,通过编码的方式得到体现,是一种理论到实践的转变。自己的动手能力,分析与解决问题的能力得到了很大的提升。 实验五:主存储器空间的分配与回收实验一、实验内容主存储器空间的分配和回收。二、实验目的一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现与主存储器的管理方式有关的,通过本实验帮助学生理解在可变分区管理方式下应怎样实现主存空间的分配和回收。三、实验原理模拟在可变分区管理方式下采用最先适应算法实现主存分配和回收。(1)可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如:05k10k14k26k32k512k操作系统作业1作业3空闲区作业2空闲区为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:起 址长 度状 态第一栏14 K12 K未 分 配第二栏32 K96 K未 分 配MMMM其中,起址指出一个空闲区的主存起始地址。 长度指出从起始地址开始的一个连续空闲的长度。 状态有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区。 (2) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。(3) 采用最先适应算法(顺序分配算法)分配主存空间。按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。(4) 当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。(5) 请按最先适应算法设计主存分配和回收的程序。假设初始时主存中没有作业,现按下面序列进行内存的申请与释放:作业1申请300K,作业2申请100K,作业1释放300K,作业3申请150K,作业4申请30K, 作业5申请40K, 作业6申请60K, 作业4释放30K。 四、算法流程图五、源程序及注释#include #include#define COUNT 512typedef struct NODEchar name;/名称float start;/起始位置float end;/大小int flag;/是否分配的标志NODE;NODE OSCOUNT;/数组int count;/被分成的块数统计int applyfree;float numb;char c;/先对数组进行初始化,使没有分配的名称为 Pvoid init()count=1;OS0.name =P;OS0.start =0;OS0.end =COUNT;OS0.flag =1;/对数组的插入操作void insert(int m,float st,float en)int i;count+;for(i=count;im+1;i-)OSi=OSi-1;OSm.start =st;OSm.end =en;/移动操作,即对数组的删除操作void move(int m)int i;void main()init();show();while(1)putin();apply();show();六、打印的程序运行时初值和运行结果1、开始有512K的空间,未分配。用名称P来表示。进程A申请200K的空间,(申请用1表示,释放用0表示),其结果显示如下。2、进程B申请150K的空间,3进程A释放200K的空间,4、进程C申请100K的空间,进程D申请50K的空间5、进程E申请30K的空间,进程F申请70K的空间6.分配失败七、实验小结这次的实验相对来说较难,之前对内存那块知识也不是很清楚,但通过实验,也参考了很多资料解释,但是还是对内存分配与回收有了更深入更清楚的了解,以后的程序编写不论是实验还是项目开发,无论大小,都应该把程序的整体框架构建好,提高重用性,再进行一步步实现。对主存储器的分配与回收有了进一步的了解,通过动手实现其主存储器的分配与回收,更加深刻的理解了主存储器的分配与回收的特点。同时,在实验过程中,回顾书本上的理论知识,巩固了我的知识。本实验用到的一些数据结构有: typedef struct NODE char name;/名称 float start;/起始位置 float end;/大小 int flag;/是否分配的标志 NODE; NODE OSCOUNT;/数组 在清楚主存储器分配和回收的情况下,做些实验还是比较简单的。关键是注意当找到一个大的块时,如何将这个大块分成两小块,一块用于分配,另一块依旧是未分配。在主存储器空间的分配和回收应该注意其中的分配的时候的错误控制和回收时候的错误控制,此外,还应该针对作业分配失败的异常作出相应的处理代码。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 管理文书 > 工作总结


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!