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

下载本文档

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

文档简介

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

2、const int ROW=10; /绘制内存行数 const int COL=1O; /绘制内存列数 const int NEME_LEN=10; / 名字长度 const intWAITTIME=2000; / 等待时间 int UsedNum=0; /当前已占用的内存块数 int FreeNum=MM_SIZE; /当前空闲的内存块数 int ProCnt=O; /当前用户进程数 int NowID=1; /当前分配的进程编号 int MMMM_SIZE; /Mai nMem ony/0 -内存块未被使用/-1 -内存块在初始化时已被系统占用 /k -内存块已被分配给 pID=k 的用户

3、进程 /* 进程 Obj*/class PROCESS public:PROCESS。:next(0)/构造函数重载,用于构造队列队头 PROCESS(char* Name,intpN):PageNum(pN),next(O) pName=new charNEME LEN;strcpy(pName,Name);PageTable=new intMM_SIZE;for(i nt i=0;iMM_SIZE;i+)PageTablei=-1; plD=NowlD+;PROCESS()delete pName;delete PageTable;PROCESS* next; /指向下一个进程char*

4、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); / 打印页表protected:char* pName; / 进程名int pID; /进程编号int PageNum; /进程所需页数int* PageTable; /

5、页表;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#endl;for(i nt i=0;iMM_SIZE;i+)if(PageTablei!=-1)printf(” %-2d %-2dn,i,PageTablei);coute ndl;return;void In itial_MM(

6、void); / 初始化void Menu(void); / 菜单void CheckMM(void); / 查看内存状态void PrintProList(void); /打印当前用户进程列表void CheckPro(void); / 查看进程状态void CreatePro(void); / 创建新用户进程 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,si

7、zeof(i nt)*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=ra nd()%MM_SIZE;while(MMid=-1); / 检查编号为 id 的内存块是否已分配给系统MMid=-1;UsedNum+=UsedMM;FreeNum-=UsedMM;return;/*菜单*/void Menu (void)

8、int select;while(true)system(cls);coute ndl;coute ndl;cout 1.检查内存的状态endl;coute ndl;cout 2.检查进程的状态endl;coute ndl;cout 3.创建新进程endl;coute ndl;cout 4.删除进程endl;coute ndl;cout 5.退出endl;coute ndl;cout select;if(select=5)break;switch(select)case 1:CheckMM();break;case 2:CheckPro();break;case 3:CreatePro();b

9、reak;case 4:DelPro();break;default:cout出现错误,请重新输入!endl;Sleep(WAITTIME/2);break;return;/*查看内存状态*/void CheckMM(void)system(cls);coute ndl;cout主内存(块号)ID#=ROW*iR+jCendl;cout 0C 1C 2C 3C 4C 5C 6C 7C 8C 9Ce ndl;for(i nt i=0;iROW;i+)printf(%dR ,i);for(i nt j=0;jCOL;j+)prin tf(%2d ”,MMROW*i+j);coute ndl;cou

10、t -1 :系统使用的内存endl;cout 0 :释放内存endl;cout n : PROCESS.n 使用内存endl;coute ndl;cout返回菜单?(Y/N) Key;if(Key=Y | Key=y) break;cout请输入Y.endl;cout你现在只能返回菜单 e ndl;return;/*创建新用户进程*/void CreatePro(void)system(cls);coute ndl;cout创建新的进程endl;/*输入新进程参数*/char nameNEME LEN; / 新进程名字int pN; /新进程所需占用的页数cout新进程名字:;cinn ame

11、;cout pN;if(pNFreeNum) /检查空闲块数是否足够分配给新进程coute ndl;cout内存不足!无法创建该进程,请清理内存再重试endl;cout自动返回菜单n ext=ProL in kHead-n ext;ProL in kHead-n ext=tmp;/*为进程分配内存*/int j=0;for(i nt i=0;ipN;i+) /枚举进程页号,为其分配内存块for(;jGetpID();tmp- Union Table(i,j);break;coute ndl;cout创建进程name成功!endl;cout自动返回菜单endl;Sleep(WAITTIME);r

12、eturn;/*打印当前用户进程列表*/void Prin tProList(void)coute ndl;cout进程状态endl;coutPID PAGENUM 名称n ext)p=p-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;

13、cout输入 PID 查看指定进程的详细信息: 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);coute ndl;cout PROCESS_GetpName()_GetplD()e ndl;cout PAGENUM(页数):GetPageNum()endl;coutPrintPageTable();

14、打印 pid 进程的页表coutBack to Me nu? (Y/N) Key;if(Key=Y | Key=y)break;cout请输入Yendl;cout你现在只能返回菜单 e ndl;return;/*删除用户进程*/void DelPro(void)system(cls);PrintProList(); /先打印用户进程列表int select;cout (1)删除指定进程.endl;cout (2)删除所有进程.endl; cout select)if(select=1 | select=2)break;cout错误!endl;coute ndl;if(select=1) /删除

15、指定用户进程int pid;cout pid;bool flag=false; /标记是否找到编号为 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;iMM_SIZE;i+)/释放被 pid 进程占用的内存块if(MMi=pid)MMi=O;UsedNum-;FreeNum+;cout删除成功!endl;elsecout删除失败!编号为 PID 的进程不存在! next;while(p)PROCESS* tmp=p;p=p-n ext;delete tmp;ProL in kHead-n ext=0;for(i nt i=O;i0)MMi=0;UsedNum-;FreeNum+;cout所有进程删除成功!e ndl;cout自动返回菜单endl;Sleep(

温馨提示

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

评论

0/150

提交评论