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

下载本文档

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

文档简介

操作系统 实验报告实验名称:操作系统的存储管理方式班 级:姓 名:学 号:类 型:实验地点:日 期:一、实验目的:1. 动态测试WINDOWS2000/XP系统内存二、实验环境:1. PC机一台(VC、C、VB等编程环境)三、实验内容和要求:1了解WINDOWS 用户进程地址空间分布、系统地址空间分布、WINDOWS中用户空间内存分配方式(以页为单位的虚拟内存分配方法)、WINDOWS的内存保护机制。四、实验步骤:#include#include#include#includeusing 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 - 内存块未被使用/-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;iMM_SIZE;i+)PageTablei=-1;pID=NowID+;PROCESS()delete 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; /进程编号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;iMM_SIZE;i+)if(PageTablei!=-1)printf( %-2d %-2dn,i,PageTablei);coutendl;return;void Initial_MM(void); /初始化void Menu(void); /菜单void CheckMM(void); /查看内存状态void PrintProList(void); /打印当前用户进程列表void CheckPro(void); /查看进程状态void CreatePro(void); /创建新用户进程void DelPro(void); /删除用户进程/*主函数*/int main(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;iUsedMM;i+) /随机分配UsedMM 个内存块给系统(-1)int id;doid=rand()%MM_SIZE;while(MMid=-1); /检查编号为id 的内存块是否已分配给系统MMid=-1;UsedNum+=UsedMM;FreeNum-=UsedMM;return;/*菜单*/void Menu(void)int select;while(true)system(cls);coutendl;coutendl;cout 1. 检查内存的状态endl;coutendl;cout 2. 检查进程的状态endl;coutendl;cout 3. 创建新进程endl;coutendl;cout 4. 删除进程endl;coutendl;cout 5.退出endl;coutendl;coutselect;if(select=5)break;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);coutendl;cout 主内存 (块号)ID#=ROW*iR+jCendl;cout 0C 1C 2C 3C 4C 5C 6C 7C 8C 9Cendl;for(int i=0;iROW;i+)printf(%dR ,i);for(int j=0;jCOL;j+)printf(%2d ,MMROW*i+j);coutendl;cout -1 : 系统使用的内存endl;cout 0 : 释放内存endl;cout n : PROCESS_n使用内存endl;coutendl;cout返回菜单? (Y/N)Key;if(Key=Y | Key=y)break;cout请输入 Y.endl;cout你现在只能返回菜单endl;return;/*创建新用户进程*/void CreatePro(void)system(cls);coutendl;cout 创建新的进程endl;/*输入新进程参数*/char nameNEME_LEN; /新进程名字int pN; /新进程所需占用的页数coutname;coutpN;if(pNFreeNum) /检查空闲块数是否足够分配给新进程coutendl;cout内存不足! 无法创建该进程,请清理内存再重试endl;cout自动返回菜单next=ProLinkHead-next;ProLinkHead-next=tmp;/*为进程分配内存*/int j=0;for(int i=0;ipN;i+) /枚举进程页号,为其分配内存块for(;jGetpID();tmp-UnionTable(i,j);break;coutendl;cout创建进程 name 成功!endl;cout自动返回菜单endl;Sleep(WAITTIME);return;/*打印当前用户进程列表*/void PrintProList(void)coutendl;cout 进程状态endl;coutPID PAGENUM名称next)p=p-next;printf( %-10s %2d %4dn,p-GetpName(),p-GetpID(),p-GetPageNum();return;/*查看进程状态*/void CheckPro(void)system(cls);PrintProList();if(ProCnt=0)cout当前不存在任何用户进程endl;cout自动返回菜单endl;Sleep(WAITTIME);return;cout输入PID 查看指定进程的详细信息: pid;bool 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);coutendl;cout PROCESS_GetpName()_GetpID()endl;cout PAGENUM(页数) : GetPageNum()endl;coutPrintPageTable(); /打印pid 进程的页表coutBack to Menu? (Y/N)Key;if(Key=Y | Key=y)break;cout请输入 Yendl;cout你现在只能返回菜单endl;return;/*删除用户进程*/void DelPro(void)system(cls);PrintProList(); /先打印用户进程列表int select;cout (1) 删除指定进程.endl;cout (2) 删除所有进程.endl;coutselect)if(select=1 | select=2)break;cout错误!endl;coutendl;if(select=1) /删除指定用户进程int pid;coutpid;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 进程对象占用的空间break;if(flag)ProCnt-;for(int i=0;iMM_SIZE;i+) /释放被pid 进程占用的内存块if(MMi=pid)MMi=0;UsedNum-;FreeNum+;cout删除成功!endl;elsecout删除失败! 编号为PID 的进程不存在!next;while(p)PROCESS* tmp=p;p=p-next;delete tmp;ProLinkHead-next=0;for(int i=0;i0)MMi=0;UsedNum-;FreeNum+;c

温馨提示

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

评论

0/150

提交评论