最先适应算法.docx

上传人:b****7 文档编号:10477722 上传时间:2023-02-13 格式:DOCX 页数:18 大小:17.61KB
下载 相关 举报
最先适应算法.docx_第1页
第1页 / 共18页
最先适应算法.docx_第2页
第2页 / 共18页
最先适应算法.docx_第3页
第3页 / 共18页
最先适应算法.docx_第4页
第4页 / 共18页
最先适应算法.docx_第5页
第5页 / 共18页
点击查看更多>>
下载资源
资源描述

最先适应算法.docx

《最先适应算法.docx》由会员分享,可在线阅读,更多相关《最先适应算法.docx(18页珍藏版)》请在冰豆网上搜索。

最先适应算法.docx

最先适应算法

#include

#include

#include

#include

#include

#include

#include

#defineMAX_THREAD3

typedefstructfreearea{//表示空闲区域的数据结构

structfreearea*next;//指向下一个结点的指针

intstart_address;//空闲区起始地址

intsize;//空闲区大小

}FREEAREA;

typedefstructrequire_memory{//记录线程申请内存的数据结构

structrequire_memory*next;//指向下一个结点的指针

charthread_name[10];//线程名

intsize;//申请内存大小(以KB为单位)

intduration;//在内存的驻留时间(以秒为单位)

}REQUIRE_MEMORY;

typedefstructthread_residence_memory{//描述线程驻留区的数据结构

structthread_residence_memory*next;//指向下一个结点的指针

charthread_name[10];//线程名

intstart_address;//驻留区起始地址

intsize;//驻留区大小

}THREAD_RESIDENCE_MEMORY;

FREEAREAinit_free_area_table[5]={

{NULL,10,10},

{NULL,40,30},

{NULL,80,5},

{NULL,145,15},

{NULL,180,20}

};//测试数据:

初始空闲区表

REQUIRE_MEMORYinit_thread_require_memory_table[3]={

{NULL,"thread_1",20,4},

{NULL,"thread_2",10,5},

{NULL,"thread_3",5,6}

};//测试数据:

初始内存申请表

THREAD_RESIDENCE_MEMORYinit_thread_residence_memory_table[5]={

{NULL,"a",0,10},

{NULL,"b",20,20},

{NULL,"c",70,10},

{NULL,"d",85,60},

{NULL,"e",160,20}

};//测试数据:

初始线程驻留区表

FREEAREA*p_free_area_list=NULL;//空闲区链首

REQUIRE_MEMORY*p_thread_require_memory_queue=NULL;//内存申请队列队首

THREAD_RESIDENCE_MEMORY*p_thread_residence_memory_list=NULL;//线程驻留链首

THREAD_RESIDENCE_MEMORY*tail_thread_residence_memory_list=NULL;

//线程驻留区链尾

CRITICAL_SECTIONCS_THREAD_MEMORY_LIST;//保护线程驻留区链表的临界区

CRITICAL_SECTIONCS_SCREEN;//保护屏幕的临界区

CRITICAL_SECTIONCS_FREEAREA_LIST;//保护空闲区链表的临界区

HANDLEh_thread[MAX_THREAD];//线程句柄数组

voidprint_space(intnum);//输出若干个空格

voiddisplay_thread_residence_memory_list();//显示线程驻留区表

voiddisplay_freearea_list();

//最先适应分配法的函数

FREEAREA*FF_initialize_freearea_list(FREEAREA*init_table,intnum);//初始化空闲区链表

voidFF_delete_freearea_list();//删除空闲区链表

REQUIRE_MEMORY*FF_initialize_require_memory_list(REQUIRE_MEMORY*init_table,intnum);//初始化内存申请链表

voidFF_delete_require_memory_list();//删除内存申请链表

THREAD_RESIDENCE_MEMORY*FF_initialize_thread_residence_memory_list

(THREAD_RESIDENCE_MEMORY*init_table,intnum);//初始化线程驻留区链表

voidFF_delete_thread_residence_memory_list();//删除线程驻留区链表

voidFF_thread(void*data);//线程函数

intFF_require_memory(intsize);//内存申请函数

voidFF_release_memory(intstart_address,intsize);//内存释放函数

voidFF();//最先适应分配算法的初始化函数

#include"variable_partition.h"

voidprint_space(intnum){//显示若干个空格

inti;

for(i=0;i

printf("");

}

}

voiddisplay_freearea_list(){

FREEAREA*p;

charbuffer[20];

p=p_free_area_list;

printf("|--------------------|------------------|\n");

printf("|start_address(kB)|size(KB)|\n");

printf("|--------------------|------------------|\n");

while(p!

=NULL){

printf("|%d",p->start_address);

itoa(p->start_address,buffer,10);

print_space(19-strlen(buffer));

printf("|%d",p->size);

itoa(p->size,buffer,10);

print_space(17-strlen(buffer));

printf("|\n");

p=p->next;

};

printf("|--------------------|------------------|\n\n");

}

voiddisplay_thread_residence_memory_list(){//显示驻留线程链表

THREAD_RESIDENCE_MEMORY*p;

charbuffer[20];

p=p_thread_residence_memory_list;

printf("|-------------------|--------------------|------------------|\n");

printf("|thread_name|start_address(kB)|size(KB)|\n");

printf("|-------------------|--------------------|------------------|\n");

while(p!

=NULL){

printf("|%s",p->thread_name);

print_space(18-strlen(p->thread_name));

printf("|%d",p->start_address);

itoa(p->start_address,buffer,10);

print_space(19-strlen(buffer));

printf("|%d",p->size);

itoa(p->size,buffer,10);

print_space(17-strlen(buffer));

printf("|\n");

p=p->next;

};

printf("|-------------------|--------------------|------------------|\n\n");

}

//最先适应分配法:

初始化空闲区链表

FREEAREA*FF_initialize_freearea_list(FREEAREA*init_table,intnum){

FREEAREA*temp;

FREEAREA*head=NULL;

FREEAREA*tail=NULL;

inti;

for(i=0;i

temp=(FREEAREA*)malloc(sizeof(FREEAREA));

temp->start_address=init_table[i].start_address;

temp->size=init_table[i].size;

temp->next=NULL;

if(head==NULL)

head=tail=temp;

else{

tail->next=temp;

tail=tail->next;

}

};

returnhead;

}

//最先适应分配法:

删除空闲区链表

voidFF_delete_freearea_list(){

FREEAREA*temp;

temp=p_free_area_list;

while(temp!

=NULL){

temp=p_free_area_list->next;

free(p_free_area_list);

p_free_area_list=temp;

}

p_free_area_list=NULL;

}

//最先适应分配法:

初始化内存申请链表

REQUIRE_MEMORY*FF_initialize_require_memory_list(REQUIRE_MEMORY*init_table,intnum){

REQUIRE_MEMORY*temp;

REQUIRE_MEMORY*head=NULL;

REQUIRE_MEMORY*tail=NULL;

inti;

for(i=0;i

temp=(REQUIRE_MEMORY*)malloc(sizeof(REQUIRE_MEMORY));

strcpy(temp->thread_name,init_table[i].thread_name);

temp->size=init_table[i].size;

temp->duration=init_table[i].duration;

temp->next=NULL;

if(head==NULL)

head=tail=temp;

else{

tail->next=temp;

tail=tail->next;

}

};

returnhead;

}

//最先适应分配法:

删除内存申请链表

voidFF_delete_require_memory_list(){

REQUIRE_MEMORY*temp;

temp=p_thread_require_memory_queue;

while(temp!

=NULL){

temp=p_thread_require_memory_queue->next;

free(p_thread_require_memory_queue);

p_thread_require_memory_queue=temp;

}

p_thread_require_memory_queue=NULL;

}

//最先适应分配法:

初始化线程驻留区链表

THREAD_RESIDENCE_MEMORY*FF_initialize_thread_residence_memory_list(THREAD_RESIDENCE_MEMORY*init_table,intnum){

THREAD_RESIDENCE_MEMORY*temp;

THREAD_RESIDENCE_MEMORY*head=NULL;

THREAD_RESIDENCE_MEMORY*tail=NULL;

inti;

for(i=0;i

temp=(THREAD_RESIDENCE_MEMORY*)malloc(sizeof(THREAD_RESIDENCE_MEMORY));

strcpy(temp->thread_name,init_table[i].thread_name);

temp->start_address=init_table[i].start_address;

temp->size=init_table[i].size;

temp->next=NULL;

if(head==NULL)

head=tail=temp;

else{

tail->next=temp;

tail=tail->next;

}

};

tail_thread_residence_memory_list=tail;

returnhead;

}

//最先适应分配法:

删除线程驻留区链表

voidFF_delete_thread_residence_memory_list(){

THREAD_RESIDENCE_MEMORY*temp=p_thread_residence_memory_list;

temp=p_thread_residence_memory_list;

while(temp!

=NULL){

temp=p_thread_residence_memory_list->next;

free(p_thread_residence_memory_list);

p_thread_residence_memory_list=temp;

}

p_thread_residence_memory_list=NULL;

}

//线程:

申请内存,驻留一段时间,释放内存

voidFF_thread(void*data){

intstart_address=-1;

THREAD_RESIDENCE_MEMORY*temp;

EnterCriticalSection(&CS_SCREEN);

printf("createthread:

%s\n",((REQUIRE_MEMORY*)(data))->thread_name);

LeaveCriticalSection(&CS_SCREEN);

while

(1){//申请内存

start_address=FF_require_memory(((REQUIRE_MEMORY*)(data))->size);

if(start_address>=0)

break;

else

Sleep(1000);

}

temp=(THREAD_RESIDENCE_MEMORY*)malloc(sizeof(THREAD_RESIDENCE_MEMORY));

strcpy(temp->thread_name,((REQUIRE_MEMORY*)(data))->thread_name);

temp->start_address=start_address;

temp->size=((REQUIRE_MEMORY*)(data))->size;

temp->next=NULL;

EnterCriticalSection(&CS_THREAD_MEMORY_LIST);

//加入线程驻留区链表

tail_thread_residence_memory_list->next=temp;

tail_thread_residence_memory_list=tail_thread_residence_memory_list->next;

LeaveCriticalSection(&CS_THREAD_MEMORY_LIST);

//显示线程驻留区链表

EnterCriticalSection(&CS_SCREEN);

printf("after%s%s\n",((REQUIRE_MEMORY*)(data))->thread_name,"getmemory:

");

display_thread_residence_memory_list();

LeaveCriticalSection(&CS_SCREEN);

Sleep(((REQUIRE_MEMORY*)(data))->duration);

//释放内存

FF_release_memory(start_address,((REQUIRE_MEMORY*)(data))->size);

}

//最先适应分配法:

内存申请函数

intFF_require_memory(intsize){

//请读者自己实现这段代码

intstart_address=-1;

FREEAREA*p;

FREEAREA*p_next;

EnterCriticalSection(&CS_FREEAREA_LIST);

p=p_next=p_free_area_list;

while(p_next!

=NULL){

if(size==p_next->size){//刚好满足要求,删除空闲区结点

start_address=p_next->start_address;

if(p_next==p_free_area_list)

p_free_area_list=p_next->next;

else

p->next=p_next->next;

free(p_next);

break;

}

elseif(sizesize){//分割空闲区结点

start_address=p_next->start_address;

p_next->start_address+=size;

p_next->size-=size;

break;

}

else

{

p=p_next;

p_next=p_next->next;

}

}

LeaveCriticalSection(&CS_FREEAREA_LIST);

returnstart_address;

}

//最先适应分配法:

内存释放函数

voidFF_release_memory(intstart_address,intsize){

EnterCriticalSection(&CS_FREEAREA_LIST);

//请读者自己实现这段代码

//__int64t1,t2;//记录该算法起止时间

//t1=GetCycleCount();//记录起始时间

FREEAREA*temp,*p,*pp;

//将空闲区按start_address由小到大排序,以便整合相邻空闲区

while

(1){

intchange=0;

p=p_free_area_list;

if(p->next!

=NULL){

if(p->start_address>p->next->start_address){

pp=p->next;

p->next=pp->next;

pp->next=p;

p_free_area_list=pp;

change=1;

}

}

if(p->next!

=NULL){

while(p->next->next!

=NULL){

if(p->next->start_address>p->next->next->start_address){

pp=p->next->next;

p->next->next=pp->next;

pp->next=p->next;

p->next=pp;

change=1;

}

p=p->next;

}

}

if(change==0){

break;

}

}

//插入空闲区

temp=newFREEAREA;

p=newFREEAREA;

temp->start_address=start_address;

temp->size=size;

temp->next=NULL;

p->next=p_free_area_list;

while(p->next!

=NULL){

if(p->next->start_address>temp->start_address){

temp->next=p->next;

p->next=temp;

break;

}

else{

p=p->next;

}

}

if(p->next==NULL){

p->next=temp;

}

elseif(temp->next==p_free_area_list){

p_free_area_list=temp;

}

//整合碎片

while

(1){

intchange=0;

p=p_free_area_list;

if(p==NULL){

break;

}

while(p->next!

=NULL){

if((p->start_address+p->size)==(p->next->start_address)){

p->size=p->next->size+p->size;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 文学研究

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1