课 程 设 计 说 明 书 |
|
课程设计名称 |
操作系统导论课程设计 |
专 业 |
|
班 级 |
|
学生姓名 |
|
指导教师 |
|
2023 年 5月 29 日
|
|||
|
资源管理软件的设计 |
||
起止日期 |
2023年 5月29 日— 2023年 6 月9 日 |
设计地点 |
|
设计任务及日程安排: 设计任务:
日程安排: 本次设计共二周时间,日程安排如下: 第1-2天:分析动态异长分区的分配去配算法,并进行功能扩充,编写设计报告; 第3-4天:分析与设计哲学家就餐问题,编写设计报告; 第5天:第一阶段检查。 第6-7天:分析读者/写者问题,并设计新的测试数据进行测试,编写设计报告; 第8-9天:完成假脱机打印程序,编写设计报告; 第10天:课程考核。 设计报告要求:
|
设计3 动态异长分区内存分配与去配算法的设计-最差适应算法
1.设计目的
理解存储管理的功能,掌握动态异长分区内存管理中的最差适应算法。
2.设计要求
本设计要求模拟最差适应算法的分配算法和回收算法。
3.数据结构
struct freearea{ //表示空闲区域的数据结构
struct freearea *next; //指向下一个结点的指针
int start_address; //空闲区起始地址
int size; //空闲区大小
}FREEAREA;
struct require_memory{ //记录线程申请内存的数据结构
struct require_memory *next; //指向下一个结点的指针
char thread_name[10]; //线程名
int size; //申请内存大小(以KB为单位)
int duration; //在内存的驻留时间(以秒为单位)
}REQUIRE_MEMORY;
struct thread_residence_memory{ //描述线程驻留区的数据结构
struct thread_residence_memory *next; //指向下一个结点的指针
char thread_name[10]; //线程名
int start_address; //驻留区起始地址
int size; //驻留区大小
}THREAD_RESIDENCE_MEMORY;
4.算法描述
(1)函数调用关系图:
(2)初始化函数WF()程序流程图:
(3)线程函数WF_thread()程序流程图:
(4)分配函数程序流程图:
(5)回收函数程序流程图:
5.源程序
//最差适应分配算法的内存申请函数
int WF_require_memory(int size){
int start_address;//定义需要找到的空闲区起始地址
FREEAREA* p;//定义移动指针
FREEAREA* p_next;//指向移动指针的下一个地址
FREEAREA* ptr;//记录找到的最大的空闲区
FREEAREA* ptr_f;//记录找到的最大的空闲区的上一个区域
FREEAREA* p_free_area_list_next;//定义头指针的下一个地址
EnterCriticalSection(&CS_FREEAREA_LIST); //保护空闲表临界区
p=p_free_area_list;//空闲区头指针,下一个指针均指向空闲区链表
p_next=p->next;ptr=p;ptr_f=p;
p_free_area_list_next=p_free_area_list->next;
start_address=-1;
while (p->next!=NULL) {//找到空闲分区中尺寸最大的结点
if(ptr->size<p_next->size){
ptr=p_next;
ptr_f=p;
}
p=p_next;
p_next=p_next->next;
}
if(size==ptr->size){//看找到的空闲区是否等于进程的请求
if(ptr==p_free_area_list){
start_address=p_free_area_list->start_address;
p_free_area_list=p_free_area_list_next;
free(ptr);
}
else{
start_address=ptr->start_address;
ptr_f->next=ptr->next;
free(ptr);
}
}
if(size<ptr->size){//如果空闲区大于进程的请求,分割
start_address=ptr->start_address;
ptr->start_address+=size;
ptr->size-=size;
}
//如果小于,分配不了
LeaveCriticalSection(&CS_FREEAREA_LIST); //释放空闲表临界区
return start_address;
}
//最差适应分配算法:内存释放函数//start_address,((REQUIRE_MEMORY *)(data))->size
void WF_release_memory(int start_address,int size){
FREEAREA *p,*pp,*p_pre,*p_next,*temp=p_free_area_list;
int flag=0;//记录合并方式的标识
for(p=p_free_area_list;p!=NULL;p=p->next){//通过循环来查找哪里能合并
if(p->start_address==start_address+size){//第一种合并方法
++flag;
p_next=p;
}
else if(p->start_address+p->size==start_address){//第二种合并方法
flag+=2;
p_pre=p;
}
}
if(flag==0){//如果没有合并区域
p=(FREEAREA *)malloc(sizeof(FREEAREA));
p->start_address=start_address;
p->size=size;
WF_insert_freearea(p);
}
else if(flag==1||flag==2){
if(flag==1){//如果合并方式为第一种
p_next->start_address-=size;
p_next->size+=size;
p=p_next;
}
else{//如果合并方式为第二种
p_pre->size+=size;
p=p_pre;
}
if(p==p_free_area_list){}
else{//如果指针p不为头节点
while(temp->next!=p){
temp=temp->next;
}
if(p->size>=p_free_area_list->size){
temp->next=p->next;
p->next=p_free_area_list;
p_free_area_list=p;
}
else{
if(p->size<=temp->size){}
else{
p_pre=p_free_area_list;
while(p_pre->next->size>p->size){
p_pre=p_pre->next;
}
temp->next=p->next;
p->next=p_pre->next;
p_pre->next=p;
}
}
}
}
else{
if(p_pre==p_free_area_list){
p_pre->size+=p_next->size+size;
while(temp->next!=NULL){
if(temp->next==p_next){
temp->next=p_next->next;
}
}
free(p_next);
}
else if(p_next==p_free_area_list){
p_next->start_address=p_pre->start_address;
p_next->size+=p_pre->size+size;
while(temp->next!=NULL){
if(temp->next==p_pre){
temp->next=p_pre->next;
}
}
free(p_pre);
}
else{
while(temp->next!=NULL){
if(temp->next==p_pre){
temp->next=p_pre->next;
}
if(temp->next==p_next){
temp->next=p_next->next;
}
}
p=(FREEAREA *)malloc(sizeof(FREEAREA));
p->start_address=p_pre->start_address;
p->size=p_pre->size+p_next->size+size;
pp=p_free_area_list;
while(pp->next!=NULL){
if (pp->next==p_pre){
pp->next=p_pre->next;
}
else if(pp->next==p_next){
pp->next=p_next->next;
}
if(pp->next!=NULL){
pp=pp->next;
}
}
free(p_pre);
free(p_next);
WF_insert_freearea(p);
}
}
EnterCriticalSection(&CS_THREAD_MEMORY_LIST);//访问线程驻留区域
THREAD_RESIDENCE_MEMORY *rp=p_thread_residence_memory_list,*f;
while(rp->next->start_address!=start_address)
rp=rp->next;
f=rp->next;
rp->next=f->next;
free(f);
while (rp->next!=NULL)
rp=rp->next;
tail_thread_residence_memory_list=rp;
LeaveCriticalSection(&CS_THREAD_MEMORY_LIST);
}
6.运行结果及分析
测试数据
起始地址 |
0 |
10 |
20 |
40 |
70 |
80 |
85 |
145 |
160 |
180 |
占用者 |
a |
b |
c |
d |
e |