logo资料库

操作系统动态存储分配算法.doc

第1页 / 共14页
第2页 / 共14页
第3页 / 共14页
第4页 / 共14页
第5页 / 共14页
第6页 / 共14页
第7页 / 共14页
第8页 / 共14页
资料共14页,剩余部分请下载后查看
郑 州 轻 工 业 学 院 实 验 报 告 课程名称: 操作系统 姓 名: 张立增 学 号: 541503020163 专业班级: 软件工程 15-1 任课教师: 黄伟 2018 年 5 月 28 日
实验三 动态分区存储管理 一、 目的与任务 目的:熟悉并掌握动态分区分配的各种算法,熟悉并掌握动态分区中分区回收的 各种情况,并能够实现分区合并。 任务:用高级语言模拟实现动态分区存储管理。 二、内容、要求与安排 1、实验内容 分区分配算法至少实现首次适应算法、最佳适应算法和最坏适应算法中的至 少一种。熟悉并掌握各种算法的空闲区组织方式。 分区的初始化——可以由用户输入初始分区的大小。(初始化后只有一个空 闲分区,起始地址为 0,大小是用户输入的大小) 分区的动态分配过程:由用户输入作业号和作业的大小,实现分区过程。 分区的回收:用户输入作业号,实现分区回收,同时,分区的合并要体现出 来。(注意:不存在的作业号要给出错误提示!) 分区的显示:任何时刻,可以查看当前内存的情况(起始地址是什么,大小 多大的分区时空闲的,或者占用的,能够显示出来)。 2、实验要求 (1)内存空间不足的情况,要有相应的显示; (2)作业不能同名,但是删除后可以再用这个名字; (3)作业空间回收是输入作业名,回收相应的空间,如果这个作业名不存 在,也要有相应的提示。 三、测试 1. 方案
作业 进程名 情况 到达时间 时间片 服务时间 完成时间 周转时间 RR q=1 A 0 4 15 15 B 1 3 12 11 C 2 4 16 14 带权周转时间 3.75 3.67 3.5 D 3 2 9 6 3 E 4 4 17 13 平均 11.8 3.33 3.46 2. 结果
四、 总结与讨论 通过本次实验,加深了对动态分区存储管理各个算法的理解,同时也明白如 何将课本知识运用到实际的代码操作中,但是个人代码实践能力还有待提升,需 要不断提升自己。 五、附:程序模块的源代码 #include using namespace std; enum Status{FREE,BUSY,OK,ERROR}; struct PST { int ID; int addr; int size; Status state; }; struct Node{ PST data;
Node *back; Node *next; Node() { back=NULL; next=NULL; } Node(int id,int size) { data.ID=id; data.size=size; back=NULL; next=NULL; } }; int area; Node *head,*last; void Init(int area) { head=new Node(); last=new Node(); head->next=last; last->back=head; last->data.addr=0; last->data.ID=0; last->data.size=area; last->data.state=FREE; } Status FFA(int id,int size) { Node*temp=new Node(id,size); temp->data.state=BUSY; Node *cur=head->next; while(cur) { if(cur->data.state==FREE&&cur->data.size==size){ cur->data.ID=id; cur->data.state=BUSY; return OK;
} if(cur->data.state==FREE&&cur->data.size>size){ temp->back=cur->back; temp->next=cur; cur->back->next=temp; temp->data.addr=cur->data.addr; cur->back=temp; cur->data.addr=cur->data.addr+size; cur->data.size=cur->data.size-size; return OK; break; } cur=cur->next; } return ERROR; } Status BFA(int id,int size) { Node*temp=new Node(id,size); temp->data.state=BUSY; int min ; Node*fit; Node*cur=head->next; while(cur){ if(cur->data.state==FREE&&cur->data.size>=size){ fit=cur; min=cur->data.size-size; break; } cur=cur->next; } while(cur) { if(cur->data.state==FREE&&cur->data.size==size){ cur->data.state=BUSY; cur->data.ID=id; return OK; break; } if(cur->data.state==FREE&&cur->data.size>size){
if(cur->data.size-sizedata.size-size; fit=cur; } } cur=cur->next; } if(fit){ temp->back=fit->back; temp->next=fit; fit->back->next=temp; temp->data.addr=fit->data.addr; fit->back=temp; fit->data.addr=fit->data.addr+size; fit->data.size=fit->data.size-size; return OK; } else return ERROR; } Status WFA(int id,int size){ Node*temp=new Node(id,size); temp->data.state=BUSY; int max ; Node*fit; Node*cur=head->next; while(cur){ if(cur->data.state==FREE&&cur->data.size>=size){ fit=cur; max=cur->data.size-size; break; } cur=cur->next; } while(cur){ if(cur->data.state==FREE&&cur->data.size==size){ cur->data.state=BUSY; cur->data.ID=id; return OK; break;
分享到:
收藏