logo资料库

操作系统实验报告--模拟内存分配程序.doc

第1页 / 共8页
第2页 / 共8页
第3页 / 共8页
第4页 / 共8页
第5页 / 共8页
第6页 / 共8页
第7页 / 共8页
第8页 / 共8页
资料共8页,全文预览结束
实 验 报 告 学院:计算机科学学院 专业:软件工程 日期:2011 年 12 月 26 日 姓 名 郑登辉 学 号 20090402101010 班 级 一班 指导老师 黄干平 计算机操作系统 成 绩 模拟内存分配的程序 课 程 名 称 实 验 名 称 1.实验目的 通过本实验使学生了解和熟悉主存空间的各种分配和回收算法、数据结构及其编程实现方 法。分配,就是将一定的内存空间分配给某个进程;回收,就是当进程完成时,将进程所占 有的主存空间归还给系统。主存的分配和回收的实现与主存的管理方式有关,也与空间的分 配和回收算法和数据结构有关。 2.实验内容 第一题:在可变分区管理方式下采用首次适应算法实现主存空间的分配和回收,采用空闲区说 明表数据结构。 第二题:采用可变式分区管理,使用最佳适应法实现主存空间的分配和回收,采用空闲区链数据结构。 第三题 采用分页存储管理,使用位示图数据结构实现主存的分配和回收。 3.实验环境 Windows 7 和 VS2010 1
4.实验方法和步骤(含设计) 第一题程序流程图 按首次适应法排序和显示 输入进程号, 申请空间小, 阀值 ⑴ ⑵ 请选择功能 输 入 被 回 收 的 进 程 N ⑶ 分配成功吗? Y 显示分配后的内存现状 显示回收后的内存现状 程序运行结束 C++源程序代码: memoryAssign.h #ifndef MEMORYASSIGN_H #include struct memoryArea { int startAddress; string state; class memoryAssign { 此程序由 20090402101010--soke 工作室制作,引用请注明 #define MEMORYASSIGN_H #include #include #include //采用线性表的顺序存储结构 using namespace std; //进程的起始地址 int size; //进程的大小 //进程的状态 char pnumber; //进程号 }; void initializeMemory(); ~memoryAssign(); //输出当前内存表的函数 //公共的类,便于其他函数调用 public: memoryAssign(); void print(); void functionOption();//switch void recoverMemory(); //撤销进程,回收空间的函数 protected: private: //私有的类,避免其他函数中的变量对某函数中变量的影响 int i,j; memoryArea *area[]; void order(); int count; }; //初始化内存表的函数 //首次适应法的函数 void assignMemory(); //申请进程,分配空间的函数 count=7; initializeMemory(); #endif // MEMORYASSIGN_H memoryAssign::memoryAssign() { memoryAssign::~memoryAssign() {…} void memoryAssign::initializeMemory() //初始化内存表的函数 { order(); } for(i=0;i>newArea->startAddress>>newArea->size>>newArea->state>>newArea->pnumber; 2
void memoryAssign::order()//首次适应法的函数,将“空闲区”按起始地址从小到大的顺序排序 { area[i]=newArea; } } memoryArea *temp; for(i=0;istartAddress>area[j+1]->startAddress) { area[j]=area[j+1]; temp=area[j]; area[j+1]=temp; } } } functionOption(); } void memoryAssign::print() { //输出当前内存表的函数 cout<startAddress<size<state<pnumber<>i; switch(i){ case 1:assignMemory();break; case 2:recoverMemory();break; case 3:print();break; case 4:break; void memoryAssign::assignMemory() { default:cout<<输入错误哦..."<>z>>x>>y; for(i=0;isize-x>=y&&area[i]->pnumber=='?') //找到所需空间,分配成功 { area[i]->size=area[i]->size-x; area[j-1]=area[j-2];} count++; for(j=count;j>i+1;j--){ newArea->pnumber=z; newArea->startAddress=area[i]->startAddress+area[i]->size; area[i+1]=newArea; cout<<"分配成功"<size=x; found=true; } newArea->state="已分"; else if(i=count-1&¤t->size-xpnumber) { //撤销进程,回收空间的函数 memoryArea *temp; cin>>x; i=0; found=true; if(area[i-1]->pnumber=='?'&&area[i+1]->pnumber=='?') { count=count-2; area[i-1]->size=area[i-1]->size+area[i+1]->size+area[i]->size; temp=area[i]; for(j=i;jpnumber=='?') { count=count-1; area[i-1]->size=area[i-1]->size+area[i]->size; 3
temp=area[i]; for(j=i;jpnumber=='?') { count=count-1; area[i]->pnumber='?'; for(j=i;jstate="空闲"; area[i]->size=area[i]->size+area[i+1]->size; temp=area[i+1]; delete temp; else { area[i]->pnumber='?'; cout<<"回收成功"<state="空闲";} int main() { memoryAssign sb; // 创建一个 memoryAssign 类的对象 sb } 程序中使用的数据结构和符号变量的说明: struct memoryArea { //进程的起始地址 //采用线性表的顺序存储结构 int startAddress; string state; //进程的状态 程序截图: int size; //进程的大小 char pnumber; //进程号 }; 第二 4
题程序流程图 按最佳适应法排序和显示 输入进程号, 申请空间小, 阀值 ⑴ ⑵ 请选择功能 输 入 被 回 收 的 进 程 N ⑶ 分配成功吗? Y 显示分配后的内存现状 显示回收后的内存现状 程序运行结束 C++源程序代码: #ifndef MEMORYASSIGN_H 此程序由 20090402101010--soke 工作室制作,引用请注明 #define MEMORYASSIGN_H #include #include #include #include using namespace std; struct memoryArea { int startAddress; //进程的起始地址 int size; //进程的大小 string state; //进程的状态 char pnumber; //进程号 memoryArea *next; }; class memoryAssign {public:memoryAssign(); ~memoryAssign(); void initializeMemory();//初始化内存表的函数 void print();//输出当前内存表的函数 void functionOption();//switch void order();//最佳适应法函数 void assignMemory();//申请进程,分配空间的函数 void recoverMemory(); //撤销进程,回收空间的函数 protected: private: int i,j; int count; memoryArea *first;//头指针 memoryArea *end;//尾指针 memoryArea *area[]; }; #endif memoryAssign::memoryAssign() { count=7; first=NULL; end=NULL; initializeMemory(); order(); } memoryAssign::~memoryAssign(){…} void memoryAssign::initializeMemory() //初始化内存表的函数 { for(i=0;i>newArea->startAddress>>newArea->size>>newArea->state>>newArea->pnumber; newArea->next=NULL; if(first==NULL) { first=newArea; end=newArea; } else{ end->next=newArea; end=newArea; } } order(); } void memoryAssign::print()//输出当前内存表的函数 { memoryArea *current=first;//当前节点 cout<startAddress<size<state<
<pnumber<next; } functionOption(); } void memoryAssign::order()//最佳适应法函数,按“空闲区”的大小从小到大排序 { memoryArea *current;//当前节点 memoryArea *min,*p_min,*head=NULL,*tail=NULL; while(first!=NULL) { for(current=first,min=first;current->next!=NULL;current=current->next) { if(current->next->sizesize) { p_min=current; min=current->next; } } if(head==NULL)//建立新的有序链表 { head=min; tail=min; } else{ tail->next=min; tail=min; } if(min==first)//删除原链表 {first=first->next; } else{ p_min->next=min->next; } } first=head; end=tail; functionOption(); } void memoryAssign::functionOption() { cout<<"你想干吗..."<>i; switch(i) { case 1:assignMemory();break; case 2:recoverMemory();break; case 3:print();break; case 4:break; default:cout<<"输入错误哦..."<>z>>x>>y; i=0; for(i=0;isize-x>=y&¤t->pnumber=='?') { found=true; current->size=current->size-x; newArea->pnumber=z; newArea->size=x; newArea->state="已分"; newArea->startAddress=current->startAddress+current->size; newArea->next=NULL; end->next=newArea; end=newArea; cout<<"分配成功"<size-xnext; } order(); } void memoryAssign::recoverMemory() { memoryArea *current=first;//当前节点 memoryArea *tailcurrent=NULL;//前一个节点 char x; bool found=false; memoryArea *temp; cout<<"请输入要回收进程号:"<>x; i=0; while(current->next!=NULL&&!found) { if(x==current->pnumber) { found=true; if(tailcurrent->pnumber=='?'&¤t->next->pnumber=='?') { tailcurrent->size=tailcurrent->size+current->next->size+current->size; temp=current; tailcurrent->next=tailcurrent->next->next->next; delete temp->next; delete temp; } else if(tailcurrent->pnumber=='?') { tailcurrent->size=tailcurrent->size+current->size; temp=current; tailcurrent->next=tailcurrent->next->next; delete temp; } else if(current->next->pnumber=='?') { current->size=current->size+current->next->size; current->pnumber='?'; area[i]->state="空闲"; temp=current->next; current->next=current->next->next; delete temp; } else{ current->pnumber='?'; current->state="空闲";} } tailcurrent=current; current=current->next; } order(); } 6
int main() { memoryAssign sb; } 程序中使用的数据结构和符号变量的说明: struct memoryArea //采用线性表的链式存储结构 { int startAddress; //进程的起始地址 int size; //进程的大小 string state; //进程的状态 char pnumber; //进程号 memoryArea *next; }; 程序截图: 7
5.实验分析、感想 通过本实验使学生了解和熟悉主存空间的各种分配和回收算法、数据结构 及其编程实现方法。分配,就是将一定的内存空间分配给某个进程;回收,就 是当进程完成时,将进程所占有的主存空间归还给系统。主存的分配和回收的 实现与主存的管理方式有关,也与空间的分配和回收算法和数据结构有关。 教师评语 实验日期 :2011 年 12 月 5 日 签名: 年 月 日 8
分享到:
收藏