内存管理.docx
- 文档编号:18092815
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:20
- 大小:41.35KB
内存管理.docx
《内存管理.docx》由会员分享,可在线阅读,更多相关《内存管理.docx(20页珍藏版)》请在冰点文库上搜索。
内存管理
西安郵電大學
操作系统课程实验
报告书
院系名称
:
计算机学院
学生姓名
:
张萌萌
专业名称
:
软件工程
班级
:
1003
学号
:
1234456
时间
:
2012年11月19日至2012年11月29日
实验题目:
内存管理实验
一、 实验目的
模拟实现操作系统内存分配、释放以及管理的过程。
二、 实验环境
Ubuntu10.10shell+Vim+GCC编译器
三、实验内容
1)掌握内存分配FF,BF,WF策略及实现的思路;
2)掌握内存回收过程及实现思路;
3)实现内存的申请、释放的管理程序,调试运行,总结.
●相关函数功能
1-Setmemorysize(default=1024)
2-Selectmemoryallocationalgorithm
3-Newprocess
4-Terminateaprocess
5-Displaymemoryusage
0-Exit
●关键算法思想设计与分析
首次适应算法(FirstFit):
从空闲分区表的第一个表目起查找该表,把最先能够满足要求的空闲区分配给作业,这种方法目的在于减少查找时间。
为适应这种算法,空闲分区表(空闲区链)中的空闲分区要按地址由低到高进行排序。
该算法优先使用低址部分空闲区,在低址空间造成许多小的空闲区,在高地址空间保留大的空闲区。
最佳适应算法(BestFit):
它从全部空闲区中找出能满足作业要求的、且大小最小的空闲分区,这种方法能使碎片尽量小。
为适应此算法,空闲分区表(空闲区链)中的空闲分区要按从小到大进行排序,自表头开始查找到第一个满足要求的自由分区分配。
该算法保留大的空闲区,但造成许多小的空闲区。
最差适应算法(WorstFit):
它从全部空闲区中找出能满足作业要求的、且大小最大的空闲分区,从而使链表中的结点大小趋于均匀,适用于请求分配的内存大小范围较窄的系统。
为适应此算法,空闲分区表(空闲区链)中的空闲分区要按大小从大到小进行排序,自表头开始查找到第一个满足要求的自由分区分配。
该算法保留小的空闲区,尽量减少小的碎片产生。
●运行界面
4、调试情况,设计技巧及体会
通过本次的内存实验我深刻的体会并了解到内存的管理模型的部分相关知识,尤其是在内存紧缩合并回收部分还遇到了一些问题,最终通过查资料解决了问题,虽然对内存我可能还有还有很多未知的内容,但是这次的内存管理实验过程给我开启了一个良好的开端,使我对此部分也有了个人的学习计划。
5、源代码
#include
#include
#definePROCESS_NAME_LEN32//进程名长度
#defineMIN_SLICE10//最小碎片的大小
#defineDEFAULT_MEM_SIZE1024//内存大小
#defineDEFAULT_MEM_START0//起始位置
/*内存分配算法*/
#defineMA_FF1
#defineMA_BF2
#defineMA_WF3
intmem_size=DEFAULT_MEM_SIZE;//内存大小
intma_algorithm=MA_FF;//当前分配算法
staticintpid=0;//初始pid
intflag=0;//设置内存大小标志
//声明函数原型
rearrange_FF();//首次适应算法函数
rearrange_WF();//最坏适应算法函数
rearrange_BF();//最佳适应算法函数
display_menu();//打印菜单
intset_mem_size();//用来改变空闲内存块的大小
set_algorithm();
intnew_process();
kill_process();//销毁进程,释放其所占用的内存
display_mem_usage();//显示当前内存的使用情况,包括空闲区的情况和已经分配的情况
rearrange(intalgorithm);
free_memSort();//对空闲链表按地址进行排序
/*描述每一个空闲块的数据结构*/
structfree_block_type{
intsize;
intstart_addr;
structfree_block_type*next;
};
/*指向内存中空闲块链表的首指针*/
structfree_block_type*free_block;
/*每个进程分配到得内存块的描述*/
structallocated_block{
intpid;
intsize;
intstart_addr;
charprocess_name[PROCESS_NAME_LEN];
structallocated_block*next;
};
/*进程分配内存块链表的首指针*/
structallocated_block*allocated_block_head=NULL;
do_exit(){
}
/*初始化空闲块,默认为一块,可以指定大小及起始地址*/
structfree_block_type*init_free_block(intmem_size){
structfree_block_type*fb;
fb=(structfree_block_type*)malloc(sizeof(structfree_block_type));
if(fb==NULL){
printf("Nomem\n");
returnNULL;
}
fb->size=mem_size;
fb->start_addr=DEFAULT_MEM_START;
fb->next=NULL;
returnfb;
}
display_menu(){
printf("\n");
printf("1-Setmemorysize(default=%d)\n",DEFAULT_MEM_SIZE);//设置内存大小
printf("2-Selectmemoryallocationalgorithm\n");//指定分配算法
printf("3-Newprocess\n");//创建进程
printf("4-Terminateaprocess\n");//删除进程
printf("5-Displaymemoryusage\n");//显示内存使用情况
printf("0-Exit\n");
}
//设置内存的大小
set_mem_size(){
intsize;
if(flag!
=0){
printf("Cannotsetmemorysizeagain\n");
return0;
}
printf("Totalmemorysize=");
scanf("%d",&size);
if(size>0){
mem_size=size;
free_block->size=mem_size;
}
flag=1;
return1;
}
/*设置当前的分配算法*/
set_algorithm(){
intalgorithm;
printf("\t1-FirstFit\n");
printf("\t2-BestFit\n");
printf("\t3-WorstFit\n");
scanf("%d",&algorithm);
if(algorithm>=1&&algorithm<=3)
ma_algorithm=algorithm;
//按指定算法重新排列空闲区链表
rearrange(ma_algorithm);
}
rearrange(intalgorithm){
switch(algorithm){
caseMA_FF:
rearrange_FF();break;
caseMA_BF:
rearrange_BF();break;
caseMA_WF:
rearrange_WF();break;
}
}
/*按FF算法重新整理内存空闲块链表地址递增*/
rearrange_FF(){
structfree_block_type*fp,*rear;
intsize;
intstart_addr;
for(fp=free_block;fp->next!
=NULL;fp=fp->next)
for(rear=fp->next;rear!
=NULL;rear=rear->next)
{
if(fp->start_addr>rear->start_addr)
{
start_addr=fp->start_addr;
fp->start_addr=rear->start_addr;
rear->start_addr=start_addr;
size=fp->size;
fp->size=rear->size;
rear->size=size;
}
}
}
/*按BF算法重新整理内存空闲块链表从小到大*/
rearrange_BF(){
structfree_block_type*fp,*rear;
intsize;
intstart_addr;
for(fp=free_block;fp->next!
=NULL;fp=fp->next)
for(rear=fp->next;rear!
=NULL;rear=rear->next)
{
if(fp->size>rear->size)
{
size=fp->size;
fp->size=rear->size;
rear->size=size;
start_addr=fp->start_addr;
fp->start_addr=rear->start_addr;
rear->start_addr=start_addr;
}
}
}
/*按WF算法重新整理内存空闲块链表从大到小*/
rearrange_WF(){
structfree_block_type*fp,*rear;
intsize;
intstart_addr;
for(fp=free_block;fp->next!
=NULL;fp=fp->next)
for(rear=fp->next;rear!
=NULL;rear=rear->next)
{
if(fp->size
{
size=fp->size;
fp->size=rear->size;
rear->size=size;
start_addr=fp->start_addr;
fp->start_addr=rear->start_addr;
rear->start_addr=start_addr;
}
}
}
//分配内存模块
intallocate_mem(structallocated_block*ab){
structfree_block_type*fbt,*pre;
intrequest_size=ab->size;
fbt=pre=free_block;
fbt=free_block->next;
rearrange_WF();//最坏适应算法
if(pre->size-(request_size)<=MIN_SLICE&&request_size<(pre->size))
{
ab->size=pre->size;
free_block->size=free_block->size-(ab->size);
ab->start_addr=pre->start_addr;
free_block->start_addr=free_block->start_addr+ab->size;
free_block=pre->next;
free(pre);
return1;
}
elseif(pre->size-(request_size)>MIN_SLICE&&request_size<(pre->size))
{
ab->size=request_size;
free_block->size=free_block->size-(ab->size);
ab->start_addr=pre->start_addr;
free_block->start_addr=free_block->start_addr+ab->size;
return1;
}
elseif(pre->size { while(pre->size =NULL) { pre->size=pre->size+fbt->size; pre->next=fbt->next; free(fbt); fbt=pre->next; if(pre->size-request_size<=MIN_SLICE&&request_size<(pre->size)) { ab->size=pre->size; free_block->size=free_block->size-ab->size; ab->start_addr=pre->start_addr; pre->start_addr=free_block->start_addr+ab->size; free_block=pre->next; free(pre); return1; } elseif(pre->size-request_size>MIN_SLICE&&request_size<(pre->size)) { ab->size=request_size; free_block->size=free_block->size-ab->size; ab->start_addr=pre->start_addr; pre->start_addr=free_block->start_addr+ab->size; return1; } } } rearrange_WF(); return0; } //创建新的进程,主要是获取内存的申请数量 new_process(){ structallocated_block*ab; intsize; intret; ab=(structallocated_block*)malloc(sizeof(structallocated_block)); if(! ab) exit(-5); ab->next=NULL; pid++; sprintf(ab->process_name,"PROCESS-%02d",pid); ab->pid=pid; printf("Memoryfor%s: ",ab->process_name); scanf("%d",&size); if(size>0) ab->size=size; else printf("theproccess'sizecannot<=0\n"); ret=allocate_mem(ab);//从空闲区分配内存,ret==1表示分配OK //如果此时allocated_block_head尚未赋值,则赋值 if((ret==1)&&(allocated_block_head==NULL)){ allocated_block_head=ab; return1;} /*分配成功,将该已分配块的描述插入已分配链表*/ elseif(ret==1){ ab->next=allocated_block_head; allocated_block_head=ab; return2; } elseif(ret==0) { printf("Allocationfail\n"); free(ab); return-1; } return3; } /*删除进程,归还分配的存储空间,并删除描述该进程内存分配的节点*/ structallocated_block*find_process(intpid) { structallocated_block*ab,*pre; pre=allocated_block_head; ab=allocated_block_head->next; while(pre! =NULL){ if(pid==pre->pid) returnpre; pre=ab; ab=ab->next; } returnNULL; } mm() {structfree_block_type*rear,*pre; pre=free_block; rear=free_block->next; while(rear! =NULL) { if(pre->start_addr+pre->size==rear->start_addr) { pre->size=pre->size+rear->size; pre->next=rear->next; free(rear); rear=pre->next; } else { pre=pre->next; rear=rear->next; } } rearrange_WF(); } intfree_mem(structallocated_block*ab) { structfree_block_type*fbt,*fr; fbt=free_block; fr=(structfree_block_type*)malloc(sizeof(structfree_block_type)); if(! fr)//若申请内存失败,则返回-1 return-1; fr->size=ab->size; fr->start_addr=ab->start_addr; fr->next=NULL; while(fbt->next! =NULL) fbt=fbt->next; fbt->next=fr; rearrange_FF(); mm();//合并内存 return1; //1.将新释放的结点插入到空闲分区队列末尾 //2.对空闲链表按照地址有序排列 //3.检查并合并相邻的空闲分区 //4.将空闲链表重新按照当前算法排序 } /*释放ab数据结构节点*/ intdispose(structallocated_block*free_ab) { structallocated_block*pre,*ab; if(free_ab==allocated_block_head){ /*如果要释放第一个节点*/ allocated_block_head=allocated_block_head->next; free(free_ab); return1; } pre=allocated_block_head; ab=allocated_block_head->next; while(ab! =free_ab){ pre=ab; ab=ab->next; } pre->next=ab->next; free(ab); return2; } kill_process(){ structallocated_block*ab; intpid; printf("KillProcess,pid="); scanf("%d",&pid); ab=find_process(pid); if(ab! =NULL){ printf("findtheprocess.\n"); free_mem(ab);//释放ab所表示的分配区 dispose(ab);/*释放ab数据结构节点*/ } else { printf("nothis"); } return1; } /*显示当前内存的使用情况,包括空闲区的情况和已经分配的情况*/ display_mem_usage(){ structfree_block_type*fbt=free_block; structallocated_block*ab=allocated_block_head; if(fbt==NULL) return(-1); printf("---------------"); //显示空闲区 printf("FreeMemory: ---------------\n"); printf("%20s%20s\n","start_addr","size"); while(fbt! =NULL){ printf("%20d%20d\n",fbt->start_addr,fbt->size); fbt=fbt->next; } //显示已分配区 printf("\nUsedMemory: \n"); printf("%10s%20s%10s%10s\n","PID","ProcessName","start_addr","size"); while(ab! =NULL){ printf("%10d%20s%10d%10d\n",ab->pid,ab->process_name,ab->start_addr,ab->size); ab=ab->next; } printf("------------------------------------------\n"); return0; } DO_exit()//释放进程所申请的内存 { structalloc
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内存 管理