收藏 分销(赏)

操作系统课程设计——动态异长分区的存储分配与回收算法.doc

上传人:Fis****915 文档编号:554585 上传时间:2023-12-08 格式:DOC 页数:15 大小:270KB 下载积分:6 金币
下载 相关 举报
操作系统课程设计——动态异长分区的存储分配与回收算法.doc_第1页
第1页 / 共15页
操作系统课程设计——动态异长分区的存储分配与回收算法.doc_第2页
第2页 / 共15页


点击查看更多>>
资源描述
//该文件所含代码是课设需要学生自己写的代码和补充的代码,包含部分需要修改的课程设计指导书中的代码,不包含不需修改的代码 //1.显示空闲区表 void display_freearea_list(){ FREEAREA *p; char buffer[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"); } //2.最先适应分配法:内存释放函数 void FF_release_memory(int start_address,int size){ EnterCriticalSection(&CS_FREEAREA_LIST); __int64 t1, t2; //记录该算法起止时间 t1 = GetCycleCount(); //记录起始时间 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; } } //记录结束时间,并将运行时间存入对应数组 t2 = GetCycleCount(); if(time[0][0] > t2 - t1){ time[0][0] = t2 - t1; } if(time[0][1] < t2 - t1){ time[0][1] = t2 - t1; } LeaveCriticalSection(&CS_FREEAREA_LIST); } //3.最佳适应分配算法的内存释放函数 void BF_release_memory(int start_address,int size){ EnterCriticalSection(&CS_FREEAREA_LIST); __int64 t1, t2; //记录该算法起止时间 t1 = GetCycleCount(); //记录起始时间 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; } } //记录结束时间,并将运行时间存入对应数组 t2 = GetCycleCount(); if(time[1][0] > t2 - t1){ time[1][0] = t2 - t1; } if(time[1][1] < t2 - t1){ time[1][1] = t2 - t1; } LeaveCriticalSection(&CS_FREEAREA_LIST); } //4.最坏适应分配算法:内存释放函数 void WF_release_memory(int start_address,int size){ EnterCriticalSection(&CS_FREEAREA_LIST); __int64 t1, t2; //记录该算法起止时间 t1 = GetCycleCount(); //记录起始时间 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; } } //记录结束时间,并将运行时间存入对应数组 t2 = GetCycleCount(); if(time[2][0] > t2 - t1){ time[2][0] = t2 - t1; } if(time[2][1] < t2 - t1){ time[2][1] = t2 - t1; } LeaveCriticalSection(&CS_FREEAREA_LIST); } //5.二维数组,用于存放各种算法所需的最长时间和最短时间 __int64 time[3][2] = {{99999999,0},{99999999,0},{99999999,0}}; //6.显示程序运行时间 void display_time(int n){ EnterCriticalSection(&CS_SCREEN); printf("最短时间:%ld纳秒\n",time[n][0]); printf("最长时间:%ld纳秒\n",time[n][1]); LeaveCriticalSection(&CS_SCREEN); } //7.在FF()、BF()、WF()中的删除各链表操作前加入以下代码 void FF(){ …… …… …… //显示线程结束后的空闲区 EnterCriticalSection(&CS_SCREEN); printf("空闲区:\n"); display_freearea_list(); LeaveCriticalSection(&CS_SCREEN); //显示该算法所需时间 display_time(0); //删除各种链表 …… …… …… } void BF(){ …… …… …… //显示线程结束后的空闲区 EnterCriticalSection(&CS_SCREEN); printf("空闲区:\n"); display_freearea_list(); LeaveCriticalSection(&CS_SCREEN); //显示该算法所需时间 display_time(1); //删除各种链表 …… …… …… } void WF(){ …… …… …… //显示线程结束后的空闲区 EnterCriticalSection(&CS_SCREEN); printf("空闲区:\n"); display_freearea_list(); LeaveCriticalSection(&CS_SCREEN); //显示该算法所需时间 display_time(2); //删除各种链表 …… …… …… } //8.设置计算时间的函数RDTSC方法 __inline unsigned __int64 GetCycleCount() { __asm _emit 0x0F __asm _emit 0x31 } //9.获取当前时间 t = GetCycleCount(); 主界面: FF的运行结果 BF的运行结果 WF的运行结果
展开阅读全文

开通  VIP会员、SVIP会员  优惠大
下载10份以上建议开通VIP会员
下载20份以上建议开通SVIP会员


开通VIP      成为共赢上传

当前位置:首页 > 教育专区 > 其他

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        抽奖活动

©2010-2025 宁波自信网络信息技术有限公司  版权所有

客服电话:4009-655-100  投诉/维权电话:18658249818

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :微信公众号    抖音    微博    LOFTER 

客服