資源簡介
內存分配算法代碼模擬。包含 首次適應算法(First Fit) 最佳適應算法(Best Fit)最差適應算法(Worst Fit)伙伴算法(buddy)
https://blog.csdn.net/GreyBtfly/article/details/84646981
代碼片段和文件信息
#include
using?namespace?std;
/*進程分配內存塊鏈表的首指針*/
struct?allocated_block?*allocated_block_head?=?NULL;
#define?PROCESS_NAME_LEN?32???/*進程名長度*/
#define?MIN_SLICE????10?????????????/*最小碎片的大小*/
#define?DEFAULT_MEM_SIZE?1024?????/*內存大小*/
#define?DEFAULT_MEM_START?0???????/*起始位置*/
/*?內存分配算法?*/
#define?MA_FF?1 //first?fit
#define?MA_BF?2
#define?MA_WF?3
#define?Buddy?4?//伙伴算法?
/*描述每一個空閑塊的數據結構*/
struct?free_block_type{
????int?size;
????int?start_addr;
????struct?free_block_type?*next;
};??
typedef?struct?free_block_type?FB;
/*指向內存中空閑塊鏈表的首指針*/
struct?free_block_type?*free_block;//此處盡量按內存地址順序排列?,
/*每個進程分配到的內存塊的描述*/
struct?allocated_block{
????int?pid;????int?size;
????int?start_addr;
????char?process_name[PROCESS_NAME_LEN];
????struct?allocated_block?*next;
};
typedef?struct?allocated_block?allocated_block_type;
//buddy
typedef?struct?b_free_block_type
{
int?size;
free_block_type?*list;
b_free_block_type?*next;
}b_free_block_type;
b_free_block_type?*b_free_block=NULL;//空的時候要設置為NULL?
//end?of?buddy?
typedef?struct?allocated_block?AB;
int?mem_size=DEFAULT_MEM_SIZE;?/*內存大小*/
int?ma_algorithm?=?Buddy;???????????/*當前分配算法*/?//------------------------>>>>>>>>>?
static?int?pid?=?0;??????????????????????????????????????/*初始pid*/
int?flag?=?0;?????????????????????????????/*設置內存大小標志*/
//init_free_block(int?mem_size);
int?display_mem_usage();
int?b_creat_free_blocks(free_block_type?*ab);
int?rearrange_Buddy();
int?rearrange(int?algorithm);
int?allocate_mem(struct?allocated_block?*ab);?
int?free_mem(struct?allocated_block?*ab);
int?dispose(struct?allocated_block?*free_ab);
int?disfree(FB?*free_ab);
void?free_f();
void?free_b();
/*初始化空閑塊,默認為一塊,可以指定大小及起始地址*/
struct?free_block_type*?init_free_block(int?mem_size)
{
free_f();
free_b();
????struct?free_block_type?*fb;
????fb=(struct?free_block_type?*)malloc(sizeof(struct?free_block_type));
????if(fb==NULL){
????????printf(“Error.\n“);
????????getchar();
????????return?NULL;
}
????fb->size?=?mem_size;
????fb->start_addr?=?DEFAULT_MEM_START;
????fb->next?=?NULL;
????
????free_block=(struct?free_block_type?*)malloc(sizeof(struct?free_block_type));
????*free_block=*fb; //free_block供rearrange_Buddy使用,會被銷毀?
????rearrange_Buddy();//初始化buddy算法?
????return?fb; //會在main中重新賦值free_block?
}
/*顯示菜單*/
void?display_menu(){
????printf(“\n“);
????printf(“1?-?Set?memory?size?(default=%d)\n“?DEFAULT_MEM_SIZE);
????printf(“2?-?Select?memory?allocation?algorithm\n“);
????printf(“3?-?New?process?\n“);
????printf(“4?-?Terminate?a?process?\n“);
????printf(“5?-?Display?memory?usage?\n“);
????printf(“0?-?Exit\n“);
}
/*設置內存的大小*/
int?set_mem_size(){ //只能設置一次?清除現有所有鏈表,重新分配?
????int?size;
????if(flag!=0){??//防止重復設置
????????printf(“Cannot?set?memory?size?again\n“);
????????return?0;
????}
????printf(“Total?memory?size?=“);
????scanf(“%d“?&size);
????if(size>0)?{
????????mem_size?=?size;
???????//?free_block->size?=?mem_size;
???
- 上一篇:OpenCv背景差分228299
- 下一篇:c++usb端口訪問
評論
共有 條評論