为了正常的体验网站,请在浏览器设置里面开启Javascript功能!

假脱机打印程序

2018-04-01 45页 doc 92KB 27阅读

用户头像

is_511210

暂无简介

举报
假脱机打印程序假脱机打印程序 #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,我们尽快处理。 本作品所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用。 网站提供的党政主题相关内容(国旗、国徽、党徽..)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。

历史搜索

    清空历史搜索