实验:可变分区存储管理
操作系统实验-可变分区存储管理

作业一实验一 :可变分区存储管理(一) 实验题目编写一个C 程序,用char *malloc(unsigned size)函数向系统申请一次内存空间(如size=1000,单位为字节),模拟可变分区内存管理,实现对该内存区的分配和释放管理。
(二) 实验目的1.加深对可变分区的存储管理的理解;2.提高用C 语言编制大型系统程序的能力,特别是掌握C 语言编程的难点:指针和指针作为函数参数;3.掌握用指针实现链表和在链表上的基本操作。
(三)程序代码 #include<malloc.h> #include<stdio.h> #include<string.h>#define new(type) (type *)malloc(sizeof(type))typedef struct _map {unsigned int size; char *address; struct _map *next; struct _map *prev;(a)(b)(c)(d)图2-9释放区与前后空闲区相邻的情况} map;typedef map *pmap;typedef struct _mem{unsigned int totalSize;char* space;pmap head;pmap cMap;} mem;typedef mem *pmem;pmem createMem(unsigned int to_size) //创建内存区域{pmem newMem=new(mem);pmap newHead=new(map);newMem->totalSize=to_size;newHead->size=to_size;newHead->address=newMem->space;newHead->next=newHead;newHead->prev=newHead;newMem->head=newHead;newMem->cMap=newHead;return newMem;}void freeMem(pmem m){pmap map,cMap;pmap head=m->head;free(map->address);for(map=head;map->next!=head;){cMap=map;map=cMap->next;free(cMap);}free(m);}char* lmalloc(pmem cMem,unsigned int size) //分配函数{if(size>1000){printf("内存容量超出范围!\n"); //当需要分配的内存空间已经大于实际空间时出错}else{pmap p=cMem->cMap;char* rAddr;if(size==0)return NULL;while(p->size<size){if(p->next==cMem->cMap)return NULL;p=p->next;}rAddr=p->address;p->size-=size;p->address+=size;if(p->size==0){p->prev->next=p->next;p->next->prev=p->prev;cMem->cMap=p->next;if(cMem->head==p)cMem->head=p->next;if(p->next!=cMem->head)free(p);}else{cMem->cMap=p;}return rAddr;}}void lfree(pmem m,unsigned int size,char* addr) //释放函数{pmap nextMap,prevMap,newMap;if(addr<m->space || addr>=m->space+m->totalSize){fprintf(stderr,"地址越界\n"); //释放空间时,大小输入出错return;}nextMap=m->head;while(nextMap->address<addr){nextMap=nextMap->next;if(nextMap==m->head)break;}prevMap=nextMap->prev;if(nextMap!=m->head && prevMap->address+prevMap->size==addr) //第一种情况{prevMap->size+=size;if(addr+size==nextMap->address) //第二种情况{prevMap->size+=nextMap->size;prevMap->next=nextMap->next;prevMap->next->prev=prevMap;if(nextMap==m->cMap){m->cMap=prevMap;}free(nextMap);nextMap=NULL;}}else{if(addr+size==nextMap->address) //第三种情况{nextMap->address-=size;nextMap->size+=size;}else //第四种情况{newMap=new(map);newMap->address=addr;newMap->size=size;prevMap->next=newMap;newMap->prev=prevMap;newMap->next=nextMap;nextMap->prev=newMap;if(nextMap==m->head)m->head=newMap;}}}void printMem(pmem m) //打印函数{pmap map=m->head;printf("\空闲内存空间:\n\-----------------------\n\大小起始地址\n");do{if(map==m->cMap)printf("-> ");elseprintf(" ");printf("%10u %10u\n",map->size,map->address);map=map->next;}while(map!=m->head);printf("-----------------------\n");}void main() //主函数{printf("--------------------------------------------------------\n");printf("请选择操作:分配内存(m) or 释放内存(f) or 打印内存表(p)\n");printf("--------------------------------------------------------\n");typedef enum{cmdMalloc,cmdFree,cmdPrint,cmdHelp,cmdQuit,cmdInvalid} cmdType; pmem m=createMem(1000);char cmd[20];char *addr;unsigned int size;cmdType type;while(1){scanf("%s",cmd);if(cmd[1]=='\0'){switch(cmd[0]){case 'm':case 'M':type=cmdMalloc;break;case 'f':case 'F':type=cmdFree;break;case 'p':case 'P':type=cmdPrint;break;}}else{if(!strcmp(cmd,"malloc"))type=cmdMalloc;else if(!strcmp(cmd,"free"))type=cmdFree;else if(!strcmp(cmd,"print"))type=cmdPrint;}switch(type){case cmdMalloc:scanf("%u",&size);lmalloc(m,size);printMem(m);break;case cmdFree:scanf("%u %u",&size,&addr);lfree(m,size,addr);printMem(m);break;case cmdPrint:printMem(m);break;return;}}}(四)程序结果。
实验二 可变分区存储管理

实验二、可变分区存储管理一、实验目的1.加深对可变分区的存储管理的理解;2.提高用C 语言编制大型系统程序的能力,特别是掌握C 语言编程的难点:指针和指针作为函数参数;3.掌握用指针实现链表和在链表上的基本操作。
二、实验内容参照教材P25-P26页内容,编写一个C 程序,用char *malloc(unsigned size)函数向系统申请一次内存空间(如size=1000,单位为字节),用循环首次适应法addr = (char *)lmalloc(unsigned size) 和lfree(unsigned size,char * addr)模拟UNIX 可变分区内存管理,实现对该内存区的分配和释放管理。
三、实验要求分配函数lmalloc 的参数size 和释放函数lfree 的参数size、addr,要以键盘命令的形式输入,每次分配和释放后显示自己的空闲存储区表。
空闲存储区表可采用结构数组的形式(最低要求)或双向链接表的形式,建议采用的数据结构为:struct map{unsigned m_size;char * m_addr;};struct map{unsigned m_size;char *m_addr;struct map *next, *prior;};整个系统的基本框架为程序结束前将整个存储区归还给系统。
四、实验注意事项键盘命令的简单形式如:m[alloc] 100 [enter] 通过lmalloc 函数申请100 字节的内存空间。
f[ree] 100 2567899 [enter] 通过lfree 函数释放起始地址为2567899 的那个内存区,该地址先前通过lmalloc 申请的有效存储区地址。
命令输入可用C语言函数scanf (“%c”, &cmdchar); cmdchar =getchar ( )或scanf (“%s”, &cndstring)后跟scanf (“%u”, &size)或scanf (“%u %u”, &size, &addr)。
实验4:可变分区存储管理

沈阳工程学院学生实验报告(课程名称:操作系统)实验题目:可变分区存储管理班级学号姓名地点f612 指导教师实验日期:一、实验目的通过首次适应算法、最佳适应算法和最坏适应算法实现主存空间的分配,可以使读者可好地理解存储分配算法。
二、实验环境硬件环境:Intel Pentium Processor 1.8G ,512M内存,windows 操作系统软件环境:vc++6.0或Turbo C三、实验内容与要求实验原理:⑴可变分区方式是按作业需要的主存空间大小来分区。
当装入一个作业时,首先要查看是否有足够的空闲空间来分配,若有则按指定的分配方式进行分配;否则作业不能装入。
随着作业的装入和撤离主存空间被分为若干个大大小小的不连续的区间,为了表明各区间的状态可以用一个内存分区表如表1所示来表示。
表1 内存分区表起始地址长度标志120k 20k 作业1200k 50k 空闲这样我们可以定义一个如下的结构表示内存分区信息。
typedef struct node{int start; //起始地址int length; //长度char tag[20]; //标志}job;⑵可变分区的三种算法就是为作业分配主存空间的方法。
●首次适应算法:在空闲区间中查询满足作业需要的空间,并将作业装入第一个满足条件的空间中去。
●最佳适应算法:在空闲区间中查询满足作业需要的空间,并将作业装入满足条件的空闲空间中最小的一个空间中去。
●最坏适应算法:在空闲区间中查询满足作业需要的空间,并将作业装入满足条件的空闲空间中最大的一个空间中去。
从三种算法的说明可以看出,分配空间的过程主要可以分两步:●查询所有满足作业需求的空间块。
●按照指定的算法将作业装入空间块中。
⑶在操作的最初主存空间实际就是一个大的空闲区,不涉及到如何分配的问题。
为直接模拟运行一段时间后主存中出现了多个空闲块的状态,题目要求从一个文件读入空闲区表。
在这里我们可以设计一个空闲区表文件的结构为如表2所示:表2 空闲区表起始地址长度200k 50k……这样也可以方便地将空闲表一次读入程序中,而不必再一个个的输入。
可变分区管理实验

实验三、可变分区内存管理实验环境:实验环境一:Windows平台实验时间:6小时实验目的:体会可变分区内存管理方案,掌握此方案的内存分配过程、内存回收过程和紧凑算法的实现。
实验目标:编制一个程序模拟实现可变分区内存管理。
实验时,假设系统内存容量为1000KB。
分配时使用malloc(pid, length)函数实现,作业释放内存时使用mfree(handle)函数实现,内存情况输出用mlist()函数实现。
实验步骤:1、编写主界面,界面上有三个选项:分配内存、回收内存、查看内存。
选择分配内存时,要求输入作业的进程号和作业长度,然后使用malloc函数分配内存,并报告内存分配结果。
回收内存时要求输入进程号,使用mfree函数实现回收。
查看内存时,使用mlist函数实现输出内存使用情况和空闲情况。
2、编写malloc(pid, length)函数,实现进程pid申请length KB内存,要求程序判断是否能分配,如果能分配,要把分配内存的首地址handle输出到屏幕上。
不能分配则输出字符串“NULL”。
要考虑不能简单分配时,是否符合紧凑的条件,如符合则采用紧凑技术,然后再分配。
分配时可在最佳适应算法、最差适应算法和首次适应算法中任选其一。
3、编写mfree(handle)函数,释放首地址为handle的内存块。
释放成功返回Success,否则返回Failure。
4、编写mlist()函数,要求输出内存使用情况和空闲情况。
输出的格式为:ID Address Length ProcessID 内存分区号Address 该分区的首地址Length 分区长度Process 如果使用,则为使用的进程号,否则为NULL实验结果:实验步骤2的实现过程是:实验步骤2中紧凑算法是如何实现的?实验步骤3中分别要考虑多少种情况?实验步骤3的实现过程是:实验步骤4的实现过程是:实验步骤4的结果是什么?实验报告:(1)完成实验结果中的问题。
可变分区存储管理及可重定位分区存储管理实验报告

可变分区存储管理及可重定位分区存储管理实验报告一、实验目的与要求通过消化理解模拟管理程序,了解存储器的分配与回收过程,体会相关数据结构在实现管理算法中的重要性。
输入一到两组实验数据,观察分配与回收的处理结果,特别是回收时邻接空闲分区的合并处理,检测其算法的正确性。
二、算法思想1、可变分区存储管理(1)算法实现a.分配:查空闲分区链表b.回收:考虑邻接合并(2)实验过程:输入操作命令代码a.分配:输入作业号及作业长度(已建立作业不重复建立)b.回收:输入作业号(不存在作业不释放空间)c .可查看空闲链表情况(检测分配、回收正确性)d.可查看作业表情况(检测分配、回收正确性)2、可重定位分区存储管理在前述可变分区存储管理实验基础上修改实现,即遇大作业存在碎片不够分配时进行合并处理。
注:实现拼接(移动,合并):设立按作业地址排列的有序链表,即用静态链表实现(作业表增加静态链仿真指针),在此基础上按地址从小到大顺序依次向前移动(紧凑处理)。
三、算法实现(可重定位分区存储管理)1、修改相关数据结构(1)作业表增加链接仿真指针int next;分量(2)构造有序静态链表(初始化时next均赋值-1)(3)增加静态链首指针Linkp及空闲总容量计数变量size(注:初始化时Linkp=-1,size=n)2、修改分配函数判断新建立作业长度是否小于等于空闲总容量size值。
若无足够大分区,则先进行合并处理后再分配;若有足够大分区,则按可变分区分配算法处理;若作业长度超过总空闲容量,则产生溢出(无内存)。
3、增加插入排序操作函数(sort_tab())分配新作业空间,则按新作业分区首地址大小,将作业表表项插入静态链表。
回收时,还必须从中删除。
4、增加拼接(移动)操作函数(compact())主要是修改作业表表目内容及空闲分区链表,用模拟操作函数move()进行模拟搬家前移。
5、增加显示静态链表内容的较出操作函数(printsorttab())四、算法流程1、可变分区存储管理(1)主程序(main()函数)(2)分配程序(allocm()函数)(3)回收程序(freem()函数)(4)显示空闲分区链表及作业表程序(printlink()及printtab()函数)注:主程序(main()函数)分配程序(allocm()函数)回收程序(freem()函数)有四种情形(假定回收区首地址=> addr,长度=> length)(1)空闲分区链表空,或不与任何空闲区邻接=> 分配新结点空间,存入回收作业首地址及长度插入空闲分区链(链首,链中,链尾)(2)回收分区与后一空闲分区相邻接=> 进行后邻接合并(3)回首分区与前一空闲分区相邻接(4)回收分区与前同时又与后空闲分区相邻接=> 需进行三个分区合并,并删除一个空闲分区结点注:除了修改空闲分区链表,还要修改作业表(清除flag标志)2、可重定位分区存储管理(1)分配程序(修改allocm()函数)(2)回收程序(修改freem()函数)(3)有序静态链表插入操作程序(sort_tab()函数)(4)拼接(移动)操作程序(compact()函数)(5)输出有序静态链表操作程序(printsorttab()函数)注:分配程序(修改allocm()函数)n,l输出作业已建立提示串,返回内存容量不够,返回置新作业作业表作业地址(分配空间)提示操作者输入新建作业的作业号及长度作业n已建立?l≤size?NYNY分配作业表表项,填入作业长度,置标志为1,总空闲容量减去l查空闲分区链表查到表尾?调用拼接操作函数compact()进行拼接处理Y分区大小=lNYN分区大小>lY修改空闲分区链表(size= l,空闲链为空(一起分配),size> l ,分割分配)作业表表目插入有序静态链表返回切割分配分区空间,修改分区链表作业表表目插入有序静态链表分区整体分配,修改分区链(删除结点)作业表表目插入有序静态链表返回查下一分区N回收程序(修改freem()函数)有序静态链表插入操作程序(sort_tab())拼接(移动)操作程序(compact())五、实验步骤1、可变分区存储管理(1)消化实验算法程序(2)组织上机实验数据(3)第一组:指定(4)第二组:自定(要求能测试各种情形)(5)输入上机程序,编译,运行,记录各操作步骤的运行结果(通过显示空闲分区链表及作业表)2、可重定位分区存储管理(1)阅读相关算法程序(2)组织调试数据(必须包含需合并的操作)(3)上机运行、调试(测试),记录运行情况,分析运行结果六、实验运行情况分析1、可变分区存储管理(1)操作程序1a.分配作业1(80k),作业3(30k),作业8(50k),作业5(140k),作业9(50k),作业6(100k),作业4(50k)b.观察(记录)空闲表及作业表情况c.回收作业8,观察结果d.分配作业7(80k),观察结果e.回收作业6, 回收作业1, 观察结果f分配作业10(120k),观察运行情况g,回收作业7,作业3,作业5,观察各次结果(2)操作程序2a.分配作业1(100k)、作业2(50k)、作业3(50k)、作业4(80k)、作业5(120k),观察结果b.回收作业4c.分配作业6(90k)d.回收作业3 f.分配作业7(140k)2、可重定位分区存储管理(1)操作程序1a.分配作业1(80k),作业3(30k),作业8(50k),作业5(140k),作业9(50k),作业6(100k),作业4(50k)b.观察(记录)空闲表及作业表情况c.回收作业8,观察结果d.分配作业7(80k),观察结果e.回收作业6, 回收作业1, 观察结果f 分配作业10(120k ),观察运行情况g,回收作业7,作业3,作业5,观察各次结果(2)操作程序2a.分配作业1(100k)、作业2(50k)、作业3(50k)、作业4(80k)、作业5(120k),观察结果b.回收作业4c.分配作业6(90k)d.回收作业3 f.分配作业7(140k )七、实验总结通过这次实验,我掌握了可变分区存储管理及可重定位分区存储管理的具体方法,对书本上的理论知识有了更深刻的认识。
实验2:可变分区存储管理

阳工程学院
学生实验报告
(课程名称:操作系统)
实验题目:可变分区存储管理
班级计算机学号姓名
地点F608 指导教师
实验日期: 2017 年 5 月 2 日批阅教师(签字):成绩:
实现过程:
(1)建立文件以a为名字的文件输入如图所示
(2)建立3个空闲分区起始地址和行实现如图所示
(3)显示空闲表和分配表实现如图所示
(4)执行首次算法后,建立的空闲表长度分别为3 8 10,申请一个名为b长度为5的作业故首次适应算法从第二个空闲表首地址为3开始,运行实现如图所示
(5)最佳适应算法,执行首次算法后,建立的空闲表长度分别为3 8 10,申请一个名为c长度为9的作业故最佳适应算法从第二个空闲表首地址为11开始,运行实现如图所示
(6)最坏适应算法,执行首次算法后,建立的空闲表长度分别为3 8 10,申请一个名为d长度为3的作业故最坏适应算法从第二个空闲表首地址为11开始,运行实现如图所示
(7)生成文件a如图所示。
可变分区内存管理实验-题目

可变分区内存管理实习
操作系统实验
1.基本思想
可变分区是指系统不预先划分固定分区,而是在装入程序的时候划分内存区域,使得为程序分配的分区大小恰好等于该程序的需求量,且分区的个数是可变的。
显然可变分区有较大的灵活性,较之固定分区能获得好的内存利用率。
2.数据结构
可变分区管理可以用两种数据结构实现,一种是已分配区表和空闲区表,也就是用预先定义好的系统空间来存放空间分配信息。
另一种也是最常用的就是空闲链表,由于对分区的操作是动态的,所以很难估计数据结构所占用的空间,而且空闲区表会占用宝贵的系统空间,所以提出了空闲链表的概念。
其特点是用于管理分区的信息动态生成并和该分区在物理地址上相邻。
这样由于可以简单用两个空闲块之间的距离定位已分配空间,不仅节约了系统空间,而且不必维护已分配空间的信息。
下图是空闲链表的示意图。
2.实习要求
请实现一个完整的可变分区管理器,包括分配,回收,分区碎片整理等。
希望考虑如下问题:
⏹容错性,当操作出现错误,比如空间不足,空指针引用等的情况下的处理。
⏹空闲块的合并。
⏹已分配空间的跟踪。
当做碎片整理时,需要跟踪分配的空间,修改其引用以保证引用的
正确性。
实验一可变分区存储管理

优点
由于会优先使用更小的空闲区,所以 不会轻易产生大的碎片。
工具介绍
1 2
GCC编译器
用于编译C语言源代码,生成可执行文件。
GDB调试器
用于调试程序,查看程序运行过程中的内存状态、 变量值等信息。
3
Valgrind内存检测工具
用于检测程序中的内存泄漏、越界访问等问题。
实验数据准备
源代码文件
01
实验提供了一份用C语言编写的可变分区存储管理程序的源代码。
测试数据文件
02 可变分区存储管理概述
基本概念
可变分区
在可变分区存储管理中,内存被划分为大小可变的分区,每个分 区可以动态地分配和释放。
分配策略
根据进程的大小和内存的使用情况,选择适当的分配策略,如首次 适应、最佳适应或最差适应等。
分区表
用于记录内存中各个分区的状态、大小、起始地址等信息的数据结 构。
可变分区存储管理的特点
结果分析与讨论
算法优势分析
实验结果表明,本算法在内存分配和 回收过程中具有较高的执行效率和内 存利用率,这主要得益于其采用的先 进的数据结构和算法设计。同时,本 算法还具有良好的稳定性和可扩展性 ,能够适应不同规模的内存管理需求 。
存在问题探讨
尽管本算法在实验中表现出较好的性 能,但仍存在一些需要改进的地方。 例如,在处理大规模内存分配请求时 ,可能会出现性能下降的情况。未来 可以考虑对算法进行进一步优化,提 高其处理大规模请求的能力。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
沈阳工程学院
学生实验报告
(课程名称:操作系统)
实验题目:存储管理1
班级网络本121 学号2012418118 姓名杨挺地点F608 指导教师吕海华祝世东
实验日期: 2014 年 5 月27 日
else
break;
}
switch(n)
{
case 0:printf("感谢您的使用!再见!\n");exit(0);
case 1:view();break;
case 2:earliest();break;
case 3:excellent();break;
case 4:worst();break;
}
system("cls");
}
}
运行结果:
(1)建立3个空闲分区起始地址和行实现如下图所示:
(2)显示空闲表和分配表实现如下图所示:
(3)执行首次算法后,建立的空闲表长度分别为5 6 7,申请一个名为b长度为5的作业故首次适应算法从第二个空闲表首地址为1开始,运行实现如下图所示:
(4)最佳适应算法,执行首次算法后,建立的空闲表长度分别为5 6 7,申请一个名为b长度为7的作业故首次适应算法从第二个空闲表首地址为3开始,运行实现如下图所示:
(5) 最坏适应算法,执行首次算法后,建立的空闲表长度分别为5 6 7,申请一个名为b长度为6的作业故首次适应算法从第二个空闲表首地址为2开始,运行实现如图下所示:
20 / 21。