假脱机打印程序假脱机打印程序
#include
#include
#include
#include
#include
#include
#define MAX_THREAD 3
#define BF_initialize_require_memory_list FF_initialize_require_memory_list #define WF_initialize_require_memory_list FF_initialize_require_memory_list #define BF_initia...
假脱机打印程序
#include
#include
#include
#include
#include
#include
#define MAX_THREAD 3
#define BF_initialize_require_memory_list FF_initialize_require_memory_list #define WF_initialize_require_memory_list FF_initialize_require_memory_list #define BF_initialize_thread_residence_memory_list FF_initialize_thread_residence_memory_list
#define WF_initialize_thread_residence_memory_list
FF_initialize_thread_residence_memory_list
#define WF_delete_freearea_list FF_delete_freearea_list #define BF_delete_freearea_list FF_delete_freearea_list #define WF_delete_require_memory_list FF_delete_require_memory_list #define BF_delete_require_memory_list FF_delete_require_memory_list #define WF_delete_thread_residence_memory_list FF_delete_thread_residence_memory_list
#define BF_delete_thread_residence_memory_list FF_delete_thread_residence_memory_list
typedef struct freearea{ //示空闲区域的数据结构
struct freearea *next; //指向下一个结点的指针
int start_address; //空闲区起始地址
int size; //空闲区大小
}FREEAREA;
typedef struct require_memory{ //线程申请内存的数据结构
struct require_memory *next; //指向下一个结点的指针
char thread_name[10]; //线程名
int size; //申请内存大小(以KB为单位)
int duration; //在内存的驻留时间(以秒为单位)
}REQUIRE_MEMORY;
typedef struct thread_residence_memory{ //描述线程驻留区的数据结构
struct thread_residence_memory *next; //指向下一个结点的指针
char thread_name[10]; //线程名
int start_address; //驻留区起始地址
int size; //驻留区大小
}THREAD_RESIDENCE_MEMORY;
FREEAREA init_free_area_table[5]={ //测试数据:初始空闲区表
{NULL,10,10},
{NULL,40,30},
{NULL,80,5},
{NULL,145,15},
{NULL,180,20}
};
REQUIRE_MEMORY init_thread_require_memory_table[3]={ //测试数据:初始内存申请表
{NULL,"thread_1",20,4},
{NULL,"thread_2",10,5},
{NULL,"thread_3",5,6}
};
//测试数据:初始线程驻留区表
THREAD_RESIDENCE_MEMORY init_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_SECTION CS_THREAD_MEMORY_LIST; //保护线程驻留区链表的临界区
CRITICAL_SECTION CS_SCREEN; //保护屏幕的临界区
CRITICAL_SECTION CS_FREEAREA_LIST; //保护空闲区链表的临界区
HANDLE h_thread[MAX_THREAD]; //线程句柄数组
void display_freearea_list();
void print_space(int num); //输
出若干个空格
void display_thread_residence_memory_list(); //显示线程驻留区表
//最先适应分配法的函数
FREEAREA *FF_initialize_freearea_list(FREEAREA *init_table,int num); //初始化
空闲区链表
void FF_delete_freearea_list(); //删除
空闲区链表
REQUIRE_MEMORY *FF_initialize_require_memory_list(REQUIRE_MEMORY *init_table,int num);
//初始化内存申请链表
void FF_delete_require_memory_list(); //删除内
存申请链表
THREAD_RESIDENCE_MEMORY *FF_initialize_thread_residence_memory_list (THREAD_RESIDENCE_MEMORY *init_table,int num); //初始化线程
驻留区链表
void FF_delete_thread_residence_memory_list(); //删除线程驻
留区链表
void FF_thread(void *data);
//线程函数
int FF_require_memory(int size); //
内存申请函数
void FF_release_memory(int start_address,int size); //内
存释放函数
void FF(); //最先适应分配算
法的初始化函数
//最佳适应分配算法的函数
void BF_thread(void *data);
//线程函数
int BF_require_memory(int size); //
内存申请函数
void BF_release_memory(int start_address,int size); //内存
释放函数
void BF_insert_freearea(FREEAREA *free_node); //空闲区结
点插入函数
void BF(); //初始化程序
void BF_initialize_freearea_list(FREEAREA *init_table,int num); //初始化
空闲区链表
//最坏适应分配算法的函数
void WF_thread(void *data);
//线程函数
void WF_insert_freearea(FREEAREA *free_node); //空闲区结点插入函数
void WF_initialize_freearea_list(FREEAREA *init_table,int num); //初始化空闲区链表
int WF_require_memory(int size); //内存申请函数
void WF_release_memory(int start_address,int size); //内存释放函数
void WF();
#include "nimi.h"
int main(int argc,char *argv[]){
char select;
while(1){
printf("|-----------------------------------|\n");
printf("| 1:first fit allocation |\n");
printf("| 2:best fit allocation |\n");
printf("| 3:worst fit allocation |\n");
printf("| 4:exit |\n");
printf("|-----------------------------------|\n");
printf("select a function(1~4):");
do{
select=(char)getch();
}while(select!='1'&&select!='2'&&select!='3'&&select!='4');
system("cls");
switch(select){
case '1':
FF();
break;
case '2':
BF();
break;
case '3':
WF();
break;
case '4':
return 0;
}
printf("\nPress any key to return to main menu.");
getch();
system("cls");
}
return 0;
}
void print_space(int num){ //显示若干个空格
int i;
for(i=0;istart_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"); }
void display_thread_residence_memory_list(){ //显示驻留线程链表
THREAD_RESIDENCE_MEMORY *p;
char buffer[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,int num){
FREEAREA *temp;
FREEAREA *head=NULL;
FREEAREA *tail=NULL;
int i;
for(i=0;istart_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;
}
};
return head;
}
//最先适应分配法:删除空闲区链表
void FF_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,int
num){
REQUIRE_MEMORY *temp;
REQUIRE_MEMORY *head=NULL;
REQUIRE_MEMORY *tail=NULL;
int i;
for(i=0;ithread_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;
}
};
return head;
}
//最先适应分配法:删除内存申请链表
void FF_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,int num){
THREAD_RESIDENCE_MEMORY *temp;
THREAD_RESIDENCE_MEMORY *head=NULL;
THREAD_RESIDENCE_MEMORY *tail=NULL;
int i;
for(i=0;ithread_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;
return head;
}
//最先适应分配法:删除线程驻留区链表
void FF_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; }
//线程:申请内存,驻留一段时间,释放内存
void FF_thread(void *data){
int start_address=-1;
THREAD_RESIDENCE_MEMORY *temp;
EnterCriticalSection(&CS_SCREEN);
printf("create thread:%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,"get memory:");
display_thread_residence_memory_list();
LeaveCriticalSection(&CS_SCREEN);
Sleep(((REQUIRE_MEMORY *)(data))->duration);
//释放内存
FF_release_memory(start_address,((REQUIRE_MEMORY *)(data))->size);
}
//最先适应分配法:内存申请函数
int FF_require_memory(int size){
int start_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;
}
else
if(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);
return start_address;
}
//最先适应分配法:内存释放函数
void FF_release_memory(int start_address,int size){
EnterCriticalSection(&CS_FREEAREA_LIST);
FREEAREA *temp,*p,*pp;
//将空闲区按start_address由小到大排序,以便整合相邻空闲区
while(1){
int change = 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 = new FREEAREA;
p = new FREEAREA;
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;
}
else if(temp->next == p_free_area_list){
p_free_area_list = temp;
}
//整合碎片
while(1){
int change = 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;
change = 1;
if(p->next->next == NULL){
free(p->next);
p->next = NULL;
}
else{
p->next = p->next->next;
}
}
if(p->next == NULL){
break;
}
else{
p = p->next ;
}
}
if(change == 0){
break;
}
}
//整理线程结束后的驻留链表
THREAD_RESIDENCE_MEMORY *q;
q = p_thread_residence_memory_list;
if(q->start_address == start_address){
p_thread_residence_memory_list = p_thread_residence_memory_list->next ;
}
else{
while(q->next != NULL){
if(q->next->start_address == start_address){
if(q->next == tail_thread_residence_memory_list){
tail_thread_residence_memory_list = q;
}
q->next = q->next->next ;
break;
}
q = q->next;
}
}
LeaveCriticalSection(&CS_FREEAREA_LIST); }
//最先适应分配算法的初始化程序
void FF(){
int i=0;
REQUIRE_MEMORY *p;
HANDLE h_thread[MAX_THREAD];
InitializeCriticalSection(&CS_THREAD_MEMORY_LIST);
InitializeCriticalSection(&CS_FREEAREA_LIST);
InitializeCriticalSection(&CS_SCREEN);
printf("最先适应分配算法\n");
p_free_area_list=FF_initialize_freearea_list(init_free_area_table,5);
p_thread_require_memory_queue=FF_initialize_require_memory_list(init_thread_require_memor
y_table,3);
p_thread_residence_memory_list=FF_initialize_thread_residence_memory_list(init_thread_reside
nce_memory_table,5);
p=p_thread_require_memory_queue;
while(p!=NULL){
h_thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(FF_thread),p,0,NULL);
i++;
p=p->next;
};
WaitForMultipleObjects(MAX_THREAD,h_thread,TRUE,-1); //等待所有线程结束
EnterCriticalSection(&CS_SCREEN);
printf("after all threads have finished:\n");
display_thread_residence_memory_list(); //显示驻留线程链表
LeaveCriticalSection(&CS_SCREEN);
//显示线程结束后的空闲区
EnterCriticalSection(&CS_SCREEN);
printf("空闲区域表:\n");
display_freearea_list();
LeaveCriticalSection(&CS_SCREEN);
//删除各种链表
FF_delete_freearea_list();
FF_delete_require_memory_list();
FF_delete_thread_residence_memory_list();
getch();
printf("\n");
}
//最佳适应分配算法的线程:申请内存,驻留一段时间,释放内存
void BF_thread(void *data){
int start_address=-1;
THREAD_RESIDENCE_MEMORY *temp;
EnterCriticalSection(&CS_SCREEN);
printf("create thread:%s\n",((REQUIRE_MEMORY *)(data))->thread_name);
LeaveCriticalSection(&CS_SCREEN);
//申请内存
while(1){
start_address=BF_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,"get memory:");
display_thread_residence_memory_list();
LeaveCriticalSection(&CS_SCREEN);
Sleep(((REQUIRE_MEMORY *)(data))->duration);
//释放内存
BF_release_memory(start_address,((REQUIRE_MEMORY *)(data))->size);
}
//最佳适应分配算法的内存申请函数
int BF_require_memory(int size){
int start_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;
}
else
if(sizesize){//分割空闲区结点
start_address=p_next->start_address;
p_next->start_address+=size;
p_next->size-=size;
p->next=p_next->next;
BF_insert_freearea(p_next);
break;
}
else
{
p=p_next;
p_next=p_next->next;
}
}
LeaveCriticalSection(&CS_FREEAREA_LIST);
return start_address;
}
//最佳适应分配算法的内存释放函数
void BF_release_memory(int start_address,int size){
EnterCriticalSection(&CS_FREEAREA_LIST);
FREEAREA *temp,*p,*pp;
//将空闲区按start_address由小到大排序,以便整合相邻空闲区
while(1){
int change = 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 = new FREEAREA;
p = new FREEAREA;
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;
}
else if(temp->next == p_free_area_list){
p_free_area_list = temp;
}
//整合碎片
while(1){
int change = 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;
change = 1;
if(p->next->next == NULL){
free(p->next);
p->next = NULL;
}
else{
p->next = p->next->next;
}
}
if(p->next == NULL){
break;
}
else{
p = p->next ;
}
}
if(change == 0){
break;
}
}
//将空闲区按SIZE由小到大排序,以便符合BF算法
while(1){
int change = 0;
p = p_free_area_list;
if(p->size > p->next->size){
pp = p->next;
p->next = pp->next;
pp->next = p;
p_free_area_list = pp;
change = 1;
}
while(p->next->next != NULL){
if(p->next->size > p->next->next->size ){
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;
}
}
//整理线程结束后的驻留链表
THREAD_RESIDENCE_MEMORY *q;
q = p_thread_residence_memory_list;
if(q->start_address == start_address){
p_thread_residence_memory_list = p_thread_residence_memory_list->next ;
}
else{
while(q->next != NULL){
if(q->next->start_address == start_address){
if(q->next == tail_thread_residence_memory_list){
tail_thread_residence_memory_list = q;
}
q->next = q->next->next ;
break;
}
q = q->next;
}
}
LeaveCriticalSection(&CS_FREEAREA_LIST);
}
//最佳分配算法的空闲区结点插入函数
void BF_insert_freearea(FREEAREA *free_node){
FREEAREA *p;
FREEAREA *p_next;
if(p_free_area_list==NULL)
p_free_area_list=free_node;
else{
p_next=p=p_free_area_list;
while(p_next!=NULL&&p_next->sizesize){
p=p_next;
p_next=p_next->next;
}
if(p_next==NULL) //应插入到尾部
p->next=free_node;
else
if(p==p_next){ //应插入到头部
free_node->next=p;
p_free_area_list=free_node;
}
else{ //应插入到p与p_next之间
free_node->next=p_next;
p->next=free_node;
}
}
}
//最佳适应分配法:初始化空闲区链表
void BF_initialize_freearea_list(FREEAREA *init_table,int num){
FREEAREA *temp;
int i;
for(i=0;istart_address=init_table[i].start_address;
temp->size=init_table[i].size;
temp->next=NULL;
BF_insert_freearea(temp);
}
}
//最佳分配算法的初始化程序
void BF(){
int i=0;
REQUIRE_MEMORY *p;
HANDLE h_thread[MAX_THREAD];
InitializeCriticalSection(&CS_THREAD_MEMORY_LIST);
InitializeCriticalSection(&CS_FREEAREA_LIST);
InitializeCriticalSection(&CS_SCREEN);
printf("最佳适应分配算法\n");
BF_initialize_freearea_list(init_free_area_table,5); p_thread_require_memory_queue=BF_initialize_require_memory_list(init_thread_require_memor
y_table,3);
p_thread_residence_memory_list=BF_initialize_thread_residence_memory_list(init_thread_reside
nce_memory_table,5);
p=p_thread_require_memory_queue;
while(p!=NULL){
h_thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(BF_thread),p,0,NULL);
i++;
p=p->next;
};
//等待所有线程结束
WaitForMultipleObjects(MAX_THREAD,h_thread,TRUE,-1);
//显示驻留线程链表
EnterCriticalSection(&CS_SCREEN);
printf("after all threads have finished:\n");
display_thread_residence_memory_list();
LeaveCriticalSection(&CS_SCREEN);
//显示线程结束后的空闲区
EnterCriticalSection(&CS_SCREEN);
printf("空闲区域表:\n");
display_freearea_list();
LeaveCriticalSection(&CS_SCREEN);
//删除各种链表
FF_delete_freearea_list();
FF_delete_require_memory_list();
FF_delete_thread_residence_memory_list();
getch();
printf("\n");
}
//最坏适应分配算法的线程:申请内存,驻留一段时间,释放内存
void WF_thread(void *data){
int start_address=-1;
THREAD_RESIDENCE_MEMORY *temp;
EnterCriticalSection(&CS_SCREEN);
printf("create thread:%s\n",((REQUIRE_MEMORY *)(data))->thread_name);
LeaveCriticalSection(&CS_SCREEN);
//申请内存
while(1){
start_address=WF_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,"get memory:");
display_thread_residence_memory_list();
LeaveCriticalSection(&CS_SCREEN);
Sleep(((REQUIRE_MEMORY *)(data))->duration);
//释放内存
WF_release_memory(start_address,((REQUIRE_MEMORY *)(data))->size);
}
//最坏分配算法的空闲区结点插入函数
void WF_insert_freearea(FREEAREA *free_node){
FREEAREA *p;
FREEAREA *p_next;
if(p_free_area_list==NULL)
p_free_area_list=free_node;
else{
p=p_next=p_free_area_list;
while(p_next!=NULL&&free_node->sizesize){
p=p_next;
p_next=p_next->next;
}
if(p_next==NULL) //应插入到尾部
p->next=free_node;
else
if(p==p_next){ //应插入到头部
free_node->next=p;
p_free_area_list=free_node;
}
else{ //应插入到p与p_next之间
free_node->next=p_next;
p->next=free_node;
}
}
}
//最坏适应分配法:初始化空闲区链表
void WF_initialize_freearea_list(FREEAREA *init_table,int num){
FREEAREA *temp;
int i;
for(i=0;istart_address=init_table[i].start_address;
temp->size=init_table[i].size;
temp->next=NULL;
WF_insert_freearea(temp);
}
}
//最坏适应分配算法的内存申请函数
int WF_require_memory(int size){
int start_address=-1;
FREEAREA *p_next;
EnterCriticalSection(&CS_FREEAREA_LIST);
p_next=p_free_area_list;
if(size==p_free_area_list->size){//刚好满足要求,删除空闲区结点
start_address=p_next->start_address;
p_free_area_list=p_free_area_list->next;
free(p_next);
}
else
if(sizesize){//分割空闲区结点
start_address=p_next->start_address;
p_next->start_address+=size;
p_next->size-=size;
p_free_area_list=p_free_area_list->next;
WF_insert_freearea(p_next);
}
LeaveCriticalSection(&CS_FREEAREA_LIST);
return start_address;
}
//最坏适应分配算法:内存释放函数
void WF_release_memory(int start_address,int size){
EnterCriticalSection(&CS_FREEAREA_LIST);
FREEAREA *temp,*p,*pp;
//将空闲区按start_address由小到大排序,以便整合相邻空闲区
while(1){
int change = 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 = new FREEAREA;
temp->start_address = start_address;
temp->size = size;
temp->next = NULL;
p = new FREEAREA;
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;
}
else if(temp->next == p_free_area_list){
p_free_area_list = temp;
}
//整合碎片
while(1){
int change = 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;
change = 1;
if(p->next->next == NULL){
free(p->next);
p->next = NULL;
}
else{
p->next = p->next->next;
}
}
if(p->next == NULL){
break;
}
else{
p = p->next ;
}
}
if(change == 0){
break;
}
}
//将空闲区按SIZE由大到小排序,以便符合WF算法
while(1){
int change = 0;
p = p_free_area_list;
if(p->size < p->next->size){
pp = p->next;
p->next = pp->next;
pp->next = p;
p_free_area_list = pp;
change = 1;
}
while(p->next->next != NULL){
if(p->next->size < p->next->next->size ){
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;
}
}
//整理线程结束后的驻留链表
THREAD_RESIDENCE_MEMORY *q;
q = p_thread_residence_memory_list;
if(q->start_address == start_address){
p_thread_residence_memory_list = p_thread_residence_memory_list->next ;
}
else{
while(q->next != NULL){
if(q->next->start_address == start_address){
if(q->next == tail_thread_residence_memory_list){
tail_thread_residence_memory_list = q;
}
q->next = q->next->next ;
break;
}
q = q->next;
}
}
LeaveCriticalSection(&CS_FREEAREA_LIST);
}
//最坏适应分配算法的初始化程序
void WF(){
int i=0;
REQUIRE_MEMORY *p;
HANDLE h_thread[MAX_THREAD];
InitializeCriticalSection(&CS_THREAD_MEMORY_LIST);
InitializeCriticalSection(&CS_FREEAREA_LIST);
InitializeCriticalSection(&CS_SCREEN);
printf("最坏适应分配算法\n");
WF_initialize_freearea_list(init_free_area_table,5); p_thread_require_memory_queue=WF_initialize_require_memory_list(init_thread_require_memo
ry_table,3);
p_thread_residence_memory_list=WF_initialize_thread_residence_memory_list(init_thread_resid
ence_memory_table,5);
p=p_thread_require_memory_queue;
while(p!=NULL){
h_thread[i]=CreateThread(NULL,0,(LPTHREAD_START_ROUTINE)(WF_thread),p,0,NULL);
i++;
p=p->next;
};
//等待所有线程结束
WaitForMultipleObjects(MAX_THREAD,h_thread,TRUE,-1);
//显示驻留线程链表
EnterCriticalSection(&CS_SCREEN);
printf("after all threads have finished:\n");
display_thread_residence_memory_list();
LeaveCriticalSection(&CS_SCREEN);
//显示线程结束后的空闲区
EnterCriticalSection(&CS_SCREEN);
printf("空闲区域表:\n");
display_freearea_list();
LeaveCriticalSection(&CS_SCREEN);
//删除各种链表
FF_delete_freearea_list();
FF_delete_require_memory_list();
FF_delete_thread_residence_memory_list();
getch();
printf("\n");
}
本文档为【假脱机打印程序】,请使用软件OFFICE或WPS软件打开。作品中的文字与图均可以修改和编辑,
图片更改请在作品中右键图片并更换,文字修改请直接点击文字进行修改,也可以新增和删除文档中的内容。
[版权声明] 本站所有资料为用户分享产生,若发现您的权利被侵害,请联系客服邮件isharekefu@iask.cn,我们尽快处理。
本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。
网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。