操作系统的存储管理方式.docx
- 文档编号:23717356
- 上传时间:2023-05-20
- 格式:DOCX
- 页数:16
- 大小:61.74KB
操作系统的存储管理方式.docx
《操作系统的存储管理方式.docx》由会员分享,可在线阅读,更多相关《操作系统的存储管理方式.docx(16页珍藏版)》请在冰豆网上搜索。
操作系统的存储管理方式
操作系统实验报告
实验名称:
操作系统的存储管理方式
班级:
姓名:
学号:
类型:
实验地点:
日期:
一、实验目的:
1.动态测试WINDOWS2000/XP系统内存
二、实验环境:
1.PC机一台(VC、C、VB等编程环境)
三、实验内容和要求:
1.了解WINDOWS用户进程地址空间分布、系统地址空间分布、WINDOWS中用户空间内存分配方式(以页为单位的虚拟内存分配方法)、WINDOWS的内存保护机制。
四、实验步骤:
#include
#include
#include
#include
usingnamespacestd;
constintMM_SIZE=100;//内存块数
constintROW=10;//绘制内存行数
constintCOL=10;//绘制内存列数
constintNEME_LEN=10;//名字长度
constintWAITTIME=2000;//等待时间
intUsedNum=0;//当前已占用的内存块数
intFreeNum=MM_SIZE;//当前空闲的内存块数
intProCnt=0;//当前用户进程数
intNowID=1;//当前分配的进程编号
intMM[MM_SIZE];//MainMemony
//0->内存块未被使用
//-1->内存块在初始化时已被系统占用
//k->内存块已被分配给pID=k的用户进程
/*进程Obj*/
classPROCESS
{
public:
PROCESS():
next(0){}//构造函数重载,用于构造队列队头
PROCESS(char*Name,intpN):
PageNum(pN),next(0)
{
pName=newchar[NEME_LEN];
strcpy(pName,Name);
PageTable=newint[MM_SIZE];
for(inti=0;i PageTable[i]=-1; pID=NowID++; } ~PROCESS() { deletepName; deletePageTable; } PROCESS*next;//指向下一个进程 char*GetpName(void)const{returnpName;}//获取进程名 intGetpID(void)const{returnpID;}//获取进程编号 intGetPageNum(void)const{returnPageNum;}//获取进程所需页数 voidUnionTable(inti,intj);//关联页号i与块号j(创建页表) voidPrintPageTable(void);//打印页表 protected: char*pName;//进程名 intpID;//进程编号 intPageNum;//进程所需页数 int*PageTable;//页表 }; PROCESS*ProLinkHead=newPROCESS;//申请进程队列队头空间 voidPROCESS: : UnionTable(inti,intj) { PageTable[i]=j; return; } voidPROCESS: : PrintPageTable(void) { cout<<"PAGETABLE(页表)"< cout<<"页号ID块号ID#"< for(inti=0;i if(PageTable[i]! =-1) printf("%-2d%-2d\n",i,PageTable[i]); cout< return; } voidInitial_MM(void);//初始化 voidMenu(void);//菜单 voidCheckMM(void);//查看内存状态 voidPrintProList(void);//打印当前用户进程列表 voidCheckPro(void);//查看进程状态 voidCreatePro(void);//创建新用户进程 voidDelPro(void);//删除用户进程 /*主函数*/ intmain(void) { srand(time(0)); Initial_MM(); Menu(); return0; } /*初始化内存状态*/ voidInitial_MM(void) { memset(MM,0,sizeof(int)*MM_SIZE);//缺省所有内存块空闲(0) intUSE=rand()%4+2;//初始内存占用系数 intUsedMM=MM_SIZE/USE;//初始内存占用数(占用率=USEMM/MM_SIZE) for(inti=0;i { intid; do { id=rand()%MM_SIZE; }while(MM[id]==-1);//检查编号为id的内存块是否已分配给系统 MM[id]=-1; } UsedNum+=UsedMM; FreeNum-=UsedMM; return; } /*菜单*/ voidMenu(void) { intselect; while(true) { system("cls"); cout< cout< cout<<"1.检查内存的状态"< cout< cout<<"2.检查进程的状态"< cout< cout<<"3.创建新进程"< cout< cout<<"4.删除进程"< cout< cout<<"5.退出"< cout< cout< cin>>select; if(select==5) break; switch(select) { case1: CheckMM();break; case2: CheckPro();break; case3: CreatePro();break; case4: DelPro();break; default: { cout<<"出现错误,请重新输入! ! "< Sleep(WAITTIME/2); break; } } } return; } /*查看内存状态*/ voidCheckMM(void) { system("cls"); cout< cout<<"主内存(块号)ID#="< cout<<"0C1C2C3C4C5C6C7C8C9C"< for(inti=0;i { printf("%dR",i); for(intj=0;j printf("%2d",MM[ROW*i+j]); cout< } cout<<"-1: 系统使用的内存"< cout<<"0: 释放内存"< cout<<"n: PROCESS_n使用内存"< cout< cout<<"返回菜单? (Y/N)"< while(true) { charKey; cin>>Key; if(Key=='Y'||Key=='y') break; cout<<"请输入'Y'..."< cout<<"你现在只能返回菜单"< } return; } /*创建新用户进程*/ voidCreatePro(void) { system("cls"); cout< cout<<"创建新的进程"< /*输入新进程参数*/ charname[NEME_LEN];//新进程名字 intpN;//新进程所需占用的页数 cout<<"新进程名字: "; cin>>name; cout<<"新进程页数: "; cin>>pN; if(pN>FreeNum)//检查空闲块数是否足够分配给新进程 { cout< cout<<"内存不足! 无法创建该进程,请清理内存再重试"< cout<<"自动返回菜单"< Sleep(WAITTIME); return; } else { ProCnt++; UsedNum+=pN; FreeNum-=pN; } /*创建新进程并插入进程队列*/ PROCESS*NewPro=newPROCESS(name,pN);//创建新进程对象并申请空间 PROCESS*tmp=NewPro;//把新进程插入进程队列 tmp->next=ProLinkHead->next; ProLinkHead->next=tmp; /*为进程分配内存*/ intj=0; for(inti=0;i { for(;j if(MM[j]==0) { MM[j]=tmp->GetpID(); tmp->UnionTable(i,j); break; } } cout< cout<<"创建进程"< "< cout<<"自动返回菜单"< Sleep(WAITTIME); return; } /*打印当前用户进程列表*/ voidPrintProList(void) { cout< cout<<"进程状态"< cout<<"PIDPAGENUM名称"< PROCESS*p=ProLinkHead; while(p->next) { p=p->next; printf("%-10s%2d%4d\n",p->GetpName(),p->GetpID(),p->GetPageNum()); } return; } /*查看进程状态*/ voidCheckPro(void) { system("cls"); PrintProList(); if(ProCnt==0) { cout<<"当前不存在任何用户进程"< cout<<"自动返回菜单"< Sleep(WAITTIME); return; } cout<<"输入PID查看指定进程的详细信息: "< intpid; cin>>pid; boolflag=false;//标记是否找到编号为pid的进程 PROCESS*p=ProLinkHead->next; while(p) { if(p->GetpID()! =pid) p=p->next; else { flag=true; break; } } if(! flag) cout<<"输入错误! 不存在的进程! "< else { system("cls"); cout< cout<<"PROCESS_"< cout<<"PAGENUM(页数): "< cout< p->PrintPageTable();//打印pid进程的页表 } cout<<"BacktoMenu? (Y/N)"< while(true) { charKey; cin>>Key; if(Key=='Y'||Key=='y') break; cout<<"请输入'Y'"< cout<<"你现在只能返回菜单"< } return; } /*删除用户进程*/ voidDelPro(void) { system("cls"); PrintProList();//先打印用户进程列表 intselect; cout<<" (1)删除指定进程."< cout<<" (2)删除所有进程."< cout< while(cin>>select) { if(select==1||select==2) break; cout<<"错误! "< } cout< if(select==1)//删除指定用户进程 { intpid; cout<<"输入页号: "; cin>>pid; boolflag=false;//标记是否找到编号为pid的进程 PROCESS*p1=ProLinkHead; PROCESS*p2=ProLinkHead->next; while(p2) { if(p2->GetpID()! =pid) { p1=p1->next; p2=p2->next; } else { flag=true; p1->next=p2->next; deletep2;//释放pid进程对象占用的空间 break; } } if(flag) { ProCnt--; for(inti=0;i if(MM[i]==pid) { MM[i]=0; UsedNum--; FreeNum++; } cout<<"删除成功! "< } else cout<<"删除失败! 编号为PID的进程不存在! "< } else//删除所有用户进程 { NowID=1; ProCnt=0; PROCESS*p=ProLinkHead->next; while(p) { PROCESS*tmp=p; p=p->next; deletetmp; } ProLinkHead->next=0; for(inti=0;i if(MM[i]>0) { MM[i]=0; UsedNum--; FreeNum++; } cout<<"所有进程删除成功! "< } cout<<"自动返回菜单"< Sleep(WAITTIME); return; } 分别输入下列序号得到以下结果: 输入Y 5、实验结果与分析(含程序、数据记录及分析和实验总结等): 通过本次上机实践,使我了解了有关于存储管理的一些知识。 存储管理必须为用户分配一个物理上的主存空间,为了避免主存中的各程序相互干扰还必须实现储存保护,为了有效的利用主存空间允许多个作业共享程序和数据,各储存管理方式实现这些功能的方法是不同的,并且都要有相应的硬件作支撑。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 操作系统 存储 管理 方式