欢迎来到天天文库
浏览记录
ID:49977851
大小:22.40 KB
页数:6页
时间:2020-03-03
《最佳适应算法 源程序代码.doc》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、最佳适应算法源程序代码#include#include//全局变量floatminsize=5;intcount1=0;intcount2=0;#defineM10//假定系统允许的空闲区表最大为m#defineN10//假定系统允许的最大作业数量为n//已分配表的定义struct{floataddress;//已分分区起始地址floatlength;//已分分区长度,单位为字节intflag;//已分配区表登记栏标志,"0"表示空栏目}used_table[N];//
2、已分配区表对象名//空闲区表的定义:struct{floataddress;//空闲区起始地址floatlength;//空闲区长度,单位为字节intflag;//空闲区表登记栏标志,用"0"表示空栏目,用"1"表示未分配}free_table[M];//空闲区表对象名//函数声明voidinitialize(void);intdistribute(int,float);intrecycle(int);voidshow();//初始化两个表voidinitialize(void){inta;for(a=0;a<=N
3、-1;a++)used_table[a].flag=0;//已分配表的表项全部置为空表项free_table[0].address=1000;free_table[0].length=1024;free_table[0].flag=1;//空闲区表的表项全部为未分配}//最优分配算法实现的动态分区intdistribute(intprocess_name,floatneed_length){inti,k=-1;//k用于定位在空闲表中选择的未分配栏floatads,len;intcount=0;i=0;while(
4、i<=M-1)//循环找到最佳的空闲分区{if(free_table[i].flag==1&&need_length<=free_table[i].length){count++;if(count==1
5、
6、free_table[i].length7、address;len=free_table[k].length;}else{//切割空闲区ads=free_table[k].address;len=need_length;free_table[k].address+=need_length;free_table[k].length-=need_length;}i=0;//循环寻找内存分配表中标志为空栏目的项while(used_table[i].flag!=0){i=i+1;}if(i<=N-1)//找到,在已分配区表中登记一个表项{used_table[i]8、.address=ads;used_table[i].length=len;used_table[i].flag=process_name;count1++;}else//已分配区表长度不足{if(free_table[k].flag==0)//将已做的整个分配撤销{free_table[k].flag=1;free_table[k].address=ads;free_table[k].length=len;}else//将已做的切割分配撤销{free_table[k].address=ads;free_table9、[k].length+=len;}cout<<"内存分配区已满,分配失败!";return0;}}else{cout<<"无法为该作业找到合适分区!";return0;}returnprocess_name;}intrecycle(intprocess_name){inty=0;floatrecycle_address,recycle_length;inti,j,k;//j栏是下邻空闲区,k栏是上栏空闲区intx;//在内存分配表中找到要回收的作业while(y<=N-1&&used_table[y].fl10、ag!=process_name){y=y+1;}if(y<=N-1)//找到作业后,将该栏的标志置为'0'{recycle_address=used_table[y].address;recycle_length=used_table[y].length;used_table[y].flag=0;count2++;}else//未能找到作业,回收失败{co
7、address;len=free_table[k].length;}else{//切割空闲区ads=free_table[k].address;len=need_length;free_table[k].address+=need_length;free_table[k].length-=need_length;}i=0;//循环寻找内存分配表中标志为空栏目的项while(used_table[i].flag!=0){i=i+1;}if(i<=N-1)//找到,在已分配区表中登记一个表项{used_table[i]
8、.address=ads;used_table[i].length=len;used_table[i].flag=process_name;count1++;}else//已分配区表长度不足{if(free_table[k].flag==0)//将已做的整个分配撤销{free_table[k].flag=1;free_table[k].address=ads;free_table[k].length=len;}else//将已做的切割分配撤销{free_table[k].address=ads;free_table
9、[k].length+=len;}cout<<"内存分配区已满,分配失败!";return0;}}else{cout<<"无法为该作业找到合适分区!";return0;}returnprocess_name;}intrecycle(intprocess_name){inty=0;floatrecycle_address,recycle_length;inti,j,k;//j栏是下邻空闲区,k栏是上栏空闲区intx;//在内存分配表中找到要回收的作业while(y<=N-1&&used_table[y].fl
10、ag!=process_name){y=y+1;}if(y<=N-1)//找到作业后,将该栏的标志置为'0'{recycle_address=used_table[y].address;recycle_length=used_table[y].length;used_table[y].flag=0;count2++;}else//未能找到作业,回收失败{co
此文档下载收益归作者所有