存储器管理实验报告

合集下载

存储管理实验报告

存储管理实验报告

实验三、存储管理一、实验目的:? 一个好的计算机系统不仅要有一个足够容量的、存取速度高的、稳定可靠的主存储器,而且要能合理地分配和使用这些存储空间。

当用户提出申请存储器空间时,存储管理必须根据申请者的要求,按一定的策略分析主存空间的使用情况,找出足够的空闲区域分配给申请者。

当作业撤离或主动归还主存资源时,则存储管理要收回作业占用的主存空间或归还部分主存空间。

主存的分配和回收的实现虽与主存储器的管理方式有关的,通过本实验理解在不同的存储管理方式下应怎样实现主存空间的分配和回收。

在计算机系统中,为了提高主存利用率,往往把辅助存储器(如磁盘)作为主存储器的扩充,使多道运行的作业的全部逻辑地址空间总和可以超出主存的绝对地址空间。

用这种办法扩充的主存储器称为虚拟存储器。

通过本实验理解在分页式存储管理中怎样实现虚拟存储器。

在本实验中,通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。

熟悉虚存管理的各种页面淘汰算法通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。

二、实验题目:设计一个可变式分区分配的存储管理方案。

并模拟实现分区的分配和回收过程。

对分区的管理法可以是下面三种算法之一:(任选一种算法实现)首次适应算法循环首次适应算法最佳适应算法三.实验源程序文件名:cunchuguanli.c执行文件名:cunchuguanli.exe四、实验分析:1)本实验采用可变分区管理,使用首次适应算法实现主存的分配和回收1、可变分区管理是指在处理作业过程中建立分区,使分区大小正好适合作业的需求,并且分区个数是可以调整的。

当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入,作业等待。

随着作业的装入、完成,主存空间被分成许多大大小小的分区,有的分区被作业占用,而有的分区是空闲的。

为了说明那些分区是空闲的,可以用来装入新作业,必须有一张空闲说明表? 空闲区说明表格式如下:?第一栏第二栏其中,起址——指出一个空闲区的主存起始地址,长度指出空闲区的大小。

存储器管理实验实验报告

存储器管理实验实验报告

存储器管理实验实验报告一、实验目的存储器管理是操作系统的重要组成部分,本次实验的目的在于深入理解存储器管理的基本原理和方法,通过实际操作和观察,掌握存储器分配与回收的算法,以及页面置换算法的实现和性能评估。

二、实验环境本次实验使用的操作系统为 Windows 10,编程语言为 C++,开发工具为 Visual Studio 2019。

三、实验内容与步骤(一)存储器分配与回收算法实现1、首次适应算法(1)原理:从空闲分区链的首地址开始查找,找到第一个满足需求的空闲分区进行分配。

(2)实现步骤:建立空闲分区链表,每个节点包含分区的起始地址、大小和状态(已分配或空闲)。

当有分配请求时,从链表头部开始遍历,找到第一个大小满足需求的空闲分区。

将该分区进行分割,一部分分配给请求,剩余部分仍作为空闲分区留在链表中。

若找不到满足需求的空闲分区,则返回分配失败。

2、最佳适应算法(1)原理:从空闲分区链中选择与需求大小最接近的空闲分区进行分配。

(2)实现步骤:建立空闲分区链表,每个节点包含分区的起始地址、大小和状态。

当有分配请求时,遍历整个链表,计算每个空闲分区与需求大小的差值。

选择差值最小的空闲分区进行分配,若有多个差值相同且最小的分区,选择其中起始地址最小的分区。

对选中的分区进行分割和处理,与首次适应算法类似。

3、最坏适应算法(1)原理:选择空闲分区链中最大的空闲分区进行分配。

(2)实现步骤:建立空闲分区链表,每个节点包含分区的起始地址、大小和状态。

当有分配请求时,遍历链表,找到最大的空闲分区。

对该分区进行分配和处理。

(二)页面置换算法实现1、先进先出(FIFO)页面置换算法(1)原理:选择在内存中驻留时间最久的页面进行置换。

(2)实现步骤:建立页面访问序列。

为每个页面设置一个进入内存的时间戳。

当发生缺页中断时,选择时间戳最早的页面进行置换。

2、最近最久未使用(LRU)页面置换算法(1)原理:选择最近一段时间内最长时间未被访问的页面进行置换。

操作系统存储器管理实验报告.doc

操作系统存储器管理实验报告.doc

一目的与要求(1) 请求页式虚存管理是常用的虚拟存储管理方案之一。

(2) 通过请求页式虚存管理中对页面置换算法的模拟,加深理解虚拟存储技术的特点。

(3) 模拟页式虚拟存储管理中硬件的地址转换和缺页中断,并用先进先出调度算法(FIFO)处理缺页中断.二实验内容或题目(1)本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO和LRU算法进行页面置换的情形。

(2)虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。

(3)要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。

(4)程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。

三实验步骤与源程序(1)实验步骤1、理解好相关实验说明。

2、根据实验说明,画出相应的程序流程图。

3、按照程序流程图,用C语言编程并实现。

(2)流程图如下:①虚页和实页结构在虚页结构中,pn代表虚页号,因为共10个虚页,所以pn的取值范围是0—9。

pfn代表实页号,当一虚页未装入实页时,此项值为-1;当该虚页已装入某一实页时,此项值为所装入的实页的实页号pfn。

time项在FIFO算法中不使用,在LRU中用来存放对该虚页的最近访问时间。

在实页结构中中,pn代表虚页号,表示pn所代表的虚页目前正放在此实页中。

pfn代表实页号,取值范围(0—n-1)由动态指派的实页数n所决定。

next是一个指向实页结构体的指针,用于多个实页以链表形式组织起来,关于实页链表的组织详见下面第4点。

②程序流程图如下:(3)源程序如下:#include<iostream.h>#define M 40int N;struct Pro{int num,time;};int Input(int m,Pro p[M]){cout<<"请输入实际页数:";do{cin>>m;if(m>M)cout<<"数目太多,请重试"<<endl;else break;}while(1);//cout<<"请输入各页面号:";for(int i=0;i<m;i++){cout<<"第"<<i<<"个页面号为:";cin>>p[i].num;p[i].time=0;}return m;}void print(Pro *page1)//打印当前的页面{Pro *page=new Pro[N];page=page1;for(int i=0;i<N;i++)cout<<page[i].num<<" ";cout<<endl;}int Search(int e,Pro *page1 ){Pro *page=new Pro[N];page=page1;for(int i=0;i<N;i++)if(e==page[i].num)return i; return -1;}int Max(Pro *page1){Pro *page=new Pro[N];page=page1;int e=page[0].time,i=0;while(i<N)//找出离现在时间最长的页面{if(e<page[i].time)e=page[i].time;i++;}for( i=0;i<N;i++)if(e==page[i].time)return i;return -1;}int Compfu(Pro *page1,int i,int t,Pro p[M]){Pro *page=new Pro[N];page=page1;int count=0;for(int j=i;j<M;j++){if(page[t].num==p[j].num )break;else count++;}return count;}int main(){cout<<"可用内存页面数:";cin>>N;Pro p[M];Pro *page=new Pro[N];char c;int m=0,t=0;float n=0;m=Input(m,p);do{for(int i=0;i<N;i++)//初试化页面基本情况{page[i].num=0;page[i].time=2-i;}i=0;cout<<"************************"<<endl;cout<<"*****f:FIFO页面置换*****"<<endl;cout<<"*****l:LRU页面置换******"<<endl;cout<<"*****o:OPT页面置换******"<<endl;cout<<"*****按其它键结束*******"<<endl;cout<<"************************"<<endl;cout<<"请选择操作类型(f,l,o):";cin>>c;if(c=='f')//FIFO页面置换{n=0;cout<<"页面置换情况: "<<endl;while(i<m){if(Search(p[i].num,page)>=0)i++;//找到相同的页面else{if(t==N)t=0;else{n++;//page[t].num=p[i].num;print(page);t++;}}}cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl; }if(c=='l')//LRU页面置换{ n=0;cout<<"页面置换情况: "<<endl;while(i<m){int k;k=t=Search(p[i].num,page);if(t>=0)page[t].time=0;else{n++;t=Max(page);page[t].num=p[i].num;page[t].time=0;}if(t==0){page[t+1].time++;page[t+2].time++;}if(t==1){page[2].time++;page[0].time++;}if(t==2){page[1].time++;page[0].time++;}if(k==-1) print(page); i++;}cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl;}if(c=='o')//OPT页面置换{n=0;while(i<m){if(Search(p[i].num,page)>=0)i++;else{int temp=0,cn;for(t=0;t<N;t++){if(temp<Compfu(page,i,t,p)){temp=Compfu(page,i,t,p); cn=t;}}page[cn]=p[i];n++;print(page);i++;}}cout<<"缺页次数:"<<n<<" 缺页率:"<<n/m<<endl; }}while(c=='f'||c=='l'||c=='o');return 0;});四测试数据与实验结果五结果分析与实验体会通过上机,我了解了许多关于操作系统的专业知识。

存储管理实验报告

存储管理实验报告

存储管理实验报告存储管理实验报告引言:存储管理是计算机系统中非常重要的一部分,它负责管理计算机系统中的存储资源,包括内存和外存。

合理的存储管理能够提高计算机系统的性能和效率,保证系统的稳定运行。

本次实验旨在通过实践操作,深入了解存储管理的原理和方法,并通过实验结果分析,探讨存储管理的优化策略。

一、实验目的本次实验的主要目的是通过实践操作,深入了解存储管理的原理和方法,并通过实验结果分析,探讨存储管理的优化策略。

具体目标如下:1. 了解存储管理的基本概念和原理;2. 掌握存储管理的常用方法和技术;3. 分析实验结果,探讨存储管理的优化策略。

二、实验环境本次实验使用了一台配置较高的计算机,具备较大的内存和高速的硬盘。

实验环境如下:1. 操作系统:Windows 10;2. 内存:16GB;3. 硬盘:1TB。

三、实验过程1. 内存管理实验在内存管理实验中,我们使用了一段较大的程序代码进行测试。

首先,我们通过编程语言将程序代码写入内存中,然后通过内存管理技术将程序代码加载到内存的合适位置。

在加载过程中,我们使用了分页和分段两种常用的内存管理技术,并比较了它们的性能差异。

实验结果显示,分页技术相对来说更加高效,能够更好地利用内存资源,提高系统的运行速度。

2. 外存管理实验在外存管理实验中,我们模拟了大文件的读写操作。

首先,我们将一个较大的文件写入硬盘中,然后通过外存管理技术将文件加载到内存中进行读取。

在加载过程中,我们使用了磁盘调度算法和文件系统管理技术,并比较了它们的性能差异。

实验结果显示,磁盘调度算法的选择对系统的读写速度有较大的影响,而文件系统的合理管理能够提高文件的存取效率。

四、实验结果分析通过对实验结果的分析,我们可以得出以下结论:1. 内存管理中,分页技术相对于分段技术更加高效,能够更好地利用内存资源,提高系统的运行速度;2. 外存管理中,磁盘调度算法的选择对系统的读写速度有较大的影响,合理选择磁盘调度算法能够提高系统的性能;3. 文件系统的合理管理能够提高文件的存取效率,减少文件的碎片化,提高系统的整体性能。

存储管理 实验报告

存储管理 实验报告

存储管理实验报告存储管理实验报告一、引言存储管理是计算机系统中一个非常重要的组成部分,它负责管理计算机内存的分配、回收和保护。

本次实验旨在通过实际操作,深入理解存储管理的原理和技术,并探索不同的存储管理策略对系统性能的影响。

二、实验目的1. 理解存储管理的基本概念和原理;2. 掌握常见的存储管理算法和策略;3. 分析不同存储管理策略对系统性能的影响。

三、实验环境本次实验使用了一台配置较低的个人电脑,操作系统为Windows 10,内存容量为4GB。

四、实验内容1. 静态分区分配算法静态分区分配算法是最简单的存储管理算法之一。

在实验中,我们使用了最先适应算法(First Fit)和最佳适应算法(Best Fit)进行静态分区分配。

通过对比两种算法的分配效果,我们发现最佳适应算法在减少内存碎片方面表现更好。

2. 动态分区分配算法动态分区分配算法是一种更加灵活的存储管理策略。

在实验中,我们实现了首次适应算法(First Fit)和最佳适应算法(Best Fit)两种动态分区分配算法。

通过观察不同算法的分配效果,我们发现首次适应算法在处理大量小内存块时效率较高,而最佳适应算法在处理大内存块时表现更好。

3. 页面置换算法页面置换算法是虚拟内存管理中的重要组成部分。

在实验中,我们实现了最近最少使用(LRU)算法和先进先出(FIFO)算法两种页面置换算法。

通过模拟内存不足的情况,我们观察了不同算法对系统性能的影响。

结果显示,LRU算法在减少页面置换次数方面比FIFO算法更为优秀。

五、实验结果与分析通过本次实验,我们对不同的存储管理算法和策略进行了实际操作,并观察了它们对系统性能的影响。

实验结果显示,最佳适应算法在静态分区分配中表现更好,而首次适应算法在动态分区分配中效率更高。

在页面置换算法中,LRU 算法在减少页面置换次数方面更为出色。

六、实验总结本次实验通过实际操作,深入理解了存储管理的原理和技术,并探索了不同的存储管理策略对系统性能的影响。

存储器管理实验报告

存储器管理实验报告

操作系统实验报告存储器管理学院电信学院专业计算机科学与技术班级14级计科一班实验题目动态分区分配实验组别第三组指导老师曹华了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。

二、实验内容用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程 alloc() 和回收过程 free()。

其中,空闲分区通过分区链来管理,在进行内存分配时,系统优先使用空闲区低端的空间。

请分别用首次适应算法和最佳适应算法进行内存块的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况。

三、实验主要仪器设备软件环境:VC++6编程环境四、实验原理及设计方案1.实验原理:可变分区调度算法有:最先适应分配算法,循环首次适应算法,最佳适应算法,最坏适应算法。

首次适应算法(First-fit):当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。

只要找到第一个足以满足要求的空闲块就停止查找,并把它分配出去;如果该空闲空间与所需空间大小一样,则从空闲表中取消该项;如果还有剩余,则余下的部分仍留在空闲表中,但应修改区分大小和分区始址。

用户提出内存空间的申请:系统根据申请者的要求,按照一定的分配策略分析内存空间的使用情况,找出能满足请求的空闲区,分给申请者;当程序执行完毕或主动归还内存资源时,系统要收回它所占用的内存空间或它归还的部分内存空间。

最佳适应算法(Best-fit):当要分配内存空间时,就查找空闲表中满足要求的空闲块,并使得剩余块是最小的。

然后把它分配出去,若大小恰好合适,则直按分配;若有剩余块,则仍保留该余下的空闲分区,并修改分区大小的起始地址。

内存回收:将释放作业所在内存块的状态改为空闲状态,删除其作业名,设置为空,并判断该空闲块是否与其他空闲块相连,若释放的内存空间与空闲块相连时,则合并为同一个空闲块,同时修改分区大小及起始地址。

每当一个进程被创建时,内存分配程序首先要查找空闲内存分区链,从中寻找一个合适的空闲块进行划分,并修改空闲内存分区链,系统根据回收区的首址,从空闲区链中找到相应的插入点,此时出现如下四种情况:(1) 回收区与插入点的前一个空闲区F1相邻接,此时可将回收区直接与F1合并,并修改F1的大小;(2) 回收区与插入点的后一个空闲分区F2相邻接,此时可将回收区直接与F2合并,并用回收区的首址作为新空闲区的首址,大小为二者之和;(3) 回收区同时与插入点的前后两个空闲分区邻接,此时需将三者合并;(4) 回收区不与任何一个空闲区邻接,此时应建一新的表项2.主要数据结构的说明定义一个空闲区说明表结构struct freearea {int ID; //分区号long size;//分区大小long address;//分区地址int state; //状态}ElemType;线性表的双向链表存储结构Struct DuLNode//double linked list{ElemType data;struct DuLNode *prior; //前趋指针struct DuLNode *next; //后继指针}DuLNode,*DuLinkList;算法;首次适应算法:是在分配内存时,从链首开始顺序查找,直到找到一个大小能够满足要求的分区,即进行分配。

存储器管理实验报告

存储器管理实验报告

存储器管理实验报告#include //首次适应算法#include#includeusing namespace std;typedef struct JOB{char JobName[10];int needTime;int needMemorrizes;int status;JOB *next;} JobProgram;JobProgram *head,*Program,*p;typedef struct memorrizesElement1{int memorrizes;}memorrizesElement;memorrizesElement element[3];void initMemorry(){for (int i = 0; i<3; i++)element[i].memorrizes = 5;}int searchAndJudge(JobProgram *JP){for (int i = 0; i<3; i++){if (element[i].memorrizes >= JP->needMemorrizes)return i;}return -1;}void intput(){Program = new JobProgram; cout<<"请输入作业名称: "; cin>>Program->JobName;cout<<"请输入作业需要时间: "; cin>>Program->needTime;cout<<"请输入作业需要内存数: "; cin>>Program->needMemorrizes; Program->status = -1;if (head == NULL){p = head;head = Program;p = Program;head->next = NULL;}else{p->next = Program;p = Program;p->next = NULL;}}void MoveMemorryManaging() {// JobProgram *q;JobProgram *ppp = head;JobProgram *pre;while (ppp!=NULL){int k = searchAndJudge(ppp);if (ppp->status ==-1){if (k!=-1){if (ppp->needMemorrizes <= 5){//element[k].flag = 1;element[k].memorrizes -= ppp->needMemorrizes;ppp->status = k;cout<<"作业正在运行: "<<endl;< p="">cout<<"作业名字: "<JobName<<endl<<"作业需要时间: "<needTime<<endl<<"作业状态: "<status<<endl;< p=""> ppp->needTime--;if (ppp->needTime==0){if (ppp == head){JobProgram *s = head;head = head->next;element[s->status].memorrizes += s->needMemorrizes;delete s;}else{JobProgram *s = ppp;pre->next = ppp->next;element[s->status].memorrizes += s->needMemorrizes;delete s;ppp = pre;}}}else{cout<<"你输入的内存需要大小超过了固定分区每个块的大小,无法装入运行"<<="">exit(1);}}else{cout<<"作业就绪: "<<endl;< p="">cout<<"作业名字: "<JobName<<endl<<"作业需要时间: "<needTime<<endl<<"作业状态: "<status<<endl;< p=""> }}else{cout<<"作业正在运行: "<<endl;< p="">cout<<"作业名字: "<JobName<<endl<<"作业需要时间: "<needTime<<endl<<"作业状态: "<status<<endl;< p=""> ppp->needTime--;if (ppp->needTime==0){if (ppp == head){JobProgram *s = head;head = head->next;element[s->status].memorrizes += s->needMemorrizes; delete s;}else{JobProgram *s = ppp;pre->next = ppp->next;element[s->status].memorrizes += s->needMemorrizes; delete s;ppp = pre;}}}pre = ppp;ppp = ppp->next;}}int main(){int n;cout<<"请输入要执行的作业的个数: ";cin >> n;initMemorry();for (int i = 0; i<="" p="">intput();while(head)MoveMemorryManaging();return 0;}</endl;<></endl<<"作业状态:></endl<<"作业需要时间:> </endl;<></endl;<></endl<<"作业状态:></endl<<"作业需要时间:> </endl;<></endl;<></endl<<"作业状态:></endl<<"作业需要时间:> </endl;<>。

存储器管理实验报告

存储器管理实验报告

存储器管理实验报告1. 实验目的本实验旨在通过实际操作,学习和理解存储器管理的基本概念和原理,并通过编写代码来实现常见的存储器管理算法。

2. 实验背景存储器管理是计算机系统中的重要组成部分,它负责管理和分配计算机的内存资源。

在计算机系统中,内存分为多个不同的区域,每个区域用于存储不同类型的数据。

存储器管理的主要任务是有效地管理和分配这些内存资源,以满足程序的需求,并保证系统的稳定性和高效性。

3. 实验步骤本实验共分为以下几个步骤:步骤一:了解存储器管理的基本概念在开始实验之前,我们首先需要了解存储器管理的基本概念。

包括内存分区、内存分配算法、内存回收算法等。

步骤二:设计实验代码根据实验要求,我们需要编写代码来实现常见的存储器管理算法。

可以选择使用C、C++等编程语言来实现。

步骤三:实验代码测试完成代码编写后,我们需要对代码进行测试,以验证其正确性和可行性。

可以编写一些测试样例来测试不同的存储器管理算法。

步骤四:实验结果分析根据实验的结果,我们可以对不同的存储器管理算法进行比较和分析,评估其优劣和适用性。

步骤五:实验总结在实验结束后,我们可以对实验过程和结果进行总结,总结实验中所学到的知识和经验,并提出改进的建议。

4. 实验总结通过本次实验,我深入了解了存储器管理的基本概念和原理,并通过编写代码实现了常见的存储器管理算法。

实验过程中,我遇到了一些问题,但通过查阅相关文献和资料,最终解决了这些问题。

通过实验,我不仅加深了对存储器管理的理解,还提高了编程能力和问题解决能力。

5. 改进建议在实验过程中,我发现代码实现的效率还有待提高,可以进一步优化算法的设计和实现。

此外,可以扩展实验内容,研究更多的存储器管理算法,并进行比较和分析。

参考文献•[1] 《操作系统教程》•[2] 《计算机体系结构》•[3] 《操作系统原理》。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

操作系统实验报告存储器管理学院电信学院专业计算机科学与技术班级 14级计科一班实验题目动态分区分配实验组别第三组指导老师曹华一、实验目的了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。

二、实验内容用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。

其中,空闲分区通过分区链来管理,在进行内存分配时,系统优先使用空闲区低端的空间。

请分别用首次适应算法和最佳适应算法进行内存块的分配和回收,要求每次分配和回收后显示出空闲内存分区链的情况。

三、实验主要仪器设备软件环境:VC++6编程环境四、实验原理及设计方案1.实验原理:可变分区调度算法有:最先适应分配算法,循环首次适应算法,最佳适应算法,最坏适应算法。

首次适应算法(First-fit):当要分配内存空间时,就查表,在各空闲区中查找满足大小要求的可用块。

只要找到第一个足以满足要求的空闲块就停止查找,并把它分配出去;如果该空闲空间与所需空间大小一样,则从空闲表中取消该项;如果还有剩余,则余下的部分仍留在空闲表中,但应修改区分大小和分区始址。

用户提出内存空间的申请:系统根据申请者的要求,按照一定的分配策略分析内存空间的使用情况,找出能满足请求的空闲区,分给申请者;当程序执行完毕或主动归还内存资源时,系统要收回它所占用的内存空间或它归还的部分内存空间。

最佳适应算法(Best-fit):当要分配内存空间时,就查找空闲表中满足要求的空闲块,并使得剩余块是最小的。

然后把它分配出去,若大小恰好合适,则直按分配;若有剩余块,则仍保留该余下的空闲分区,并修改分区大小的起始地址。

内存回收:将释放作业所在内存块的状态改为空闲状态,删除其作业名,设置为空,并判断该空闲块是否与其他空闲块相连,若释放的内存空间与空闲块相连时,则合并为同一个空闲块,同时修改分区大小及起始地址。

每当一个进程被创建时,内存分配程序首先要查找空闲内存分区链,从中寻找一个合适的空闲块进行划分,并修改空闲内存分区链,系统根据回收区的首址,从空闲区链中找到相应的插入点,此时出现如下四种情况:(1)回收区与插入点的前一个空闲区F1相邻接,此时可将回收区直接与F1合并,并修改F1的大小;(2)回收区与插入点的后一个空闲分区F2相邻接,此时可将回收区直接与F2合并,并用回收区的首址作为新空闲区的首址,大小为二者之和;(3)回收区同时与插入点的前后两个空闲分区邻接,此时需将三者合并;(4)回收区不与任何一个空闲区邻接,此时应建一新的表项2.主要数据结构的说明定义一个空闲区说明表结构struct freearea {int ID; //分区号long size; //分区大小long address; //分区地址int state; //状态}ElemType;线性表的双向链表存储结构Struct DuLNode//double linked list{ElemType data;struct DuLNode *prior; //前趋指针struct DuLNode *next; //后继指针}DuLNode,*DuLinkList;算法;首次适应算法:是在分配内存时,从链首开始顺序查找,直到找到一个大小能够满足要求的分区,即进行分配。

最佳适应算法:是在分配内存时,从链首开始顺序查表,查找到链尾,并记录一个大小不小于要求的分区的最小分区,在查找完毕后进行分配。

3.程序流程图首次适应算法最佳适应算法4.实验程序首次适应算法#include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #define N 10000 int n1;//空闲分区的个数int n2;//作业区的个数struct kongxian{int start; //起址int end; //结束int length; //长度}kongxian[N];struct zuoye{int start; //起址int end; //结束int length; //长度}zuoye[N];int cmp1(const void *a,const void *b){return (*(struct kongxian *)a).start-(*(struct kongxian *)b).start;}int cmp2(const void *a,const void *b){return (*(struct zuoye *)a).start-(*(struct zuoye *)b).start;}void init(){n1=1; //初始时只有一个空闲区n2=0; //初始没有作业kongxian[0].start=0;kongxian[0].end=1023;kongxian[0].length=1024;}void print1() //打印空闲分区{int i;for(i=0;i<n1;i++)printf("空闲分区ID:%d 起止:%d 结束:%d 长度:%d\n",i,kongxian[i].start,kongxian[i].end,k ongxian[i].length);}void print2() //打印作业分区{int i;for(i=0;i<n2;i++)printf("作业分区ID:%d 起止:%d 结束:%d 长度:%d\n",i,zuoye[i].start,zuoye[i].end,zuoye[i] .length);}int main(){int i,j,t,len,flag,id;int front,middle, behind;int t1,t2;init();print1();printf("输入1装入新作业,输入0回收作业,输入-1结束\n");while(scanf("%d",&t)!=EOF){if(t==1) //装入新作业{printf("请输入作业的占用空间的长度");scanf("%d",&len);flag=0;for(i=0;i<n1;i++){if(kongxian[i].length>=len) //首次适应算法{flag=1;break;}}if(!flag){printf("内存分配失败\n");}else{zuoye[n2].start=kongxian[i].start;zuoye[n2].end=zuoye[n2].start+len;zuoye[n2].length=len;n2++; //作业数加1if(kongxian[i].length==len) //该分区全部用于分配,删除该空闲分区{for(j=i;j<n1-1;j++){kongxian[j].start=kongxian[j+1].start; kongxian[j].end=kongxian[j+1].end; kongxian[j].length=kongxian[j+1].length;}n1--;}else //该空闲分区部分用于分配,剩余的留在空闲分区中{kongxian[i].start+=len;kongxian[i].length-=len;}}}else if(t==0){printf("输入要回收的作业ID ");scanf("%d",&id);front=middle=behind=0;for(i=0;i<n1;i++){if(kongxian[i].start>zuoye[id].end)break;if(kongxian[i].end==zuoye[id].start) //待回收的作业上面有空闲分区{front=1;t1=i;}if(kongxian[i].start>zuoye[id].end){behind=1;t2=i;}}if(!front&&!behind){kongxian[n1].start=zuoye[id].start;kongxian[n1].end=zuoye[id].end;kongxian[n1].length=zuoye[id].length;n1++;qsort(kongxian,n1,sizeof(struct kongxian),cmp1);for(j=id;j<n2-1;j++){zuoye[j].start=kongxian[j+1].start;zuoye[j].end=zuoye[j+1].end;zuoye[j].length=zuoye[j+1].length;}n2--;}if(front&&behind)middle=1;if(front&&!behind){kongxian[t1].end+=zuoye[id].length;kongxian[t1].length+=zuoye[id].length;for(j=id;j<n2-1;j++){zuoye[j].start=zuoye[j+1].start;zuoye[j].end=zuoye[j+1].end;zuoye[j].length=zuoye[j+1].length;}n2--;}if(middle){kongxian[t1].end=kongxian[t2].end;kongxian[t1].length+=(zuoye[id].length+ko ngxian[t2].length);for(j=t2;j<n1-1;j++){kongxian[j].start=kongxian[j+1].start;kongxian[j].end=kongxian[j+1].end;kongxian[j].length=kongxian[j+1].length;}n1--;for(j=id;j<n2-1;j++){zuoye[j].start=kongxian[j+1].start;zuoye[j].end=zuoye[j+1].end;zuoye[j].length=zuoye[j+1].length;}n2--;}if(front&&!behind){kongxian[t1].end-=zuoye[id].length;kongxian[t1].length+=zuoye[id].length;for(j=id;j<n2-1;j++){zuoye[j].start=zuoye[j+1].start; zuoye[j].end=zuoye[j+1].end; zuoye[j].length=zuoye[j+1].length;}n2--;}}else{printf("操作结束\n");break;}print1();print2();}return 0;}最佳适应算法#include<stdio.h>#include<string.h>#include<stdlib.h>#include<math.h>struct kongkuai{ int startaddr;int size;int flag;}kongxq[6]={{10,30,1},{100,60,1},{200,80,1},{3 00,60,1},{400,180,1},{700,200,1}};int allocate(int jobsize){int i;int t=0;for(i=0;i<6;i++)if(kongxq[i].flag==1&&kongxq[i].size>job size){kongxq[i].startaddr+=jobsize;kongxq[i].size-=jobsize;t=1;returnkongxq[i].startaddr-jobsize;}elseif(kongxq[i].flag==1&&kongxq[i].size==jo bsize){kongxq[i].flag=0;t=1;returnkongxq[i].startaddr;}if(t==0)return 0;return 1;}void circle(){int i,j;struct kongkuai temp;for(i=0;i<6;i++)for(j=0;j<6;j++)if(kongxq[j].size>kongxq[j+1].size){temp.startaddr=kongxq[j].startaddr;temp.size=kongxq[j].size;temp.flag=kongxq[j].flag;kongxq[j].startaddr=kongxq[j+1].startadd r;kongxq[j].size=kongxq[j+1].size;kongxq[j].flag=kongxq[j+1].flag;kongxq[j+1].startaddr=temp.startaddr;kongxq[j+1].size=temp.size;kongxq[j+1].flag=temp.flag;}for(i=0;i<6;i++)for(j=0;j<6;j++)if(kongxq[j].flag==0&&kongxq[j+1].flag== 1){temp.startaddr=kongxq[j].startaddr;temp.size=kongxq[j].size;temp.flag=kongxq[j].flag;kongxq[j].startaddr=kongxq[j+1].startadd r;kongxq[j].size=kongxq[j+1].size;kongxq[j].flag=kongxq[j+1].flag;kongxq[j+1].startaddr=temp.startaddr;kongxq[j+1].size=temp.size;kongxq[j+1].flag=temp.flag;}}void callback(){int s,len,t1=0,t2=0,t3=0,i,j;printf("请输入回收区的起始地址:\n");scanf("%d",&s);printf("请输入回收区的大小:\n");scanf("%d",&len);for(i=0;i<6;i++){if((kongxq[i].startaddr==s+len)&&(kongxq[i].fl ag==1)){len+=kongxq[i].size;t1=1;for(j=0;j<6;j++)if((kongxq[j].startaddr+kongxq[j].size==s) &&(kongxq[j].flag==1)){kongxq[i].flag=0;kongxq[j].size=kongxq[j+1].size+len;t2=1;break;}if(t2==0){kongxq[i].startaddr=s;kongxq[i].size=len;break;}}}if(t1==0){for(i=0;i<6;i++){if((kongxq[i].startaddr+kongxq[i].size==s) &&(kongxq[i].flag==1)){kongxq[i].size+=len;t3=1;break;}if(t3==0)for(j=0;j<6;j++)if(kongxq[j].flag==0){kongxq[j].startaddr=s;kongxq[j].size=len;kongxq[j].flag=1;break;}}}}void print(){int i;printf("\n 起始地址| 大小|是否空闲\n\n");for(i=0;i<6;i++){printf(" %3d | %3d | %3d \n",kongxq[i].startaddr,kongxq[i].size,kongxq [i].flag);}printf("\n");}main(){int jobsize,start;char end;printf("\n是否有作业请求空闲区?Y or N:");while(end=getchar()=='y'){printf("初始空闲区状态:\n");circle();print();printf("请输入请求空闲区的作业大小:");scanf("%d",&jobsize);start=allocate(jobsize);circle();printf("分配后空闲区状态:\n");print();if(!start)printf("没有适合的空闲区大小!\n");elseprintf("作业起始地址: %d\n",start);printf("作业大小: %d\n",jobsize);callback();print();printf("是否有其他作业的请求? Y or N:");end=getchar();}return 0;}五、算法及运行结果及分析1.运行结果:首次适应算法最佳适应算法2.实验总结:通过运行内存分配和回收模拟的程序对内存管理理解加深了,在动态分区管理方式中,能灵活地根据作业需要,动态地为之分配内存空间,其中关键是分区分配算法,一旦内存块使用完毕,可以回收给系统以分配给其他的作业使用。

相关文档
最新文档