实验四 动态分区分配算法.docx
- 文档编号:11523921
- 上传时间:2023-03-11
- 格式:DOCX
- 页数:14
- 大小:17.97KB
实验四 动态分区分配算法.docx
《实验四 动态分区分配算法.docx》由会员分享,可在线阅读,更多相关《实验四 动态分区分配算法.docx(14页珍藏版)》请在冰豆网上搜索。
实验内容:
存储器管理实验一、实验目的
采用首次适应算法(FF),最佳适应算法(BF),最坏适应算法(WF)三种不同的算法,
实现对系统空闲区的动态分区分配。
二、实验题目
给予顺序搜索的动态分区算法的程序。
三、实验要求
读懂给出的核心代码,进行适当的修改,编译通过后,完成实验报告。
四、核心代码
#include
//常量定义
#definePROCESS_NAME_LEN32
#defineMIN_SLICE 10
#defineDEFAULT_MEM_SIZE1024
#defineDEFAULT_MEM_START0
#defineMA_FF1
#defineMA_BF2
#defineMA_WF3intmem_size=DEFAULT_MEM_SIZE;intma_algorithm=MA_FF;staticintpid=0;
intflag=0;
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;
//函数声明
structfree_block_type*init_free_block(intmem_size);voiddisplay_menu();
intset_mem_size();voidset_algorithm();
voidrearrange(intalgorithm);intrearrange_FF();intrearrange_BF();intrearrange_WF();intnew_process();
intallocate_mem(structallocated_block*ab);voidkill_process();intfree_mem(structallocated_block*ab);
intdispose(structallocated_block*free_ab);intdisplay_mem_usage();
voiddo_exit();
structallocated_block*find_process(intpid);intmain(){
charchoice; pid=0;
free_block=init_free_block(mem_size);/初/始化空闲区
while
(1){
display_menu();//显示菜单fflush(stdin);
choice=getchar(); //获取用户输入
switch(choice){
case'1':
set_mem_size();break;//设置内存大小case'2':
set_algorithm();flag=1;break;设//置算法case'3':
new_process();flag=1;break创;//建新进程case'4':
kill_process();flag=1;break删;//除进程
case'5':
display_mem_usage();flag=1;break;/显/示内存使用
case'0':
do_exit();exit(0); //释放链表并退出default:
break;
}
}
return1;
}
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;
}
voiddisplay_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");
}
intset_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;
}
voidset_algorithm(){intalgorithm;while
(1){
printf("\t1-FirstFit\n");printf("\t2-BestFit\n");printf("\t3-WorstFit\n");scanf("%d",&algorithm);
if(algorithm>=1&&algorithm<=3){ma_algorithm=algorithm;break;
}
else
}
printf("输入有误,请重新输入!
\n");
//按指定算法重新排列空闲区链表rearrange(ma_algorithm);
}
voidrearrange(intalgorithm){switch(algorithm){
caseMA_FF:
rearrange_FF();break;
caseMA_BF:
rearrange_BF();break;caseMA_WF:
rearrange_WF();break;
}
}
//首次适应算法intrearrange_FF(){
structfree_block_type*temp;
//使用头插法,thead为临时头,p为最小地址的数据块的前一个结点
structfree_block_type*thead=NULL,*p=NULL;
//当前的最小地址
intmin_addr=free_block->start_addr;temp=free_block;
while(temp->next!
=NULL){
if(temp->next->start_addr
}
temp=temp->next;
}
if(NULL!
=p){
temp=p->next;
p->next=p->next->next;temp->next=free_block;free_block=temp;
}
thead=free_block;p=free_block;
temp=free_block->next;while(thead->next!
=NULL){
min_addr=thead->next->start_addr;while(temp->next!
=NULL){
if(temp->next->start_addr
}
temp=temp->next;
}
if(p->next!
=thead->next){temp=p->next;
p->next=p->next->next;temp->next=thead->next;thead->next=temp;
}
thead=thead->next;p=thead;
temp=thead->next;
}
return1;
}
//最佳适应算法intrearrange_BF(){
structfree_block_type*temp;
//使用头插法,thead为临时头,p为最小内存的数据块的前一个结点
structfree_block_type*thead=NULL,*p=NULL;
//当前的最小内存intmin_size=free_block->size;temp=free_block;
while(temp->next!
=NULL){
if(temp->next->size
}
temp=temp->next;
}
if(NULL!
=p){
temp=p->next;
p->next=p->next->next;temp->next=free_block;free_block=temp;
}
thead=free_block;p=free_block;
temp=free_block->next;while(thead->next!
=NULL){
min_size=thead->next->size;
while(temp->next!
=NULL){
if(temp->next->size
}
temp=temp->next;
}
if(p->next!
=thead->next){temp=p->next;
p->next=p->next->next;temp->next=thead->next;thead->next=temp;
}
thead=thead->next;p=thead;
temp=thead->next;
}
return1;
}
//最坏适应算法intrearrange_WF(){
structfree_block_type*temp;
//使用头插法,thead为临时头,p为最大内存的数据块的前一个结点
structfree_block_type*thead=NULL,*p=NULL;
//当前的最大内存intmax_size=free_block->size;temp=free_block;
while(temp->next!
=NULL){
if(temp->next->size>max_size){max_size=temp->next->size;p=temp;
}
temp=temp->next;
}
if(NULL!
=p){
temp=p->next;
p->next=p->next->next;temp->next=free_block;free_block=temp;
}
thead=free_block;p=free_block;
temp=free_block->next;
while(thead->next!
=NULL){max_size=thead->next->size;while(temp->next!
=NULL){
if(temp->next->size>max_size){max_size=temp->next->size;p=temp;
}
temp=temp->next;
}
if(p->next!
=thead->next){temp=p->next;
p->next=p->next->next;temp->next=thead->next;thead->next=temp;
}
return1;
}
}
thead=thead->next;p=thead;
temp=thead->next;
intnew_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-d",pid);ab->pid=pid;
while
(1){
printf("Memoryfor%s:
",ab->process_name);scanf("%d",&size);
if(size>0){
ab->size=size;break;
}
elseprintf("输入大小有误,请重新输入\n");
}
ret=allocate_mem(ab);
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==-1){printf("Allocationfail\n");pid--;
free(ab);return-1;
}
return3;
}
intallocate_mem(structallocated_block*ab){structfree_block_type*fbt,*pre,*head,*temp,*tt;structallocated_block*tp;
intrequest_size=ab->size;intsum=0;
intmax;
head=(structfree_block_type*)malloc(sizeof(structfree_block_type));pre=head;
fbt=free_block;
pre->next=fbt;
if(ma_algorithm==MA_WF){
if(NULL==fbt||fbt->size } else{ while(NULL! =fbt&&fbt->size fbt=fbt->next; } } if(NULL==fbt||fbt->size if(NULL! =free_block->next){sum=free_block->size;temp=free_block->next;while(NULL! =temp){ sum+=temp->size;if(sum>=request_size) break; temp=temp->next; } if(NULL==temp) return-1; else{ pre=free_block; max=free_block->start_addr;fbt=free_block; while(temp->next! =pre){if(max max=pre->start_addr;fbt=pre; } pre=pre->next; } pre=free_block; while(temp->next! =pre){ tp=allocated_block_head;tt=free_block; if(pre! =fbt){ while(NULL! =tp){ if(tp->start_addr>pre->start_addr) tp->start_addr=tp->start_addr-pre->size;tp=tp->next; } while(NULL! =tt){ if(tt->start_addr>pre->start_addr) tt->start_addr=tt->start_addr-pre->size;tt=tt->next; } } pre=pre->next; } pre=free_block;while(pre! =temp->next){ if(pre! =fbt) free(pre);pre=pre->next; } free_block=fbt;free_block->size=sum; free_block->next=temp->next; if(free_block->size-request_size ab->start_addr=free_block->start_addr;pre=free_block; free_block=free_block->next; free(pre); } else{ ab->start_addr=fbt->start_addr; free_block->start_addr=free_block->start_addr+request_size;free_block->size=free_block->size-request_size; } } } else return-1; } else{ //将内存块全部分配 if(fbt->size-request_size ab->start_addr=fbt->start_addr;if(pre->next==free_block){ free_block=fbt->next; } else pre->next=fbt->next; } else{ } } free(fbt); ab->start_addr=fbt->start_addr; fbt->start_addr=fbt->start_addr+request_size;fbt->size=fbt->size-request_size; free(head);rearrange(ma_algorithm); return1; } voidkill_process(){structallocated_block*ab;intpid; printf("KillProcess,pid=");scanf("%d",&pid); ab=find_process(pid);if(ab! =NULL){ free_mem(ab);dispose(ab); } else{ printf("没有pid为%d的进程! \n",pid); } } structallocated_block*find_process(intpid){ structallocated_block*ab=NULL;ab=allocated_block_head;while(NULL! =ab&&ab->pid! =pid) ab=ab->next;returnab; } intfree_mem(structallocated_block*ab){intalgorithm=ma_algorithm; structfree_block_type*fbt,*pre=NULL,*head; fbt=(structfree_block_type*)malloc(sizeof(structfree_block_type));pre=(structfree_block_type*)malloc(sizeof(structfree_block_type));if(! fbt)return-1; //进行可能的合并,基本策略如下 //1.将新释放的结点插入到空闲分区队列末尾 //2.对空闲链表按照地址有序排列 //3.检查并合并相邻的空闲分区 //4.将空闲链表重新按照当前算法排序 head=pre; fbt->start_addr=ab->start_addr;fbt->size=ab->size; fbt->next=free_block;//新释放的结点插入到空闲分区链表的表头 free_block=fbt; rearrange_FF(); //对空闲链表按照地址有序排列 pre->next=free_block;//求的pre为fbt的前一个结点 pre->size=0; while(pre->next->start_addr! =fbt->start_addr)pre=pre->next; //左右分区都存在 if(0! =pre->size&&NULL! =fbt->next){ //左右分区都可合并 if((pre->start_addr+pre->size)==fbt->start_addr&&(fbt->start_addr+fbt->size
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 实验四 动态分区分配算法 实验 动态 分区 分配 算法