操作系统实验四.docx
精品文档,仅供学习与交流,如有侵权请联系网站删除学号E11614051 专业计算机科学与技术 姓名施飞宇实验日期2018/11/05 教师签字 成绩实验报告【实验名称】 实验四 主存空间的分配与回收(一)【实验目的】理解在连续分区动态的存储管理方式下,如何实现主存空间的分配与回收。【实验原理】1. 首次适应算法实现主存空间的分配与回收;2. 循环首次适应算法实现主存空间的分配与回收;【实验内容】一. 采用可变式分区管理,使用首次适应算法实现主存空间的分配与回收数据结构:typedef struct pcbchar pnameN;/进程名|分区号 int begin;/起始地址 int end;/结束地址 int length;/进程长度|分区大小char state;/进程状态|分区状态 struct pcb *next;/链表指针PCB;分区和进程同样的数据结构,其内容用链表进行存储。state=y表示已分配内存,state=n表示未进行内存分配。算法流程图:实验代码:/*2018/11/15施飞宇 笃行南楼a202*/#define N 20#include <iostream>#include <stdlib.h>#include <stdio.h>using namespace std;typedef struct pcbchar pnameN;/进程名|分区号 int begin;/起始地址 int end;/结束地址 int length;/长度|分区大小char state;/进程状态|分区状态 struct pcb *next;/链表指针PCB;PCB headinput;/进程链表PCB headarea;/分区链表char number='a'void input_process();/建立进程函数void create_area();/创建分区大小void assign(PCB *Q,PCB *p);/分配内存void colect(PCB *Q,PCB *p);/回收内存void runprocess();/运行进程函数void printp(PCB *p);/输出进程函数void printa(PCB *Q);/输出分区函数void input_process() cout<<"*创建进程*"<<endl;PCB *p1,*p2;cout<<"输入进程数目"<<endl;int num;cin>>num;int i=0;p1=&headinput;p2=p1;for(i=0;i<num;i+)cout<<"输入第"<<i+1<<"进程名,进程大小"<<endl; scanf("%s",p1->pname);cin>>p1->length;p1->begin=p1->end=0;p1->state='n'/n代表未被分配内存p1->next=new PCB;p2=p1;p1=p1->next;delete p1;p1=NULL;p2->next=NULL;void create_area()/创建分区大小PCB *Q1;cout<<"*创建分区*"<<endl;Q1=&headarea;cin>>Q1->pname;Q1->begin=0;Q1->length=20;Q1->end=Q1->begin+Q1->length;Q1->state='n'Q1->next=new PCB;Q1=Q1->next;cin>>Q1->pname;Q1->begin=20;Q1->length=30;Q1->end=Q1->begin+Q1->length;Q1->state='n'Q1->next=new PCB; Q1=Q1->next;cin>>Q1->pname;Q1->begin=50;Q1->length=40;Q1->end=Q1->begin+Q1->length;Q1->state='n'Q1->next=new PCB; Q1=Q1->next;cin>>Q1->pname;Q1->begin=90;Q1->length=50;Q1->end=Q1->begin+Q1->length;Q1->state='n'Q1->next=new PCB; Q1=Q1->next; cin>>Q1->pname;Q1->begin=140;Q1->length=60;Q1->end=Q1->begin+Q1->length;Q1->state='n'Q1->next=NULL; Q1=Q1->next;void assign(PCB *Q,PCB *p)/分配内存 PCB *Q1=Q; PCB *Q2; while(Q1) if(Q1->length>=p->length&&Q1->state!='y') p->begin=Q1->begin; p->end=p->begin+p->length; p->state='y' Q1->state='y' if(Q1->length!=p->length) Q2=new PCB; Q2->next=Q1->next; Q1->next=Q2; Q2->begin=p->end; Q2->end=Q1->end; Q1->end=Q2->begin; Q2->state='n' Q2->length=Q2->end-Q2->begin; Q1->length=p->length; Q2->pname0=char(+number); Q2->pname1='0' return; else Q1=Q1->next; cout<<p->pname<<"未被成功分配内存"<<endl;void colect(PCB *Q,PCB *p)/回收内存 PCB *Q1,*Q2,*Q3; Q1=Q;Q2=Q; while(Q1) if(Q1->begin=p->begin&&Q1->state='y') Q1->state='n' Q1->end=p->end; Q1->length=Q1->end-Q1->begin; if(Q1->next->state='n'&&Q1->next->pname0!='P') Q3=Q1->next; Q1->next=Q3->next; Q1->end=Q3->end; Q1->length=Q1->end-Q1->begin; delete Q3; if(Q1->pname0!='P'&&Q2->state='n') Q2->end=Q1->end; Q2->length=Q2->end-Q2->begin; Q2->next=Q1->next; delete Q1; return; Q2=Q1; Q1=Q1->next;void printp(PCB *p)/输出进程函数 cout<<"进程名 "<<"起始地址 "<<"结束地址 "<<"进程大小"<<" "<<"分配状态(y|n)"<<endl; while(p) cout<<p->pname<<" "<<p->begin<<"k "<<p->end<<"k "<<p->length<<"k "<<p->state<<endl; p=p->next;void printa(PCB *Q)/输出分区函数 cout<<"分区名 "<<"起始地址 "<<"结束地址 "<<"分区大小"<<" "<<"分配状态(y|n)"<<endl; while(Q) cout<<Q->pname<<" "<<Q->begin<<"k "<<Q->end<<"k "<<Q->length<<"k "<<Q->state<<endl; Q=Q->next;int main() input_process();printp(&headinput); create_area();printa(&headarea); PCB *p1,*Q1; p1=&headinput; Q1=&headarea; cout<<"*内存分配*"<<endl; while(p1) assign(Q1,p1); printa(&headarea); p1=p1->next; p1=&headinput; cout<<"*内存回收*"<<endl; while(p1) Q1=&headarea; colect(Q1,p1); printa(&headarea); p1=p1->next; return 0;测试数据:进程名 起始地址 结束地址 进程大小 分配状态(y|n)A 0k 0k 2k nB 0k 0k 3k nC 0k 0k 4k nD 0k 0k 13k nE 0k 0k 23k nF 0k 0k 45k n分区名 起始地址 结束地址 分区大小 分配状态(y|n)P0 0k 20k 20k nP1 20k 50k 30k nP2 50k 90k 40k nP3 90k 140k 50k nP4 140k 200k 60k n运行结果:二. 采用可变式分区管理,使用循环首次适应算法实现主存空间的分配与回收数据结构:typedef struct pcbchar pnameN;/进程名|分区号 int begin;/起始地址 int end;/结束地址 int length;/进程长度|分区大小char state;/进程状态|分区状态 struct pcb *next;/链表指针PCB;分区和进程同样的数据结构,其内容用链表进行存储。state=y表示已分配内存,state=n表示未进行内存分配。算法流程图:程序代码:/*2018/11/15施飞宇 笃行南楼a202*/#define N 20#include <iostream>#include <stdlib.h>#include <stdio.h>using namespace std;typedef struct pcbchar pnameN;/进程名|分区号 int begin;/起始地址 int end;/结束地址 int length;/长度|分区大小char state;/进程状态|分区状态 struct pcb *next;/链表指针PCB;PCB headinput;/进程链表PCB headarea;/分区链表char number='a'void input_process();/建立进程函数void create_area();/创建分区大小PCB * assign(PCB *Q,PCB *p);/分配内存void colect(PCB *Q,PCB *p);/回收内存void runprocess();/运行进程函数void printp(PCB *p);/输出进程函数void printa(PCB *Q);/输出分区函数void input_process() cout<<"*创建进程*"<<endl;PCB *p1,*p2;cout<<"输入进程数目"<<endl;int num;cin>>num;int i=0;p1=&headinput;p2=p1;for(i=0;i<num;i+)cout<<"输入第"<<i+1<<"进程名,进程大小"<<endl; scanf("%s",p1->pname);cin>>p1->length;p1->begin=p1->end=0;p1->state='n'/n代表未被分配内存p1->next=new PCB;p2=p1;p1=p1->next;delete p1;p1=NULL;p2->next=NULL;void create_area()/创建分区大小PCB *Q1;cout<<"*创建分区*"<<endl;Q1=&headarea;cin>>Q1->pname;Q1->begin=0;Q1->length=20;Q1->end=Q1->begin+Q1->length;Q1->state='n'Q1->next=new PCB;Q1=Q1->next;cin>>Q1->pname;Q1->begin=20;Q1->length=30;Q1->end=Q1->begin+Q1->length;Q1->state='n'Q1->next=new PCB; Q1=Q1->next;cin>>Q1->pname;Q1->begin=50;Q1->length=40;Q1->end=Q1->begin+Q1->length;Q1->state='n'Q1->next=new PCB; Q1=Q1->next;cin>>Q1->pname;Q1->begin=90;Q1->length=50;Q1->end=Q1->begin+Q1->length;Q1->state='n'Q1->next=new PCB; Q1=Q1->next; cin>>Q1->pname;Q1->begin=140;Q1->length=60;Q1->end=Q1->begin+Q1->length;Q1->state='n'Q1->next=NULL; Q1=Q1->next;PCB* assign(PCB *Q,PCB *p)/分配内存 PCB *Q1=Q; PCB *Q2; while(Q1) if(Q1->length>=p->length&&Q1->state!='y') p->begin=Q1->begin; p->end=p->begin+p->length; p->state='y' Q1->state='y' if(Q1->length!=p->length) Q2=new PCB; Q2->next=Q1->next; Q1->next=Q2; Q2->begin=p->end; Q2->end=Q1->end; Q1->end=Q2->begin; Q2->state='n' Q2->length=Q2->end-Q2->begin; Q1->length=p->length; Q2->pname0=char(+number); Q2->pname1='0' return Q1; else Q1=Q1->next; cout<<p->pname<<"未被成功分配内存"<<endl;void colect(PCB *Q,PCB *p)/回收内存 PCB *Q1,*Q2,*Q3; Q1=Q;Q2=Q; while(Q1) if(Q1->begin=p->begin&&Q1->state='y') Q1->state='n' Q1->end=p->end; Q1->length=Q1->end-Q1->begin; if(Q1->next->state='n'&&Q1->next->pname0!='P') Q3=Q1->next; Q1->next=Q3->next; Q1->end=Q3->end; Q1->length=Q1->end-Q1->begin; delete Q3; if(Q1->pname0!='P'&&Q2->state='n') Q2->end=Q1->end; Q2->length=Q2->end-Q2->begin; Q2->next=Q1->next; delete Q1; return; Q2=Q1; Q1=Q1->next;void printp(PCB *p)/输出进程函数 cout<<"进程名 "<<"起始地址 "<<"结束地址 "<<"进程大小"<<" "<<"分配状态(y|n)"<<endl; while(p) cout<<p->pname<<" "<<p->begin<<"k "<<p->end<<"k "<<p->length<<"k "<<p->state<<endl; p=p->next;void printa(PCB *Q)/输出分区函数 cout<<"分区名 "<<"起始地址 "<<"结束地址 "<<"分区大小"<<" "<<"分配状态(y|n)"<<endl; while(Q) cout<<Q->pname<<" "<<Q->begin<<"k "<<Q->end<<"k "<<Q->length<<"k "<<Q->state<<endl; Q=Q->next;int main() input_process();printp(&headinput); create_area();printa(&headarea); PCB *p1,*Q1; p1=&headinput; Q1=&headarea; cout<<"*内存分配*"<<endl; while(p1) if(Q1=NULL) Q1=&headarea; Q1=assign(Q1,p1); printa(&headarea); p1=p1->next; p1=&headinput; cout<<"*内存回收*"<<endl; while(p1) Q1=&headarea; colect(Q1,p1); printa(&headarea); p1=p1->next; return 0;测试数据:进程名 起始地址 结束地址 进程大小 分配状态(y|n)A 0k 0k 13k nB 0k 0k 9k nC 0k 0k 23k nD 0k 0k 45k nE 0k 0k 12k nF 0k 0k 25k n分区名 起始地址 结束地址 分区大小 分配状态(y|n)P0 0k 20k 20k nP1 20k 50k 30k nP2 50k 90k 40k nP3 90k 140k 50k nP4 140k 200k 60k n运行结果:【小结或讨论】本次实验理解了在连续分区动态的存储管理方式下,如何实现主存空间的分配与回收。【精品文档】第 15 页