操作系统的存储管理方式_第1页
操作系统的存储管理方式_第2页
操作系统的存储管理方式_第3页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

1、操作系统实验报告实验名称:操作系统的存储管理方式班级:姓名:学号:类型:实验地点:日期:、实验目的:1. 动态测试 WINDOWS2000/XP 系统内存、实验环境:1. PC机一台(VC C VB等编程环境)三、实验内容和要求:1.了解WINDOWS 用户进程地址空间分布、系统地址空间分布、WINDOWS中用户空间内存分配方式(以页为单位的虚拟内存分配方法)、WINDOWS的内存保护机制。四、实验步骤:#in clude<iostream>#in clude<cstri ng>#in clude<ctime>#i nclude<wi ndows.h&

2、gt; using n amespace std; const int MM_SIZE=100; / 内存块数 const int ROW=10; /绘制内存行数 const int COL=1O; /绘制内存列数 const int NEME_LEN=10; / 名字长度 const int WAITTIME=2000; / 等待时间 int UsedNum=0; /当前已占用的内存块数 int FreeNum=MM_SIZE; /当前空闲的内存块数 int ProCnt=O; /当前用户进程数 int NowID=1; /当前分配的进程编号 int MMMM_SIZE; /Mai n Me

3、m ony/0 ->内存块未被使用/-1 ->内存块在初始化时已被系统占用 /k ->内存块已被分配给 pID=k的用户进程 /* 进程 Obj*/class PROCESS public:PROCESS。:next(0)/构造函数重载,用于构造队列队头 PROCESS(char* Name,int pN):PageNum(pN),next(O) pName=new charNEME LEN;strcpy(pName,Name);PageTable=new intMM_SIZE;for(i nt i=0;i<MM_SIZE;i+)PageTablei=-1; plD=N

4、owlD+;PROCESS()delete pName;delete PageTable;PROCESS* next; /指向下一个进程char* GetpName(void)co nst return pName; / 获取进程名int GetpID(void)co nst return pID; / 获取进程编号int GetPageNum(void)const return PageNum; / 获取进程所需页数 void UnionTable(int i,int j); /关联页号i与块号j(创建页表) void PrintPageTable(void); / 打印页表protecte

5、d:char* pName; / 进程名int pID; /进程编号int PageNum; /进程所需页数int* PageTable; / 页表;PROCESS* ProLinkHead=new PROCESS; / 申请进程队列队头空间 void PROCESS:U nio nTable(i nt i,i nt j)PageTablei=j;return;void PROCESS:Pri ntPageTable(void)cout<<" PAGETABLE (页表)"<<endl;cout<<"页号 ID 块号 ID#&q

6、uot;<<endl;for(i nt i=0;i<MM_SIZE;i+)if(PageTablei!=-1)printf(” %-2d %-2dn",i,PageTablei);cout<<e ndl;return;void In itial_MM(void); / 初始化void Menu(void); / 菜单void CheckMM(void); / 查看内存状态void PrintProList(void); /打印当前用户进程列表void CheckPro(void); / 查看进程状态void CreatePro(void); / 创建新用

7、户进程 void DelPro(void); / 删除用户进程/*主函数*/int main( void)sran d(time(0);In itial_MM();Men u();return 0;/*初始化内存状态*/void In itial_MM(void)memset(MM,0,sizeof(i nt)*MM_SIZE); /缺省所有内存块空闲(0)int USE=rand()%4+2; /初始内存占用系数int UsedMM=MM_SIZE/USE; / 初始内存占用数(占用率=USEMM/MM_SIZE)for(int i=0;i<UsedMM;i+) / 随机分配 Used

8、MM 个内存块给系统(-1)int id;doid=ra nd()%MM_SIZE;while(MMid=-1); / 检查编号为id的内存块是否已分配给系统MMid=-1;UsedNum+=UsedMM;FreeNum-=UsedMM;return;/*菜单*/void Menu (void)int select;while(true)system("cls");cout<<e ndl;cout<<e ndl;cout<<" 1.检查内存的状态"<<endl;cout<<e ndl;cout&

9、lt;<" 2.检查进程的状态"<<endl;cout<<e ndl;cout<<" 3.创建新进程"<<endl;cout<<e ndl;cout<<" 4.删除进程"<<endl;cout<<e ndl;cout<<" 5.退出"<<endl;cout<<e ndl;cout<<e ndl;cin> >select;if(select=5)break;

10、switch(select)case 1:CheckMM();break;case 2:CheckPro();break;case 3:CreatePro();break;case 4:DelPro();break;default:cout<<"出现错误,请重新输入!"<<endl;Sleep(WAITTIME/2);break;return;/*查看内存状态*/void CheckMM(void)system("cls");cout<<e ndl;cout<<"主内存(块号)ID#="

11、<<ROW<<"*iR+jC"<<endl;cout<<" 0C 1C 2C 3C 4C 5C 6C 7C 8C 9C"<<e ndl;for(i nt i=0;i<ROW;i+)printf("%dR ",i);for(i nt j=0;j<COL;j+)prin tf("%2d ”,MMROW*i+j);cout<<e ndl;cout<<" -1 :系统使用的内存"<<endl;cout<

12、;<" 0 :释放内存"<<endl;cout<<" n : PROCESS.n 使用内存"<<endl;cout<<e ndl;cout<<"返回菜单?(Y/N)"<<endl;while(true)char Key;cin> >Key;if(Key='Y' | Key='y') break;cout<<"请输入'Y'."<<endl;cout<&

13、lt;"你现在只能返回菜单 "<<e ndl;return;/*创建新用户进程*/void CreatePro(void)system("cls");cout<<e ndl;cout<<"创建新的进程"<<endl;/*输入新进程参数*/char nameNEME LEN; / 新进程名字int pN; /新进程所需占用的页数cout<<"新进程名字:";cin»n ame;cout<<"新进程页数:";cin&g

14、t; >pN;if(pN>FreeNum) /检查空闲块数是否足够分配给新进程cout<<e ndl;cout<<"内存不足!无法创建该进程,请清理内存再重试"<<endl;cout<<"自动返回菜单"<<endl;Sleep(WAITTIME);return;elseProC nt+;UsedNum+=pN;FreeNum-=pN;/*创建新进程并插入进程队列*/PROCESS* NewPro=new PROCESS(name,pN); / 创建新进程对象并申请空间PROCESS*

15、 tmp=NewPro; /把新进程插入进程队列 tmp->n ext=ProL in kHead->n ext;ProL in kHead->n ext=tmp;/*为进程分配内存*/int j=0;for(i nt i=0;i<pN;i+) /枚举进程页号,为其分配内存块for(;j<MM_SIZE;j+) / 枚举空闲的内存块号 if(MMj=0)MMj=tmp->GetpID();tmp-> Union Table(i,j);break;cout<<e ndl;cout<<"创建进程"<<

16、name<<"成功!"<<endl;cout<<"自动返回菜单"<<endl;Sleep(WAITTIME);return;/*打印当前用户进程列表*/void Prin tProList(void)cout<<e ndl;cout<<"进程状态"<<endl;cout<<"PID PAGENUM 名称"<<endl;PROCESS* p=ProL in kHead;while(p->n ext)p=p

17、->n ext;printf(” %-10s %2d %4dn",p->GetpName(),p->GetplD(),p->GetPageNum();return;/*查看进程状态*/void CheckPro(void)system("cls");Prin tProList();if(ProC nt=O)cout<<"当前不存在任何用户进程"<<e ndl;cout<<"自动返回菜单"<<endl;Sleep(WAITTIME);return;cout

18、<<"输入PID查看指定进程的详细信息:"<<endl;int pid;cin> >pid;bool flag=false; /标记是否找到编号为pid的进程PROCESS* p=ProL in kHead-> next;while(p)if(p->GetpID()!=pid)p=p->n ext;elseflag=true;break;if(!flag)cout<<"输入错误!不存在的进程!"<<endl;elsesystem("cls");cout<

19、;<e ndl;cout<<" PROCESS_"<<p->GetpName()<<'_'<<p->GetplD()<<e ndl;cout<<" PAGENUM(页数):"<<p->GetPageNum()<<endl; cout<<e ndl;p->PrintPageTable(); 打印 pid 进程的页表cout<<"Back to Me nu? (Y/N)"&l

20、t;<e ndl;while(true)char Key;cin> >Key;if(Key='Y' | Key='y')break;cout<<"请输入'Y'"<<endl;cout<<"你现在只能返回菜单 "<<e ndl;return;/*删除用户进程*/void DelPro(void)system("cls");PrintProList(); /先打印用户进程列表int select;cout<<&qu

21、ot; (1)删除指定进程."<<endl;cout<<" (2)删除所有进程."<<endl; cout<<e ndl;while(ci n> >select)if(select=1 | select=2)break;cout<<"错误!"<<endl;cout<<e ndl;if(select=1) /删除指定用户进程int pid;cout<<"输入页号:";cin> >pid;bool flag=f

22、alse; /标记是否找到编号为 pid的进程PROCESS* p仁ProLi nkHead;PROCESS* p2=ProLi nkHead-> next;while(p2)if(p2->GetplD()!=pid)p1=p1- >n ext;p2=p2->n ext;elseflag=true;p1- >n ext=p2->n ext;delete p2; /释放pid进程对象占用的空间break;if(flag)ProC nt-;for(int i=O;i<MM_SIZE;i+)/释放被pid进程占用的内存块if(MMi=pid)MMi=O;UsedNum-;FreeNum+;cout<<"删除成功!"<<endl;elseco

温馨提示

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

评论

0/150

提交评论