20090402101010郑登辉--模拟内存分配.doc_第1页
20090402101010郑登辉--模拟内存分配.doc_第2页
20090402101010郑登辉--模拟内存分配.doc_第3页
20090402101010郑登辉--模拟内存分配.doc_第4页
20090402101010郑登辉--模拟内存分配.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实 验 报 告学院:计算机科学学院 专业:软件工程 日期:2011年12月26日姓 名郑登辉学 号20090402101010班 级一班指导老师黄干平课程名 称计算机操作系统成 绩实验名 称模拟内存分配的程序1实验目的通过本实验使学生了解和熟悉主存空间的各种分配和回收算法、数据结构及其编程实现方法。分配,就是将一定的内存空间分配给某个进程;回收,就是当进程完成时,将进程所占有的主存空间归还给系统。主存的分配和回收的实现与主存的管理方式有关,也与空间的分配和回收算法和数据结构有关。2实验内容第一题:在可变分区管理方式下采用首次适应算法实现主存空间的分配和回收,采用空闲区说明表数据结构。第二题:采用可变式分区管理,使用最佳适应法实现主存空间的分配和回收,采用空闲区链数据结构。第三题 采用分页存储管理,使用位示图数据结构实现主存的分配和回收。3实验环境Windows 7 和 VS20104实验方法和步骤(含设计)第一题程序流程图按首次适应法排序和显示请选择功能输入进程号,申请空间小,阀值分配成功吗?显示分配后的内存现状YN输入被回收的进程号显示回收后的内存现状程序运行结束C+源程序代码: 此程序由20090402101010-soke工作室制作,引用请注明memoryAssign.h#ifndef MEMORYASSIGN_H #define MEMORYASSIGN_H #include #include#include #include using namespace std;struct memoryArea /采用线性表的顺序存储结构 int startAddress; /进程的起始地址 int size; /进程的大小 string state; /进程的状态 char pnumber; /进程号 ;class memoryAssign public: /公共的类,便于其他函数调用 memoryAssign(); memoryAssign(); void initializeMemory(); /初始化内存表的函数 void print(); /输出当前内存表的函数 void order(); /首次适应法的函数 void functionOption();/switch void assignMemory(); /申请进程,分配空间的函数 void recoverMemory(); /撤销进程,回收空间的函数 protected: private: /私有的类,避免其他函数中的变量对某函数中变量的影响 int i,j; int count; memoryArea *area; ;#endif / MEMORYASSIGN_HmemoryAssign:memoryAssign() count=7; initializeMemory(); order(); memoryAssign:memoryAssign()void memoryAssign:initializeMemory() /初始化内存表的函数 for(i=0;icount;i+) memoryArea *newArea=new memoryArea; cout起始地址、分区大小、状态、进程号newArea-startAddressnewArea-sizenewArea-statenewArea-pnumber; areai=newArea; void memoryAssign:order()/首次适应法的函数,将“空闲区”按起始地址从小到大的顺序排序 memoryArea *temp; for(i=0;icount;i+) for(j=0;jstartAddressareaj+1-startAddress) temp=areaj; areaj=areaj+1; areaj+1=temp; functionOption(); void memoryAssign:print() /输出当前内存表的函数 coutsetw(10)起始地址setw(10)分区大小setw(10)状态setw(10)进程号endl; for(i=0;icount;i+)coutsetw(10)startAddresssetw(10)sizesetw(10)statesetw(9)进程pnumberendl; functionOption(); void memoryAssign:functionOption()/switch,选择要执行的功能 cout你想干吗.endl; coutsetw(12)1.分配内存setw(12)2.回收内存setw(12)3.查看内存setw(12)4.退出i; switch(i) case 1:assignMemory();break; case 2:recoverMemory();break;case 3:print();break; case 4:break; default:cout输入错误哦.endl;functionOption(); void memoryAssign:assignMemory() /申请进程,分配空间的函数 int x,y;char z; bool found=false; memoryArea *newArea=new memoryArea; cout请输入进程号、申请空间大小和阙值:zxy; i=0; for(i=0;isize-x=y&areai-pnumber=?) /找到所需空间,分配成功 count+; areai-size=areai-size-x; for(j=count;ji+1;j-) areaj-1=areaj-2; newArea-pnumber=z; newArea-size=x; newArea-state=已分; newArea-startAddress=areai-startAddress+areai-size; areai+1=newArea; found=true; cout分配成功size-xy) cout无足够空间,分配失败endl; i+; order(); void memoryAssign:recoverMemory() /撤销进程,回收空间的函数 char x; bool found=false; memoryArea *temp; cout请输入要回收进程号:x; i=0; while(ipnumber) found=true;if(areai-1-pnumber=?&areai+1-pnumber=?) count=count-2; areai-1-size=areai-1-size+areai+1-size+areai-size; temp=areai; delete temp; temp=areai+1; delete temp; for(j=i;jpnumber=?) count=count-1; areai-1-size=areai-1-size+areai-size; temp=areai; delete temp; for(j=i;jpnumber=?) count=count-1; areai-size=areai-size+areai+1-size; areai-pnumber=?; areai-state=空闲; temp=areai+1; delete temp; for(j=i;jpnumber=?; areai-state=空闲; cout回收成功endl; i+; order(); int main() memoryAssign sb; / 创建一个memoryAssign类的对象 sb程序中使用的数据结构和符号变量的说明:struct memoryArea /采用线性表的顺序存储结构 int startAddress; /进程的起始地址 int size; /进程的大小string state; /进程的状态 char pnumber; /进程号 ;程序截图: 第二题程序流程图按最佳适应法排序和显示请选择功能输入进程号,申请空间小,阀值分配成功吗?显示分配后的内存现状YN输入被回收的进程号显示回收后的内存现状程序运行结束C+源程序代码: 此程序由20090402101010-soke工作室制作,引用请注明#ifndef MEMORYASSIGN_H #define MEMORYASSIGN_H #include #include#include #include using namespace std;struct memoryArea int startAddress; /进程的起始地址 int size; /进程的大小 string state; /进程的状态 char pnumber; /进程号 memoryArea *next; ;class memoryAssignpublic: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;icount;i+) memoryArea *newArea=new memoryArea; cout起始地址、分区大小、状态、进程号newArea-startAddressnewArea-sizenewArea-statenewArea-pnumber; newArea-next=NULL; if(first=NULL) first=newArea; end=newArea; else end-next=newArea; end=newArea; order(); void memoryAssign:print()/输出当前内存表的函数 memoryArea *current=first;/当前节点 coutsetw(10)起始地址setw(10)分区大小setw(10)状态setw(10)进程号endl; while(current!=NULL)coutsetw(10)startAddresssetw(10)sizesetw(10)statesetw(9)pnumbernext; 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你想干吗.endl; coutsetw(12)1.分配内存setw(12)2.回收内存setw(12)3.查看内存setw(12)4.退出i; switch(i) case 1:assignMemory();break; case 2:recoverMemory();break; case 3:print();break; case 4:break; default:cout输入错误哦.endl;functionOption(); void memoryAssign:assignMemory() memoryArea *current=first;/当前节点 int x,y;char z; bool found=false; memoryArea *newArea=new memoryArea; cout请输入进程号、申请空间大小和阙值:zxy; 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-xy) cout无足够空间,分配失败next; 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-

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论