版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 操作系统 实验报告实验名称:操作系统的存储管理方式班 级:姓 名:学 号:类 型:实验地点:日 期:一、实验目的:1. 动态测试WINDOWS2000/XP系统内存二、实验环境:1. PC机一台(VC、C、VB等编程环境)三、实验内容和要求:1了解WINDOWS 用户进程地址空间分布、系统地址空间分布、WINDOWS中用户空间内存分配方式(以页为单位的虚拟内存分配方法)、WINDOWS的内存保护机制。四、实验步骤:#include<iostream>#include<cstring>#include<ctime>#include<windows.h&
2、gt;using namespace std;const int MM_SIZE=100; /内存块数const int ROW=10; /绘制内存行数const int COL=10; /绘制内存列数const int NEME_LEN=10; /名字长度const int WAITTIME=2000; /等待时间int UsedNum=0; /当前已占用的内存块数int FreeNum=MM_SIZE; /当前空闲的内存块数int ProCnt=0; /当前用户进程数int NowID=1; /当前分配的进程编号int MMMM_SIZE; /Main Memony/0 -> 内存块
3、未被使用/-1 -> 内存块在初始化时已被系统占用/k -> 内存块已被分配给pID=k 的用户进程/*进程Obj*/class PROCESSpublic:PROCESS():next(0) /构造函数重载,用于构造队列队头PROCESS(char* Name,int pN):PageNum(pN),next(0)pName=new charNEME_LEN;strcpy(pName,Name);PageTable=new intMM_SIZE;for(int i=0;i<MM_SIZE;i+)PageTablei=-1;pID=NowID+;PROCESS()delete
4、 pName;delete PageTable;PROCESS* next; /指向下一个进程char* GetpName(void)const return pName; /获取进程名int GetpID(void)const return pID; /获取进程编号int GetPageNum(void)const return PageNum; /获取进程所需页数void UnionTable(int i,int j); /关联页号i 与块号j(创建页表)void PrintPageTable(void); /打印页表protected:char* pName; /进程名int pID;
5、/进程编号int PageNum; /进程所需页数int* PageTable; /页表;PROCESS* ProLinkHead=new PROCESS; /申请进程队列队头空间void PROCESS:UnionTable(int i,int j)PageTablei=j;return;void PROCESS:PrintPageTable(void)cout<<" PAGETABLE (页表)"<<endl;cout<<" 页号ID 块号ID#"<<endl;for(int i=0;i<MM_S
6、IZE;i+)if(PageTablei!=-1)printf(" %-2d %-2dn",i,PageTablei);cout<<endl;return;void Initial_MM(void); /初始化void Menu(void); /菜单void CheckMM(void); /查看内存状态void PrintProList(void); /打印当前用户进程列表void CheckPro(void); /查看进程状态void CreatePro(void); /创建新用户进程void DelPro(void); /删除用户进程/*主函数*/int m
7、ain(void)srand(time(0);Initial_MM();Menu();return 0;/*初始化内存状态*/void Initial_MM(void)memset(MM,0,sizeof(int)*MM_SIZE); /缺省所有内存块空闲(0)int USE=rand()%4+2; /初始内存占用系数int UsedMM=MM_SIZE/USE; /初始内存占用数 (占用率=USEMM/MM_SIZE)for(int i=0;i<UsedMM;i+) /随机分配UsedMM 个内存块给系统(-1)int id;doid=rand()%MM_SIZE;while(MMid
8、=-1); /检查编号为id 的内存块是否已分配给系统MMid=-1;UsedNum+=UsedMM;FreeNum-=UsedMM;return;/*菜单*/void Menu(void)int select;while(true)system("cls");cout<<endl;cout<<endl;cout<<" 1. 检查内存的状态"<<endl;cout<<endl;cout<<" 2. 检查进程的状态"<<endl;cout<<
9、endl;cout<<" 3. 创建新进程"<<endl;cout<<endl;cout<<" 4. 删除进程"<<endl;cout<<endl;cout<<" 5.退出"<<endl;cout<<endl;cout<<endl;cin>>select;if(select=5)break;switch(select)case 1:CheckMM();break;case 2:CheckPro();bre
10、ak;case 3:CreatePro();break;case 4:DelPro();break;default:cout<<"出现错误,请重新输入!"<<endl;Sleep(WAITTIME/2);break;return;/*查看内存状态*/void CheckMM(void)system("cls");cout<<endl;cout<<" 主内存 (块号)ID#="<<ROW<<"*iR+jC"<<endl;cout<
11、;<" 0C 1C 2C 3C 4C 5C 6C 7C 8C 9C"<<endl;for(int i=0;i<ROW;i+)printf("%dR ",i);for(int j=0;j<COL;j+)printf("%2d ",MMROW*i+j);cout<<endl;cout<<" -1 : 系统使用的内存"<<endl;cout<<" 0 : 释放内存"<<endl;cout<<"
12、; n : PROCESS_n使用内存"<<endl;cout<<endl;cout<<"返回菜单? (Y/N)"<<endl;while(true)char Key;cin>>Key;if(Key='Y' | Key='y')break;cout<<"请输入 'Y'."<<endl;cout<<"你现在只能返回菜单"<<endl;return;/*创建新用户进程*/vo
13、id CreatePro(void)system("cls");cout<<endl;cout<<" 创建新的进程"<<endl;/*输入新进程参数*/char nameNEME_LEN; /新进程名字int pN; /新进程所需占用的页数cout<<" 新进程名字: "cin>>name;cout<<" 新进程页数: "cin>>pN;if(pN>FreeNum) /检查空闲块数是否足够分配给新进程cout<<e
14、ndl;cout<<"内存不足! 无法创建该进程,请清理内存再重试"<<endl;cout<<"自动返回菜单"<<endl;Sleep(WAITTIME);return;elseProCnt+;UsedNum+=pN;FreeNum-=pN;/*创建新进程并插入进程队列*/PROCESS* NewPro=new PROCESS(name,pN); /创建新进程对象并申请空间PROCESS* tmp=NewPro; /把新进程插入进程队列tmp->next=ProLinkHead->next;Pr
15、oLinkHead->next=tmp;/*为进程分配内存*/int j=0;for(int i=0;i<pN;i+) /枚举进程页号,为其分配内存块for(;j<MM_SIZE;j+) /枚举空闲的内存块号if(MMj=0)MMj=tmp->GetpID();tmp->UnionTable(i,j);break;cout<<endl;cout<<"创建进程 "<<name<<" 成功!"<<endl;cout<<"自动返回菜单"&l
16、t;<endl;Sleep(WAITTIME);return;/*打印当前用户进程列表*/void PrintProList(void)cout<<endl;cout<<" 进程状态"<<endl;cout<<"PID PAGENUM名称"<<endl;PROCESS* p=ProLinkHead;while(p->next)p=p->next;printf(" %-10s %2d %4dn",p->GetpName(),p->GetpID(),
17、p->GetPageNum();return;/*查看进程状态*/void CheckPro(void)system("cls");PrintProList();if(ProCnt=0)cout<<"当前不存在任何用户进程"<<endl;cout<<"自动返回菜单"<<endl;Sleep(WAITTIME);return;cout<<"输入PID 查看指定进程的详细信息: "<<endl;int pid;cin>>pid;b
18、ool flag=false; /标记是否找到编号为pid 的进程PROCESS* p=ProLinkHead->next;while(p)if(p->GetpID()!=pid)p=p->next;elseflag=true;break;if(!flag)cout<<"输入错误! 不存在的进程!"<<endl;elsesystem("cls");cout<<endl;cout<<" PROCESS_"<<p->GetpName()<<
19、39;_'<<p->GetpID()<<endl;cout<<" PAGENUM(页数) : "<<p->GetPageNum()<<endl;cout<<endl;p->PrintPageTable(); /打印pid 进程的页表cout<<"Back to Menu? (Y/N)"<<endl;while(true)char Key;cin>>Key;if(Key='Y' | Key='y
20、9;)break;cout<<"请输入 'Y'"<<endl;cout<<"你现在只能返回菜单"<<endl;return;/*删除用户进程*/void DelPro(void)system("cls");PrintProList(); /先打印用户进程列表int select;cout<<" (1) 删除指定进程."<<endl;cout<<" (2) 删除所有进程."<<endl;
21、cout<<endl;while(cin>>select)if(select=1 | select=2)break;cout<<"错误!"<<endl;cout<<endl;if(select=1) /删除指定用户进程int pid;cout<<"输入页号 : "cin>>pid;bool flag=false; /标记是否找到编号为pid 的进程PROCESS* p1=ProLinkHead;PROCESS* p2=ProLinkHead->next;while(p2)if(p2->GetpID()!=pid)p1=p1->next;p2=p2->next;elseflag=true;p1->next=p2->next;delete p2; /释放pid 进程对象占用的空间br
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 化学01(云南、贵州、广西、甘肃专用)(考试版及全解全析)-2026年高考考前预测卷
- 证照补办流程材料核验事务细则
- 犬猫异物吞食处置方案
- 临时设施费分项预算编制办法
- 跨部门协作目标对齐规范
- 月度产能负荷分析报告
- 大数据集群容灾恢复规范指南
- 地下综合管廊交叉作业施工组织方案
- 备件订购后发运顺序稳定管理制度
- 地下室基坑施工排水组织方案
- 购销合同退换货协议
- 2024联易融线上用印软件使用手册
- 中医药膳食疗的养生作用
- 房屋安全鉴定服务投标方案(技术标)
- 2024年二级注册结构工程师专业考试试题及答案(上午卷)
- 典范英语7全文(1-18)
- (一模)石家庄市2025年高三年级教学质量检测(一)物理试卷(含标准答案)
- KTV公关佳丽培训
- DB11-T 1777-2020 人民防空工程维护技术规程
- 2024-2025学年四川省成都实验外国语学校(西区)九年级(上)期中数学试卷
- 大部分分校:地域文化形考任务一-国开(CQ)-国开期末复习资料
评论
0/150
提交评论