可变分区分配与回收——采用最坏算法操作系统课程设计.doc
在可变分区管理方式下采用最先适应算法实现主存储器的分配和回收。
..实验三、四存储管理一、实验目的帮助学生理解在不同的存储管理方式下应如何实现主存空间的分配和回收。
理解好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能够合理地分配和使用这些存储空间。
二、实验环境1、Java环境三、实验时数:4学时四、实验容与步骤1.在可变分区管理方式下采用最先适应算法实现主存储器的分配和回收。
2.在可变分区管理方式下采用最正确适应算法实现主存储器的分配和回收。
3.在可变分区管理方式下采用最坏适应算法实现主存储器的分配和回收。
要求:1。
分配时输入作业号以及申请量。
2.回收时输入作业号。
3.每次分配或回收之后按如下格式按照起始地址从小到大输出存分配情况。
五、实验报告实验题目。
1.在可变分区管理方式下采用最先适应算法实现主存储器的分配和回收。
1、2、程序中使用的数据构造及符合说明。
用Node 类模拟表示存的当前状态。
通过Node数组来开辟一组存,然后用Link类来进展存的连接3、程序流程图。
// Node.javaclass Node{//用Node来模拟存的当前状态int start;int size;boolean state;int jobNo;public Node(){}public Node(int start,int size,boolean state,int jobNo){this.start = start;this.size = size;this.state = state;this.jobNo = jobNo;}public void print(){//打印Node类if (this!=null){System.out.println("起始位置"+this.start+"大小"+this.size+"状态"+this.state+"工作号"+this.jobNo);}}};//Link.javaclass Link{ //用Link类来模拟连接各个存,并添加作业public void addJob(int size,int jobNo,Node a[]){for(int i=0;i<a.length;i++){if(a[i]!=null){ //当前存有容时if(size<a[i].size&&a[i].state==false){ //判断是否符合条件a[i].size=a[i].size-size; //当前存分配大小给作业if(a[i+1]==null){ //当下一块存还没有使用时a[i+1]=new Node(size+a[i].start,size,true,jobNo);//使用该存}else{ //当下一块存已被使用,那么继续寻找一块还没被使用的存for(int j=i+1;j<a.length-1;j++){if(a[j]==null){a[j]=new Node(size+a[j-1].start,size,true,jobNo);break; //当找到未被使用的存及填入容后跳出循环}}}}a[i].print();//打印输出当前Link中各个存块的使用情况}}}public void delete(Node a[],int jobNo){//删除某一个进程,当该进程被删除后,进程所在存的状态变为falsefor(int i=0;i<a.length;i++){if(a[i]!=null){if(a[i].jobNo==jobNo){//a[i].size=0;a[i].state=false;a[i].jobNo=0;}if(a[i]!=null){a[i].print();}}}}public void back(Node a[]){ //进展状态为false的存的回收删除存状态为false 的存节点。
计算机操作系统内存管理系统可变分区存储管理方式的内存分配回收
课程设计2 可变分区存储管理方式的内存分配回收一、课程设计目的深入了解采用可变分区存储管理方式的内存分配回收的实现。
二、预备知识存储管理中可变分区的管理方式。
三、小组成员四、课程设计内容编写程序完成可变分区存储管理方式的内存分配回收。
具体包括:确定内存空间分配表;采用最优适应算法完成内存空间的分配和回收;编写主函数对所做工作进行测试。
五、设计思路:整体思路:可变分区管理方式将内存除操作系统占用区域外的空间看做一个大的空闲区。
当作业要求装入内存时,根据作业需要内存空间的大小查询内存中的各个空闲区,当从内存空间中找到一个大于或等于该作业大小的内存空闲区时,选择其中一个空闲区,按作业需求量划出一个分区装人该作业,作业执行完后,其所占的内存分区被收回,成为一个空闲区。
如果该空闲区的相邻分区也是空闲区,则需要将相邻空闲区合并成一个空闲区。
设计所才用的算法:采用最优适应算法,每次为作业分配内存时,总是把既能满足要求、又是最小的空闲分区分配给作业。
但最优适应算法容易出现找到的一个分区可能只比作业所需求的长度略大一点的情行,这时,空闲区分割后剩下的空闲区就很小以致很难再使用,降低了内存的使用率。
为解决此问题,设定一个限值minsize,如果空闲区的大小减去作业需求长度得到的值小于等于minsize,不再将空闲区分成己分分区和空闲区两部分,而是将整个空闲区都分配给作业。
内存分配与回收所使用的结构体:为便于对内存的分配和回收,建立两张表记录内存的使用情况。
一张为记录作业占用分区的“内存分配表”,内容包括分区起始地址、长度、作业名/标志(为0时作为标志位表示空栏目);一张为记录空闲区的“空闲分区表”,内容包括分区起始地址、长度、标志(0表空栏目,1表未分配)。
两张表都采用顺序表形式。
关于分配留下的内存小碎片问题:当要装入一个作业时,从“空闲分区表”中查找标志为“1”(未分配)且满足作业所需内存大小的最小空闲区,若空闲区的大小与作业所需大小的差值小于或等于minsize,把该分区全部分配给作业,并把该空闲区的标志改为“0”(空栏目)。
操作系统课程设计
一、课程设计题目可变分区分配与回收--最佳适应算法1、课程设计题目分析1)动态分区分配它是连续分配方式之一,动态分区分配是根据进程的实际需要,动态地为之分配内存空间。
2)分区分配算法为把一个新作业装入内存,须按照一定的分配算法,从空闲分区表或空闲分区链中选出一分区分配给该作业。
目前常用的有以下五种分配算法。
①首次适应算法(first fit)②循环首次适应算法(next fit)③最佳适应算法(best fit)④最坏适应算法(worst fit)⑤快速适应算法(quick fit)3)最佳适应算法所谓“最佳”是指每次为作业分配内存是,宗总是把能满足要求、又是最小的空间分区分配给作业,避免“大材小用”。
为了加速寻找,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。
但是,每次分配后所切割下来的剩余部分总是最小的,这样,在存储器中会留下许多难以利用的小空闲区。
4)可变分区的回收当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链(表)中找到相应的插入点,此时可能出现以下三种情况之一:①回收区与插入点的前一个空闲分区F1相邻接,见图(a)。
此时应将回收区与插入点的前一分区合并,不必为回收分区分配新表项,而只需修改其前一分区F1的大小②回收分区与插入点的后一空闲分区F2相邻接,见图(b)。
此时也可将两分区合并,形成新的空闲分区,但用回收区的首址作为新空闲区的首址,大小为两者之和。
③回收区同时与插入点的前、后两个分区邻接,见图(C)。
此时将三个分区合并,使用F1表项和F1的首址,取消F2的表项,大小为三者之和。
④回收区既不与F1邻接,又不与F2邻接。
这时应为回收区单独建立一新2、数据结构1) 空间抽象类:Area.javaclass Area {private int id; //空闲区域号private int value; //空闲区域大小public int getId() { //空闲区域号的获得方法return id;}public void setId(int id) { //空闲区域大小的设置this.id = id;}public int getValue() { //空闲区域大小的获得方法return value;}public void setValue(int value) { //空闲区域大小的设置this.value = value;}Area(int id) { //空闲区域类构造方法1 this.id = id;}Area(int id, int value) { //空闲区域类的构造方法2 this.id = id;this.value = value;}}2) 作业抽象类:Memory.javaclass Memory {private int id; //作业号private int value; //作业大小public int getId() { //作业号的获得方法return id;}public void setId(int id) { //作业号的设置this.id = id;}public int getValue() { //作业大小的获得方法return value;}public void setValue(int value) { //作业大小的设置this.value = value;}Memory(int id) { //作业类的构造方法1this.id = id;}Memory(int id, int value) { //作业类的构造方法2this.id = id;this.value = value;}}3、流程图最佳适应算法流程示意图见图3.14、开发环境1)开发环境安装Java开发工具--JDK安装包,设置环境变量2)开发工具下载Eclipse软件并安装,它是一个开源的基于Java的免费开发平台,是一个可视化的开发环境。
可变分区存储管理方式的内存分配和回收
free_quantity++; fscanf(文件指针,格式字符串,输入表列);}return 1;}return 0;}void sort(){int i,j,p;for(i=0;i<free_quantity-1;i++){p=i;for(j=i+1;j<free_quantity;j++){if(frees[j].address<frees[p].address){p=j;}}if(p!=i){frees[free_quantity]=frees[i];frees[i]=frees[p];frees[p]=frees[free_quantity];}}}void view(){int i;cout<<endl<<"mmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmm"<< endl;cout<<"输出空闲区表:\n起始地址分区长度状态\n"<<endl;for(i=0;i<free_quantity;i++){(2);(12);cout<<frees[i].address;(10);cout<<frees[i].length;(8);cout<<frees[i].tag<<endl;}cout<<endl<<"wwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwww"< <endl;cout<<"输出已分分区表:\n起始地址分区长度占用作业名\n"<<endl;for(i=0;i<occupy_quantity;i++){(2);(12);cout<<occupys[i].address;(10);cout<<occupys[i].length;(8);cout<<occupys[i].tag<<endl;}}void ear(){char job_name[10];int job_length;int i,j,flag,t;cout<<"请输入分配内存的作业名和空间大小:";cin>>job_name;cin>>job_length;flag=0;for(i=0;i<free_quantity;i++){ ength>=job_length){flag=1;}}if(flag==0){ ength>=job_length){ddress=frees[i].address; ag,job_name);occupys[occupy_quantity].length=job_length;occupy_quantity++;if(frees[i].length>job_length){frees[i].address+=job_length;frees[i].length-=job_length;}else{for(j=i;j<free_quantity-1;j++){frees[j]=frees[j+1];}free_quantity--;cout<<"内存空间成功:)"<<endl;}}}void reclaim()ag,job_name)){flag=i;address=occupys[i].address;length=occupys[i].length;}}if(flag==-1){ ddress+frees[i].length)==address){if(((i+1)<free_quantity)&&(frees[i+1].address==address+length)){frees[i].length=frees[i].length+frees[i+1].length+length;for(j=i+1;j<free_quantity;j++){frees[j]=frees[j+1];}free_quantity--;p=1;}else{frees[i].length+=length;p=1;}}if(frees[i].address==(address+length)){frees[i].address=address;frees[i].length+=length;p=1;}}if(p==0){frees[free_quantity].address=address;frees[free_quantity].length=length;free_quantity++;}ddress=-1;ength=0;strcpy(frees[i].tag,"free");occupys[i].address=-1;ength=0;strcpy(occupys[i].tag,"");}free_quantity=0;occupy_quantity=0;flag=read();while(flag==1){sort();cout<<"选择功能项: (0-退出,1-分配内存,2-回收内存,3-显示内存)\n"<<endl;cout<<"选择功项(0-3):";cin>>chioce;switch(chioce){case 0:flag=0;break;case 1:ear();break;case 2:reclaim();break;case 3:view();break;default:cout<<"没有该选项\n"<<endl;}}}。
操作系统-存储管理动态分区分配及回收算法(附源码)
存储管理动态分区分配及回收算法课程名称:计算机操作系统班级:信1501-2实验者姓名:李琛实验日期:2018年5月20日评分:教师签名:一、实验目的分区管理是应用较广泛的一种存储管理技术。
本实验要求用一种结构化高级语言构造分区描述器,编制动态分区分配算法和回收算法模拟程序,并讨论不同分配算法的特点.二、实验要求1、编写:First Fit Algorithm2、编写:Best Fit Algorithm3、编写:空闲区回收算法三、实验过程(一)主程序1、定义分区描述器node,包括3 个元素:(1)adr——分区首地址(2)size-—分区大小(3)next——指向下一个分区的指针2、定义3 个指向node 结构的指针变量:(1)head1—-空闲区队列首指针(2)back1-—指向释放区node 结构的指针(3)assign——指向申请的内存分区node 结构的指针3、定义1 个整形变量:free——用户申请存储区的大小(由用户键入)(二)过程1、定义check 过程,用于检查指定的释放块(由用户键入)的合法性2、定义assignment1 过程,实现First Fit Algorithm3、定义assignment2 过程,实现Best Fit Algorithm4、定义acceptment1 过程,实现First Fit Algorithm 的回收算法5、定义acceptment2 过程,实现Best Fit Algorithm 的回收算法6、定义print 过程,打印空闲区队列(三)执行程序首先申请一整块空闲区,其首址为0,大小为32767;然后,提示用户使用哪种分配算法,再提示是分配还是回收;分配时要求输入申请区的大小,回收时要求输入释放区的首址和大小。
实验代码Main。
cpp#include〈stdio。
h〉#include<stdlib。
h〉#include<string。
实验四可变分区存储管理方式的内存分配和回收
实验四实验四可变分区存储管理方式的内存分配和回收一.实验目的通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉可变分区存储管理的内存分配和回收。
二.实验属性设计三.实验内容1.确定内存空间分配表;2.采用最优适应算法完成内存空间的分配和回收;3.编写主函数对所做工作进行测试。
四.实验背景材料实现可变分区的分配和回收,主要考虑的问题有三个:第一,设计记录内存使用情况的数据表格,用来记录空闲区和作业占用的区域;第二,在设计的数据表格基础上设计内存分配算法;第三,在设计的数据表格基础上设计内存回收算法。
首先,考虑第一个问题,设计记录内存使用情况的数据表格,用来记录空间区和作业占用的区域。
由于可变分区的大小是由作业需求量决定的,故分区的长度是预先不固定的,且分区的个数也随内存分配和回收变动。
总之,所有分区情况随时可能发生变化,数据表格的设计必须和这个特点相适应。
由于分区长度不同,因此设计的表格应该包括分区在内存中的起始地址和长度。
由于分配时空闲区有时会变成两个分区:空闲区和已分分区,回收内存分区时,可能会合并空闲分区,这样如果整个内存采用一张表格记录己分分区和空闲区,就会使表格操作繁琐。
分配内存时查找空闲区进行分配,然后填写己分配区表,主要操作在空闲区;某个作业执行完后,将该分区变成空闲区,并将其与相邻的空闲区合并,主要操作也在空闲区。
由此可见,内存的分配和回收主要是对空闲区的操作。
这样为了便于对内存空间的分配和回收,就建立两张分区表记录内存使用情况,一张表格记录作业占用分区的“己分分区表”;一张是记录空闲区的“空闲区表”。
这两张表的实现方法一般有两种:一种是链表形式,一种是顺序表形式。
在实验中,采用顺序表形式,用数组模拟。
由于顺序表的长度必须提前固定,所以无论是“已分分区表”还是“空闲区表”都必须事先确定长度。
它们的长度必须是系统可能的最大项数。
“已分分区表”的结构定义#define n 10 //假定系统允许的最大作业数量为nstruct{ float address; //已分分区起始地址float length; //已分分区长度、单位为字节int flag; //已分分区表登记栏标志,“0”表示空栏目,实验中只支持一个字符的作业名}used_table[n]; //已分分区表“空闲区表”的结构定义#define m 10 //假定系统允许的空闲区最大为mstruct{ float address; //空闲区起始地址float length; //空闲区长度、单位为字节int flag; //空闲区表登记栏标志,“0”表示空栏目,“1”表示未分配}used_table[n]; //空闲区表第二,在设计的数据表格基础上设计内存分配。
可变分区分配与回收——采用最坏算法-操作系统课程设计
哈尔滨理工大学课程设计(操作系统)题目:可变分区分配与回收—采用最坏算法班级:计算机科学与技术学院计算机系10-8班姓名:张兢 1004010813指导教师:高雪瑶系主任:林克正2013年03月01日一、课程设计目的1、背景主存是CPU可直接访问的信息空间,合理而有效的使用贮存将在很大程度上影响整个计算机系统的性能。
本课题要求模拟实现分区式主存管理机制。
模拟实现各种分区管理方法以及相应的主存分配以及回收算法。
2、目的通过该课题进一步加深对可变分区存储机制的理解。
加深对存储器动态分区分配算法的认识。
掌握“首次适应算法”、“下次适应算法”、“最佳适应算法发”、“最坏适应算法”的内存分配过程。
掌握内存的回收策略。
二、课题任务描述1、设计可用的内存空闲空间,并能动态输入用户作业所需的内存大小。
2、编程模拟各种分配算法的实施过程,允许自行选择如“首次适应算法”、“下次适应算法”、“最佳适应算法发”、“最坏适应算法”等常用算法,要求实现不少于三种算法。
3、实现内存的回收。
要求考虑回收时的内存合并问题。
三、课题研发相关知识(包含所用库函数的介绍)1、首次适应算法(first fit)FF算法要求空闲分区链以地址递增的次序链接。
在分配内存时,从链首开始顺序查找,直至找到一个大小能男足要求的空闲分区位置;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。
若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。
但是,低址部分不断被划分,会留下许多难以利用的很小的空闲分区。
2、最佳适应算法(best fit)所谓“最佳”是指每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。
为了加速寻找,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。
这样,第一次找到的能满足要求的空闲区,必然是最佳的。
这样,在存储器中会留下许多难以利用的小空闲区。
操作系统 可变分区分配与回收
#include<iostream>#include<stdlib.h>#define MAX_SIZE 10000#define BUSY 1#define FREE 0#define LIMIT_SIZE 100using namespace std;struct MemoryBlock{MemoryBlock *front,*next;long size;long addr;int PID;int state;}*head,*cur,*tmp;int PIDcnt;void init(){PIDcnt=0;head=new MemoryBlock;head->next=NULL;head->size=MAX_SIZE;head->addr=0;head->state=0;}void Redis(){cur=head;while(cur){if(cur->state==1){cur=cur->next;continue;}if(cur->next==NULL) break;MemoryBlock *n=cur;cur=cur->next;while(cur->state==1){cur=cur->next;} MemoryBlock *f=n;while(n!=cur){n=n->next;n->addr-=f->size;}cur->size+=f->size;if(f==head){head=f->next;}else{f->front->next=f->next;f->next->front=f->front;}delete f;}// Show();}void Show(){cur=head;int num=0;puts("---------------------------------------------------\n");cout<<"num "<<"addr "<<"size "<<"state "<<"PID "<<endl;while(cur!=NULL){printf("%-6d%-8d%-8d%-8d",++num,cur->addr,cur->size,cur->state);if(cur->state)cout<<cur->PID;cout<<endl;cur=cur->next;}puts("\n---------------------------------------------------\n");}void Alloc(){int flag=1;int u_size;cur=head;cout<<"please input the size:"<<endl;cin>>u_size;while((cur!=NULL)&&flag==1){if(cur->size<u_size||cur->state==1)cur=cur->next;else {if((cur->size-u_size)<LIMIT_SIZE){cur->state=1;cur->PID=++PIDcnt;flag=cur->addr;}else {MemoryBlock *tMB=new MemoryBlock;if(cur==head){head=tMB;}else{cur->front->next=tMB;tMB->front=cur->front;}cur->front=tMB;tMB->next=cur;tMB->addr=cur->addr;tMB->size=u_size;tMB->state=1;tMB->PID=++PIDcnt;cur->addr+=u_size;cur->size-=u_size;flag=tMB->addr;}}}if(flag==1){Redis();cur=head;while((cur!=NULL)&&flag==1){if(cur->size<u_size||cur->state==1)cur=cur->next;else {if((cur->size-u_size)<LIMIT_SIZE){cur->state=1;cur->PID=++PIDcnt;flag=cur->addr;}else {MemoryBlock *tMB=new MemoryBlock;if(cur==head){head=tMB;}else{cur->front->next=tMB;tMB->front=cur->front;}cur->front=tMB;tMB->next=cur;tMB->addr=cur->addr;tMB->size=u_size;tMB->state=1;tMB->PID=++PIDcnt;cur->addr+=u_size;cur->size-=u_size;flag=tMB->addr;}}}if(flag==1){puts("---------------------------------------\n");cout<<"failed,without enough memory!\n"<<endl;puts("---------------------------------------\n");}else {puts("---------------------------------------\n");cout<<"succeed,the memory block begin from "<<flag<<endl<<endl;puts("---------------------------------------\n");}}else {puts("---------------------------------------\n");cout<<"succeed,the memory block begin from "<<flag<<endl<<endl;puts("---------------------------------------\n");}}void Recycle(){int ID;int flag=1;cur=head;cout<<"please input the PID of the process you want to delete:";cin>>ID;while(flag&&cur){if(cur->state==1&&cur->PID==ID){if(cur!=head){if(cur->front->state==0){cur->front->size+=cur->size;cur->front->next=cur->next;cur->next->front=cur->front;tmp=cur;cur=cur->front;delete tmp;}}if(cur->next!=NULL){if(cur->next->state==0){cur->size+=cur->next->size;if(cur->next->next!=NULL)cur->next->next->front=cur;tmp=cur->next;cur->next=cur->next->next;delete tmp;}}cur->state=0;flag=0; }cur=cur->next;}if(flag==1){puts("---------------------------------------\n");cout<<"failed,without such process!\n"<<endl;puts("---------------------------------------\n");}else {puts("---------------------------------------\n");cout<<"succeed,process "<<ID<<" has been deleted"<<endl<<endl;puts("---------------------------------------\n");}}int main(){int i;char c;init();puts("___________welcome to Operating systen curriculum project___________\n");while(1){puts("1.Allocate memory\n");puts("2.Recycle memory\n");puts("3.Redistribut memory\n");puts("4.show the memory state\n");puts("0.exit\n");c=getchar();switch(c){case '1': Alloc();getchar();break;case '2':Recycle();getchar();break;case '3': Redis();getchar();break;case '4':Show();getchar();break;case '0':return 0;default:getchar();}}}。
实验报告 可变分区 主存分配回收
printf("========================================\n");
printf("输入你的选择:\n");
scanf("%d",&j);
switch(j)
{
case 1:insertu(i);//为作业分配空间
//合并完之后的空闲分区的结束地址和相邻的空闲分区的起始地址也相连,则继续合并
{
fr[i].len=fr[i].len+fr[i+1].len;
for(k=i+1;k<m-1;k++)
{
fr[k].ad=fr[k+1].ad;
fr[k].len=fr[k+1].len;
fr[k].state=fr[k+1].state;
操作系统实验报告
设计题目
在可变分区管理方式下采用最先适应算法实现主存分配和实现主存回收
一、设计内容
主存储器空间的分配和回收。
二、设计目的
一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实习帮助学生理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。
{
while(fr[i].state!='M')
(实验3)在可变分区管理方式下采用最先适应算法实现主存分配与回收
实验3 内存管理一、实验内容选择一种算法在可变分区管理方式下对内存进行管理 二、实验目的掌握可变分区内存管理方式,能熟练运用内存管理的各种算法对内存进行分配和回收。
三、实验题目在可变分区管理方式下采用最先适应算法实现主存分配与回收 [提示]:可变分区方式是按作业需要的主存空间大小来分割分区的。
当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。
随着作业的装入、撤离,主为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:第一栏 第二栏其中,起址——指出一个空闲区的主存起始地址。
长度——指出从起始地址开始的一个连续空闲的长度。
状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区;另一种是“空表目”状态,表示表中对应的登记项目是空白(无效),可用来登记新的空闲区(例如,作业撤离后,它所占的区域就成了空闲区,应找一个“空表目”栏登记归还区的起址和长度且修改状态)。
由于分区的个数不定,所以空闲区说明表中应有适量的状态为“空表目”的登记栏目,否则造成表格“溢出”无法登记。
上述的这张说明表的登记情况是按提示(1)中的例所装入的三个作业占用的主存区域后填写的。
(2) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。
有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。
为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。
为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。
为了方便查找还可使表格“紧缩”,总是让“空表目”栏集中在表格的后部。
(3) 采用最先适应算法(顺序分配算法)分配主存空间。
内存可变分区分配算法的分配和回收
内存可变分区分配算法的分配和回收下载提示:该文档是本店铺精心编制而成的,希望大家下载后,能够帮助大家解决实际问题。
文档下载后可定制修改,请根据实际需要进行调整和使用,谢谢!本店铺为大家提供各种类型的实用资料,如教育随笔、日记赏析、句子摘抄、古诗大全、经典美文、话题作文、工作总结、词语解析、文案摘录、其他资料等等,想了解不同资料格式和写法,敬请关注!Download tips: This document is carefully compiled by this editor. I hope that after you download it, it can help you solve practical problems. The document can be customized and modified after downloading, please adjust and use it according to actual needs, thank you! In addition, this shop provides you with various types of practical materials, such as educational essays, diary appreciation, sentence excerpts, ancient poems, classic articles, topic composition, work summary, word parsing, copy excerpts, other materials and so on, want to know different data formats and writing methods, please pay attention!引言内存管理是计算机系统中至关重要的一部分,而可变分区分配算法是其中的一种常见方法。
《操作系统》实验报告2 可变分区存储管理方式的内存分配回收
scanf("%d",&a);
switch(a)
{case0;exit(0);
case1;
printf ("输º?入¨?作Á¡Â业°¦Ì名?J和¨ª作Á¡Â业°¦Ì所¨´需¨¨长¡è度¨¨xk:êo");
scanf("%*c%c%f",&J,&xk);
实验项目
名称
可变分区存储管理方式的内存分配回收
实验
目的及要求
1、深入了解采用可变分区存储管理方式的内存分配回收的实现
实验
内容
编写程序完成可变分区存储管理方式的内存分配回收
实验步骤
1、确定内存空间分配表
2、采用最优适应算法完成内存空间的分配和回收
3、编写主函数对所做工作进行测试
实验环境
Windows XP、visualstudio 2005
}
i++;
}
if(k!=-1)
if(j!=1)
{free_table[k].length=free_table[j].length+free_table[k].length+L;
free_table[j].flag=0;
}
else
free_table[k].length=free_table[k].length+L;
L=used_table[s].length;
j==1;k=-1;i=0;
while(i<m&&(j==-1||k==-1))
{
if(free_table[i].glag==0)
操作系统实验报告可变分区存储管理方式的内存分配回收
操作系统实验报告可变分区存储管理方式的内存分配回收集团文件发布号:(9816-UATWW-MWUB-WUNN-INNUL-DQQTY-实验三可变分区存储管理方式的内存分配回收一.实验目的(1)深入了解可变分区存储管理方式的内存分配回收的实现。
二.实验内容编写程序完成可变分区存储管理方式的内存分配回收,要求有内存空间分配表,并采用最优适应算法完成内存的分配与回收。
三.实验原理在可变分区模式下,在系统初启且用户作业尚未装入主存储器之前,整个用户区是一个大空闲分区,随着作业的装入和撤离,主存空间被分成许多分区,有的分区被占用,而有的分区时空闲的。
为了方便主存空间的分配和去配,用于管理的数据结构可由两张表组成:“已分配区表”和“未分配区表”。
在“未分配表中”将空闲区按长度递增顺序排列,当装入新作业时,从未分配区表中挑选一个能满足用户进程要求的最小分区进行分配。
这时从已分配表中找出一个空栏目登记新作业的起始地址和占用长度,同时修改未分配区表中空闲区的长度和起始地址。
当作业撤离时已分配区表中的相应状态变为“空”,而将收回的分区登记到未分配区表中,若有相邻空闲区再将其连接后登记。
可变分区的回收算法较为复杂,当一个作业撤离时,可分为4种情况:其临近都有作业(A和B),其一边有作业(A或B),其两边均为空闲区。
尤其重要的是,在程序中利用“new类型T(初值列表)”申请分配用于存放T类型数据的内存空间,利用“delete指针名”释放指针所指向的内存空间。
四.实验部分源程序#include<iostream>usingnamespacestd;typedefstructSNode{//SpaceNodeintstart,end;//起始,结束intlength;//长度大小structSNode*next;//指向下一结点的指针}*SP;SPHead=(SP)malloc(sizeof(SNode));//全局变量,内存空间头结voidDispSpace(){//显示内存空间分配情况SPp=Head->next;cout<<"\n空闲区说明表\n"<<"---地址--长度---\n";while(p){cout<<""<<p->start<<""<<p->length<<endl;p=p->next;}cout<<"----------------\n";}voidInitial(){//初始化说明表SPp,q;p=(SP)malloc(sizeof(SNode));q=(SP)malloc(sizeof(SNode));p->start=14;p->length=12;p->end=26;q->start=32;q->length=96;q->end=128;//指导书上的作业分配Head->next=p;//与头结点连接p->next=q;q->next=NULL;DispSpace();}voidAllocation(intlen){//分配内存给新作业SPp=Head->next,q;while(p){if(p->length<len)p=p->next;elseif(p->length>len){p->start=p->start+len;p->length=p->length-len;cout<<"分配成功!\n";DispSpace();return;}else{//当两者长度相等q=p->next;p->next=q->next;cout<<"分配成功!\n";DispSpace();return;}}cout<<"分配失败!\n";DispSpace();return;}voidCallBack(intsta,intlen){//回收内存SPp=Head,q=p->next,r;//开始地址和长度p->end=0;inten=sta+len;while(q){if(sta==0){//初始地址为0if(en==q->start){//正好回收q->start=0;q->length=q->end;return;}else{r=(SP)malloc(sizeof(SNode));r->start=sta;r->length=len;r->end=en; p->next=r;r->next=q;return;}}elseif((p->end<sta)&&(q->start>en)){//上邻区r=(SP)malloc(sizeof(SNode));r->start=sta;r->length=len;r->end=en;p->next=r;r->next=q;return;}elseif((p->end<sta)&&(q->start==en)){//邻区相接q->start=sta;q->length=q->end-sta;return;}elseif((p->end==sta)&&(q->start<en)){//下邻区p->end=en;p->length=en-p->start;return;}elseif(p->end==sta&&q->start==en){//邻区相接p->end=q->end;p->length=p->end-p->start;p->next=q->next;return;}else{p=p->next;q=q->next;}}}voidmain(){Initial();cout<<"现在分配大小为6K的作业4申请装入主存:"; Allocation(6);//分配时参数只有长度//--------指导书测试数据演示----------cout<<"现回收作业3(起址10,长度4)\n";CallBack(10,4);DispSpace();cout<<"现回收作业2(起址26,长度6)\n";CallBack(26,6);DispSpace();//---------------演示结束-------------system("pause");}五.实验结果与体会我的体会:。
计算机操作系统内存管理系统可变分区存储管理方式的内存分配回收
计算机操作系统内存管理系统可变分区存储管理方式的内存分配回收概述内存管理是操作系统中重要的一部分,它负责管理计算机内存的分配和回收。
可变分区存储管理方式是一种常用的内存管理方案,它将内存分为多个不同大小的分区,每个分区可以被分配给一个进程来使用。
本文将介绍可变分区存储管理方式的内存分配和回收过程。
内存分配可变分区存储管理方式的内存分配过程包括空闲分区的选择和分区的划分。
空闲分区的选择在可变分区存储管理方式中,操作系统需要选择一个合适的空闲分区来分配给进程。
常用的空闲分区选择算法有:•首次适应算法(First Fit):从头开始寻找满足进程需要的空闲分区。
•最佳适应算法(Best Fit):从所有满足进程需要的空闲分区中选择大小最接近的一个。
•最差适应算法(Worst Fit):选择能够满足进程需要且最大的空闲分区。
选择合适的空闲分区算法可以提高内存利用率和分配的效率。
分区的划分一旦选择了合适的空闲分区,操作系统需要对该分区进行划分,以满足进程的内存需求。
常用的分区划分方式包括:•等分划分:将空闲分区按照进程的内存需求进行等分划分。
•保留部分划分:只将进程需要的内存大小分配给进程,剩余的空闲分区保留。
分区的划分方式可以根据实际情况选择,以满足不同进程的内存需求。
内存回收可变分区存储管理方式的内存回收过程包括释放分区和合并分区两个步骤。
释放分区当一个进程终止或释放了分配给它的内存分区时,该分区将被标记为空闲,可以被其他进程使用。
合并分区在进行内存回收时,为了提高内存利用率,操作系统通常会进行分区的合并。
合并分区需要考虑到合并后的分区是否满足其他进程的内存需求。
常用的合并分区策略有:•相邻空闲分区合并:将相邻的两个空闲分区合并成一个更大的空闲分区。
•首次适应合并:从头开始寻找空闲分区,如果找到两个相邻的空闲分区,可以将它们合并起来。
通过合并分区,可以减少内存碎片,提高内存的利用率。
可变分区存储管理方式是一种常用的内存管理方案,在内存分配和回收过程中,通过选择合适的空闲分区和分区的划分以及合并分区,可以高效地管理计算机内存,提高内存利用率。
操作系统实验报告可变分区存储管理方式的内存分配回收
操作系统实验报告可变分区存储管理方式的内存分配回收可变分区存储管理方式是一种常见的内存分配和回收策略,通过将内存分成若干大小不等的分区,分配给不同大小的进程使用。
本文将对可变分区存储管理方式的内存分配和回收进行详细介绍。
首先,可变分区存储管理方式需要对内存进行划分,将内存分成若干个大小不等的分区。
这些分区可以是固定大小的,也可以是可变大小的。
当进程申请内存时,系统会根据申请内存的大小来选择一个合适大小的分区进行分配。
分配时分为两种情况:首次适应和最佳适应。
首次适应算法是指从内存的起始位置开始遍历分区,找到第一个能满足进程要求的分区进行分配。
这种算法的优点是找到满足条件的分区速度较快,缺点是容易造成较大的内存碎片。
最佳适应算法是指通过遍历整个内存,找到一个大小最接近进程要求的分区进行分配。
这种算法的优点是能够减小内存碎片的产生,但是分配速度较慢。
当进程结束时,需要回收其占用的内存。
对于可变分区存储管理方式,在回收内存时出现了两种情况:内部碎片和外部碎片。
内部碎片是指分配给进程的分区中,有一部分空闲内存无法被其他进程利用。
这是因为当一些进程需要分配内存时,分配的大小可能大于其实际需要的大小,导致分区中留下了空余空间。
解决内部碎片的方法是动态地调整分区的大小,使其能够更好地适应进程的大小需求。
外部碎片是指存储空闲的分区之间的一些不可利用的内存。
当进程需要分配内存时,可能没有一个分区能满足其大小需求,导致无法分配内存。
解决外部碎片的方法是内存紧缩和分区合并。
内存紧缩是指将内存中的进程向一端移动,使剩余的空闲内存空间连在一起。
这样可以使得所有的空闲内存空间都可以被利用,减少外部碎片的产生。
分区合并是指将不连续的空闲分区进行合并,形成更大的连续空闲分区。
这样可以提供给大型进程使用,减少外部碎片的产生。
综上所述,可变分区存储管理方式的内存分配和回收是一个动态的过程,需要根据进程的需求进行灵活地管理。
它可以通过首次适应或最佳适应算法选择合适的分区进行内存分配,通过动态调整分区大小解决内部碎片问题,并通过内存紧缩和分区合并减少外部碎片的产生。
操作系统之内存分配与回收
操作系统实验内存的分配与回收实验报告一、实验题目:内存的分配与回收二、实验内容:利用可变分区的首次适应算法,模拟内存的分配与回收。
三、实验目的:掌握可变分区首次适应算法的原理以及其编程实现。
四、实验过程:1、基本思想:可变分区分配是根据进程的实际需求,动态地为之分配内存空间。
首次适应算法要求空闲空间链以地址递增的次序链接。
进行内存分配时,从链表头部开始依次检索,找到第一个不小于请求空间大小的空闲空间进行分配。
分配时需考虑碎片问题,若分配会导致碎片产生则将整块分区分配。
内存的回收需要考虑四种情况:⑴回收分区前后两个分区都空闲,则需要和前后两个分区合并;(2)回收分区只有前一分区空闲,则与前一分区合并;(3)回收分区只有后一分区空闲,则和后一分区合并;(4)回收分区独立,不考虑合并。
2、主要数据结构:struct FreeArea{ 链结点包含的数据:分区号、大小、起址、标记int ID;int size;long address;int sign;};struct Node { 双链表结点结构体:数据区、前向指针、后继指针FreeArea data;struct Node *prior;struct Node *next;}*DLinkList;3、输入、输出:输入: I.内存分配时由键盘输入分区ID和大小;II.内存回收时由键盘输入需要回收的分区ID;输出:输出内存的分配情况(按照地址从低到高)4、程序流程图:5、实验结果截屏:6、源程序代码:#include<iostream>using namespace std;#define Free 0 //空闲状态#define Busy 1 //已用状态#define PBusy 2 //碎片已用状态#define FINISH 1 //完成#define FINISH2 1 //完成#define ERROR 0 //出错#define memory 512 //最大内存空间为(单位:KB)#define min 10 //碎片最小值(单位:KB)typedef struct FreeArea//空闲链数据{int ID;int size;long address;int sign;};typedef struct Node//空闲连结构{FreeArea data;struct Node *prior;struct Node *next;}*DLinkList;DLinkList head; //头结点DLinkList tail; //尾结点int Create()//初始化{head=(DLinkList)malloc(sizeof(Node));//分配内存tail=(DLinkList)malloc(sizeof(Node));head->prior=NULL;head->next=tail;tail->prior=head;tail->next=NULL;tail->data.address=0;tail->data.size=memory;tail->data.ID=0;tail->data.sign=Free;return FINISH;}int FirstFit(int ID,int request)//首次适应算法{DLinkList temp=(DLinkList)malloc(sizeof(Node));//新建作业的结点temp->data.ID=ID;temp->data.size=request;temp->data.sign=Busy;Node *p=head;//插入指针Pwhile(p){if(p->data.sign==Free && p->data.size==request)//剩余大小恰好满足{p->data.sign=Busy;p->data.ID=ID;return FINISH;break;}else if(p->data.sign==Free&& p->data.size>request&& (p->data.size-request>min))//满足需求且有剩余且不产生碎片{temp->prior=p->prior;temp->next=p;temp->data.address=p->data.address;p->prior->next=temp;p->prior=temp;p->data.address=temp->data.address+temp->data.size;p->data.size=p->data.size-request;return FINISH;break;}else if(p->data.sign==Free&& p->data.size>request&& p->data.size-request<=min)//产生碎片时{p->data.sign=PBusy;p->data.ID=ID;return FINISH;break;}p=p->next;//若前面的分区都已分配,P指针后移}return ERROR;}int Allocate()//主存分配{int ID,request;cout<<"请输入作业所在分区号:";cin>>ID;cout<<"请输入分配的主存(单位:KB):";cin>>request;if(request<0 ||request==0){cout<<"分配的主存必须是正整数!"<<endl;return ERROR;}if(FirstFit(ID,request)==FINISH)cout<<"分配成功!"<<endl;elsecout<<"内存不足,分配失败!"<<endl;}int Recycle(int ID)//回收{Node *p=head;while(p){if(p->data.ID==ID){p->data.sign=Free;//p->data.ID=Free;if((p->prior->data.sign==Free)&&(p->next->data.sign==Free))//与前后的空闲块相连{p->prior->data.size=p->prior->data.size+p->data.size+p->next->data.size;p->prior->next=p->next->next;if(p->next->next==NULL)//若p->next是最后一个结点{p->prior->data.ID=Free;p->next=NULL;}else{p->next->next->prior=p->prior;}break;}if(p->prior->data.sign==Free)//与前面的空闲块相连{p->prior->data.size+=p->data.size;p->prior->next=p->next;p->next->prior=p->prior;break;}if(p->next->data.sign==Free)//与后面的空闲块相连{p->data.size+=p->next->data.size;if(p->next->next==NULL)//若p->next是最后一个结点p->next=NULL;else{p->next->next->prior=p;p->next=p->next->next;}break;}break;}p=p->next;}cout<<"分区:"<<ID<<"回收成功"<<endl;return FINISH;}void show()//显示{cout<<" 主存分配情况\n";Node *p=head->next;while(p){cout<<"分区号:";if(p->data.ID==Free)cout<<"Free"<<endl;elsecout<<p->data.ID<<endl;cout<<"起始地址:"<<p->data.address;cout<<" 分区大小:"<<p->data.size<<" KB";cout<<" 状态:";if(p->data.sign==Free)cout<<"空闲"<<endl;else if(p->data.sign==PBusy)cout<<"碎片已分配"<<endl;elsecout<<"已分配"<<endl;p=p->next;}cout<<endl;}void main(){Create();int choice;int i;for(i=0;;i++){cout<<"请输入操作:";cout<<"1.分配内存 2.回收内存 3.显示主存0.退出";cout<<endl;cin>>choice;if(choice==1)// 分配内存Allocate();else if(choice==2)// 内存回收{ i nt ID;cout<<"请输入要释放的分区号:";cin>>ID;Recycle(ID);}else if(choice==3)//显示主存show();else if(choice==0)//退出break;else//非法输入{cout<<"输入有误!"<<endl;continue;}}}。
操作系统实验_最佳适应算法最坏适应算法
学号P7******* 专业计算机科学与技术姓名实验日期2017/11/23 教师签字成绩实验报告【实验名称】基于顺序搜索的动态分区分配算法(二)【实验目的】理解在连续分区动态的存储管理方式下,如何实现贮存空间的分配与回收。
采用可变式分区管理,使用最佳适应算法实现主存空间的分配与回收。
采用可变式分区管理,使用最坏适应算法实现主存空间的分配与回收。
【实验原理】C++语言程序设计数据结构最佳适应算法最坏适应算法数据结构和符号说明1、bool ROM[N]; //定义主存信息,如果内存被占用,则标记为1,否则标记为0,设置内存单元为10242、pcb num[20];//定义作业数组,最大支持20个作业3、typedef struct Pcb //定义作业结构体,包括名称,开始时间,大小,是否执行状态{char name[10];int start;int size;int state=0;} pcb;主要函数:void find_free_rom();//寻找空闲区void sort1();//对空闲区进行排序从小到大void sort1();//对空闲区进行排序从大到小void show();//显示函数void insert_pcb1(pcb &a);//最佳适应算法void insert_pcb2(pcb &a);//最坏适应算法void init();//初始化函数算法流程图:#include<stdio.h>#include<string.h>#define N 1024bool ROM[N];int p=0;int count=0;int free_rom_counter=0;//空闲区数目typedef struct Pcb //进程结构体{char name[10];int start;int size;//大小int state=0; //状态} pcb;pcb num[20];//进程数组typedef struct Free_rom//空闲区结构体{int num;int start;int end;int space;//空闲区大小} Free_room;Free_rom free_rom[100];//空闲区数组void show()//显示空闲区信息{printf("************************************************************* ***\n\n");printf("空闲区名\t开始地址\t\t大小\t\t结束地址\t\t\n");for (int i=1; i<= free_rom_counter; i++)printf("%d\t\t%d\t\t\t%d\t\t%d\t\t\n",free_rom[ i].num,free_rom[ i].s tart, free_rom[ i].space,free_rom[ i].end);printf("\n");printf("************************************************************* ***\n\n");}void find_free_rom()//寻找空闲区,更新空闲区数组{free_rom_counter=0;int i,j,p;for(i=0; i<N; i++)if(ROM[i]==0){p=i;for(j=i; j<N; j++){if(ROM[j]==0){i=j;continue;}if(ROM[j]==1)//找到就更新信息{free_rom_counter++;free_rom[ free_rom_counter].num= free_rom_counter; free_rom[ free_rom_counter].start=p;free_rom[ free_rom_counter].end=j-1;free_rom[ free_rom_counter].space=j-p;i=j+1;break;}}if(j==N&&ROM[j-1]==0)//对最后一个内存进行特殊处理{free_rom_counter++;free_rom[ free_rom_counter].num= free_rom_counter;free_rom[ free_rom_counter].start=p;free_rom[ free_rom_counter].end=j-1;free_rom[ free_rom_counter].space=j-p;}}}void sort1()//最佳适应算法对空闲区从小到大排序{find_free_rom();Free_rom a;for(int i=1; i<free_rom_counter; i++)for(int j=1; j<free_rom_counter; j++)if( free_rom[j].space> free_rom[j+1].space) {a=free_rom[j];free_rom[j]=free_rom[j+1];free_rom[j+1]=a;}}void sort2()//最坏适应算法对空闲区从大到小排序{find_free_rom();Free_rom a;for(int i=1; i<free_rom_counter; i++)for(int j=1; j<free_rom_counter; j++)if( free_rom[j].space< free_rom[j+1].space) {a=free_rom[j];free_rom[j]=free_rom[j+1];free_rom[j+1]=a;}}void init()//初始化{for(int i=0; i<N; i++)ROM[i]=0;}void input(pcb &a)//输入{char name[10];printf("输入进程名\n");scanf("%s",&);printf("输入进程大小\n");scanf("%d",&a.size);}void insert_pcb1(pcb &a)//最佳适应算法插入进程{find_free_rom();sort1();int i,j,k;for(i=1; i<=free_rom_counter; i++)//判断插入if(a.size<= free_rom[i].space){for(j= free_rom[i].start; j<free_rom[i].start+a.size; j++) ROM[j]=1;a.state=1;a.start=free_rom[i].start;num[count++]=a;break;}if(i==free_rom_counter+1)//插入失败printf("可用空间不足!\n");}void insert_pcb2(pcb &a)//最坏适应算法插入{find_free_rom();sort2();int i,j,k;for(i=1; i<=free_rom_counter; i++)if(a.size<= free_rom[i].space){for(j= free_rom[i].start; j<free_rom[i].start+a.size; j++)//寻找ROM[j]=1;a.state=1;a.start=free_rom[i].start;num[count++]=a;break;}if(i==free_rom_counter+1)//插入失败printf("可用空间不足!\n");}void Delete(pcb &a)//内存中释放进程{int i;for(i=a.start; i<a.start+a.size; i++)ROM[i]=0;//更新内存信息,更新进程状态数组a.state=0;printf("删除成功\n");find_free_rom();}int main()//主函数{init();find_free_rom();int choose1;int choose;char name[10];printf("1、最佳适应算法\n");//主界面printf("2、最坏首次适应算法\n");scanf("%d",&choose1);pcb a;do{printf("\n\n1、插入进程\n");printf("2、删除进程\n");printf("3、显示进程信息\n");printf("4、显示空余内存信息\n");scanf("%d",&choose);if(choose==1)//选择{input(a);if(choose1==1)insert_pcb1(a);else insert_pcb2(a);}else if(choose==2){printf("输入删除进程的名字\n");scanf("%s",&name);for(int i=0; i<count; i++)if( !strcmp(num[i].name,name))Delete(num[i]);}else if(choose==3){printf("************************************************************* ***\n\n");printf("进程名\t\t开始地址\t\t大小\t\t结束地址\t\t\n");//输出内存信息for(int i=0; i<count; i++)if(num[i].state!=0)printf("%s\t\t%d\t\t\t%d\t\t%d\t\t\n",num[i].name,num[i].start,num[i] .size,num[i].size+num[i].start-1);printf("\n*********************************************************** *****\n\n");}else if(choose=4){find_free_rom();show();}else break;}while(1);return 0;}截图:构造如下空闲区:此时插入一个进程 G,大小为80H,应插入到第二块空闲区再插入一个大小为30的进程H,应插入到第三块中再插入一个小进程,大小为5,插入到第二块空闲区,查看进程信息和空闲区信息:最佳适应算法成立。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
node->addr = tar->addr + size;
node->size = tar->size - size;
node->state = Free;
node->taskId = -1;
3、最坏适应算法(worst fit)
要扫描整个空闲分区表或链表,总是挑选一个最大的空闲区分割给作业使用,其优点是可使剩下的空闲区不至于太小,产生碎片的几率最小,对中小作业有力,查找效率很高。但是它会使存储器中缺乏大的空闲分区。
4、回收内存
当进程运行完毕释放内存时,系统根据会收取的首址,从空闲区链中找到相应的插入点,并考虑回收区前后是否有空闲分区,如果有,则把两个分区合并成一个大的空闲分区。
fir->pre = &subHead;
fir->nxt = NULL;
//初始化分区头部信息
subHead.pre = NULL;
subHead.nxt = fir;
}
//首次适应算法
int firstFit(int taskId, int size)
{ subAreaNode *p = subHead.nxt;
void intSubArea()
{//分配初始分区内存
subAreaNode *fir = (subAreaNode *)malloc(sizeof(subAreaNode));
//给首个分区赋值
fir->addr = 0;
fir->size = SIZE;
fir->state = Free;
fir->taskId = -1;
1、首次适应算法(first fit)
FF算法要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开始顺序查找,直至找到一个大小能男足要求的空闲分区位置;然后再按照作业的大小,从该分区中划出一块内存空间分配给请求者,余下的空闲分区仍留在空闲链中。若从链首直至链尾都不能找到一个能满足要求的分区,则此次内存分配失败,返回。但是,低址部分不断被划分,会留下许多难以利用的很小的空闲分区。
(3)函数
1)void intSubArea():分配初始分区内存。
2)int firstFit(int taskId, int size):首次适应算法实现函数,taskId为作业名,size为作业申请的内存大小。
3)int bestFit(int taskId, int size):最佳适应算法实现函数,taskId为作业名,size为作业申请的内存大小。
5、库函数的介绍
1)stdio就是指“standard buffered input&output"意思就是说带缓冲的标准输入输出!所以了,用到标准输入输出函数时,就要调用这个头文件!
2)Stdlib.h即standard library 标准库文件。Stdlib头文件里包含了C,C++语言的最常用的系统函数。Stdlib.h里面定义了五中类型,一些宏和通用工具函数。 类型例如:size_t ,wchar_t, div_t, ldiv_t,lldiv_t; 宏例如:EXIT_FALIRE,EXIT_SUCCESS,RAND_MAX和MB_CUR_MAX。
1、设计可用的内存空闲空间,并能动态输入用户作业所需的内存大小。
2、编程模拟各种分配算法的实施过程,允许自行选择如“首次适应算法”、“下次适应算法”、“最佳适应算法发”、“最坏适应算法”等常用算法,要求实现不少于三种算法。
3、实现内存的回收。要求考虑回收时的内存合并问题。
三、课题研发相关知识 (包含所用库函数的介绍)
int tarSize = SIZE + 1;
subAreaNode *p = subHead.nxt;
while(p != NULL)
{ //寻找最佳空闲区间
if(p->state == Free && p->size >= size && p->size < tarSize) {
tar = p;
struct subAreaNode {
int addr; //起始地址
int size; //分区大小
int taskId; //作业号
STATE state; //分区状态
subAreaNode *pre; //分区前向指针
subAreaNode *nxt; //分区后向指针
}subHead;
//初始化空闲分区链
(3)最坏适应算法Worst_fit(int,int);流程图(图5)
4.程序的技术路线
本程序采用C语言编写,在windows下的Visual C++中编译,模拟可变分区存储管理方式的内存分配与回收。假定系统的最大内存空间为1000kb,判断是否划分空闲区的最小限值为MINSIZE=5。初始化用户可占用内存区的首地址为0,大小为0B。定义一个结构体及其对象subHead实现内存的分配回收及分配表和空闲表的登记。用最佳分配算法实现动态分配时,调用int bestFit(int taskId, int size)内存分配函数,设定循环条件查找最佳空闲分区,根据找到的空闲区大小和作业大小判断是整个分配给作业还是切割空闲区后再分配给作业,并在“内存分配表”和“空闲分区表”中作登记。调用int freeSubArea(int taskId)函数实现内存的回收。顺序循环“内存分配表”找到要回收的作业,设置标志位flag,当flag=1时表示回收成功。回收内存时需考虑内存的4种合并方式,即合并上下分区、合并上分区、合并下分区、上下分区都不合并。
本课题要求模拟实现分区式主存管理机制。模拟实现各种分区管理方法以及相应的主存分配以及回收算法。
2、目的
通过该课题进一步加深对可变分区存储机制的理解。加深对存储器动态分区分配算法的认识。掌握“首次适应算法”、“下次适应算法”、“最佳适应算法发”、“最坏适应算法”的内存分配过程。掌握内存的回收策略。
二、课题任务描述
6)void showSubArea():显示空闲分区链情况。包括起始地址 ,空间大小 。工作状态 。作业号。
7)int main():主函数,主要用于显示操作界面,调用各个子函数等功能。
3、主要功能的流程图
(1)首次适应算法First_fit(int,int);流程图(图3)
(2)最佳适应算法Best_fit(int,int);流程图(图4)
tar->taskId = taskId;
}
printf("内存分配成功!\n");
return 1;
} else {
//找不到合适的空闲分区
printf("找不到合适的内存分区,分配失败...\n");
return 0;
}
}
int worstFit(int taskId, int size)
{
subAreaNode *tar = NULL;
五、带有详细注解的源程序
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
#define SIZE 1000 //内存初始大小
#define MINSIZE 5 //碎片最小值
enum STATE { Free, Busy };
static int ss=0,ee=0;
2、最佳适应算法(best fit)
所谓“最佳”是指每次为作业分配内存时,总是把能满足要求、又是最小的空闲分区分配给作业,避免“大材小用”。为了加速寻找,该算法要求将所有的空闲分区按其容量以从小到大的顺序形成一空闲分区链。这样,第一次找到的能满足要求的空闲区,必然是最佳的。这样,在存储器中会留下许多难以利用的小空闲区。
tarSize = p->size;
}
p = p->nxt;
}
if(tar != NULL) {
//找到要分配的空闲分区
if(tar->size - size <= MINSIZE) {
//整块分配
tar->state = Busy;
tar->task的区间
//修改分区链节点指针
node->pre = tar;
node->nxt = tar->nxt;
if(tar->nxt != NULL) {
tar->nxt->pre = node;
}
tar->nxt = node;
//分配空闲区间
tar->size = size;
tar->state = Busy;
以下是一些常用的函数:dec 置基数为10 相当于"%d";hex 置基数为16 相当于"%X";oct 置基数为8 相当于"%o";setw(n) 设域宽为n个字符
四、课题设计:总体结构、所使用的数据结构、主要功能的流程图、程序的技术路线
1、总体结构
本系统采用了首次适应算法、最佳适应算法和最坏适应算法模拟存储器动态分区。系统利用其中某种分配算法,从空闲分区链中找到满足请求内存大小的分区并分配内存给作业。假设总的内存大小为size,作业请求的内存大小为request,内存碎片最小为f。当request>size时,内存溢出,出现系统错误;当request<=size时,在内存中根据上述算法寻找最佳的内存分区分配给作业。寻找到合适的内存分区之后,如果size-request<=f,将此分区上的内存全部分配给作业;如果size-request>f,就在此分区上分割request大小的内存给作业,剩余内存继续留在当前的分区中。当进程运行完毕,系统找到该进程并释放其内存,根据所释放内存的位置对内存进行合并。