操作系统课设内存管理.docx
《操作系统课设内存管理.docx》由会员分享,可在线阅读,更多相关《操作系统课设内存管理.docx(31页珍藏版)》请在冰豆网上搜索。
操作系统课设内存管理
操作系统
课程设计说明书
班级:
_______________
学号:
_______________
姓名:
_______________
指导教师:
___________
电子与信息工程学院计算机科学系
1设计题目
1.2内存管理
设计并实现一个可完整演示操作系统中请求分页系统的内存分配、地址变换、页面置换等过程的演示系统。
1.2.1实验目的
通过本设计:
●理解内存分页机制
●掌握页面置换算法
●理解虚拟存储器的实现过程
1.2.2准备知识
●程序设计语言(C/C++/Java)
●数据结构(结构体、链表、队列等)
●基本分页存储管理方式
●虚拟存储器概念
●请求分页存储管理方式
●页面置换算法
1.2.3设计内容
●设计和实现基本分页存储管理的数据结构(包括物理块、页、进程空间、页表等的模拟)
●实现基于固定分配局部置换策略的分页式存储分配
●实现最佳、先进先出、LRU置换算法(栈式和寄存器方式任选其一)
●用上面实现的算法以至少三组以上的页面请求序列,从缺页率角度比较页面置换算法的性能
●设计必要的UI,接收用户输入的运行参数(页和物理课大小、逻辑和物理地址空间大小、进程驻留集大小、置换算法选择、页面请求序列等),输出运行过程及结果(每个页面请求前后页表情况、快表情况、内存使用情况、被置换页面的选择过程及结果等)。
可采用命令行、桌面版或者Web版形式。
2设计思路
经过两天时间仔细研地究题目,我将本次设计划分为两部分,一部分为基本分页存储管理系统的模拟,另一部分为基于固定分配局部置换的页面算法实现。
基本分页存储管理系统的模拟,我主要侧重于分页系统的地址变换机构的实现,即输入一个逻辑地址,将其所指向的逻辑空间中数据存入对应的物理地址所指向的空间,逻辑和物理空间大小采用输入逻辑和物理空间的地址大小控制。
此外,本程序还用位示图显示内存存储状况,用以显示存入数据的结果。
页表方面采用手工输入方式。
块表更新采用类似最近最久未使用算法思想。
页面置换算法方面参考了《计算机操作系统》的算法思想。
其中属最佳置换算法最难实现,耗费时间最长。
先进先出置换算法采用队列结构,最近最久未使用置换算法采用栈结构。
最后的UI设计,采用的是VC++6.0自带的程序运行命令行形式。
3功能模块图
3.1opks1.c(基本分页管理系统)
3.2opks2.c(页面置换算法模拟)
4主要程序流程图
opks1.cmain()
create():
showyb():
showkb():
shownc();
work():
Opks2.cmain():
creat():
in();
print():
OPT();
FIFO():
LRU():
5程序说明
5.1开发及运行环境
本程序的开发及运行环境为MicrosoftVisualC++6.0。
5.2代码结构
5.2.1opks1.c(基本页面存储管理系统)
顶层目录:
opks1.c:
基本分页存储管理系统
二层目录:
intmain():
主函数
三层目录:
voidCreatA();内存初始化
voidshowyb();显示页表
voidshowkb();显示快表
voidshownc();显示内存块使用情况
5.2.1opks2.c(页面置换算法模拟)
顶层目录:
opks2.c:
页面置换算法模拟
二层目录:
intmain():
主函数
三层目录:
voidcreat();初始化
voidOPT();最佳置换算法
voidFIFO();先进先出置换算法
voidLRU();最近最久未使用置换算法
voidin();数据输入函数
voidprint();数据输出函数
6主要代码
6.1opks1.c(基本分页管理系统)
#include
#include
#include
//#defineNULL0
intmax;//逻辑和物理地址空间大小
int*A;//内存物理块,0:
未使用,非0:
已使用
intcount;//记录内存未使用物理块数
intkysize;//块页大小
int*yb;//页表
structkb
{
intyh;//页号
intkh;//块号
structkb*front;
structkb*next;
};
intmain()
{
//structLNode*L=NULL;
inti=0;
structkba,b,c,d,e,*head;
voidCreatA();//内存初始化
voidshowyb();//显示页表
voidshowkb();//显示快表
voidshownc();//显示内存块使用情况,不分进程
structkb*work(structkb*L);
CreatA();
a.kh=0;a.yh=0;
b.kh=0;b.yh=0;
c.kh=0;c.yh=0;
d.kh=0;d.yh=0;
e.kh=0;e.yh=0;
head=&a;a.next=&b;b.next=&c;c.next=&d;d.next=&e;e.next=NULL;
a.front=NULL;b.front=&a;c.front=&b;d.front=&c;e.front=&d;
printf("\n*******基本分页算法*******\n");
do
{
printf("\n***********菜单*************\n");
printf("1装入\n");
printf("2查看页表\n");
printf("3查看快表\n");
printf("4查看内存\n");
printf("5退出程序\n");
printf("****************************\n");
printf("请输入你的选择(select):
");
scanf("%d",&i);
switch(i)
{
case1:
head=work(head);
break;
case2:
showyb();
break;
case3:
showkb(head);
break;
case4:
shownc();
break;
case5:
printf("谢谢使用\n\n");
exit(0);
break;
}
}while(i!
=0);
return0;
}
//内存初始化
voidCreatA(){
inti;
printf("请输入逻辑和物理地址空间大小:
\n");
scanf("%d",&max);
printf("请输入物理块大小:
\n");
scanf("%d",&kysize);
A=(int*)malloc((max-1)*sizeof(int));
count=max-1;
yb=(int*)malloc((max/kysize)*sizeof(int));
printf("请手动输入页表\n");
for(i=0;i<(max/kysize);i++)
scanf("%d",&yb[i]);
for(i=0;i<=max;i++)
A[i]=0;
}
//装入
structkb*work(structkb*L)
{
intlgad;//逻辑地址
intname;//代表了名,标志,数据
intk1,k2,k3;//k1为页号,k2为偏移地址,k3为物理地址
structkb*p;
printf("请输入逻辑地址:
\n");
scanf("%d",&lgad);
printf("请输入数据\n");
scanf("%d",&name);
k1=lgad/kysize;
k2=lgad%kysize;
p=L;
while(p->yh!
=k1&&p->next!
=NULL)
{p=p->next;}
if(p->yh!
=k1)
{p->front->next=NULL;p->front=NULL;p->next=L;L->front=p;p->yh=k1;p->kh=yb[k1];}
elseif(p->yh==k1&&p->next==NULL)
{p->front->next=NULL;p->front=NULL;p->next=L;L->front=p;}
elseif(p->yh==k1&&p->front!
=NULL)
{p->front->next=p->next;p->next->front=p->front;p->front=NULL;p->next=L;L->front=p;}
elseif(p->front==NULL&&p->yh==k1)
{
k3=p->kh*kysize+k2;
A[k3]=name;
returnL;
}
k3=p->kh*kysize+k2;
A[k3]=name;
returnp;
}
//显示页表
voidshowyb()
{
inti;
printf("\n****************************\n");
printf("|页表|\n");
printf("****************************\n");
for(i=0;i<(max/kysize);i++)
printf("%d",yb[i]);
}
//显示快表
voidshowkb(structkb*L)
{
structkb*p;
printf("\n****************************\n");
printf("|快表|\n");
printf("****************************\n");
p=L;
while(p!
=NULL)
{
printf("%d%d\n",p->yh,p->kh);
p=p->next;
}
}
//显示内存块使用情况,不分进程
voidshownc()
{
inti=0;
printf("\n****************************\n");
printf("|内存物理块分配情况|\n");
printf("****************************\n");
for(i=0;i{
printf("%d\t",A[i]);
if(i%10==9)
printf("\n");
}
}
6.2opks2.c(页面置换算法模拟)
#include
#include
intznum;//驻留集大小
intqnum;//请求序列大小
int*zl;//驻留集
int*qq;//请求序列
intmain()
{
inti;
voidcreat();//初始化
voidOPT();
voidFIFO();
voidLRU();
voidin();
voidprint();
creat();
do
{
printf("\n******************菜单******************\n");
printf("1请输入页面请求序列\n");
printf("2请选择最佳(Optimal)置换算法\n");
printf("3请选择先进先出置换(FIFO)置换算法\n");
printf("4请选择最近最久未使用(LRU)置换算法\n");
printf("5退出程序\n");
printf("****************************\n");
printf("请输入你的选择(select):
");
scanf("%d",&i);
switch(i)
{
case1:
in();
break;
case2:
OPT();
break;
case3:
FIFO();
break;
case4:
LRU();
break;
case5:
printf("谢谢使用\n\n");
return0;
break;
}
}while(i!
=0);
return0;
}
//初始化
voidcreat()
{
inti;
printf("请输入驻留集大小:
\n");
scanf("%d",&znum);
zl=(int*)malloc(znum*sizeof(int));
for(i=0;izl[i]=0;
}
//输入数据
voidin()
{
inti;
printf("请输入页面请求序列大小:
\n");
scanf("%d",&qnum);
qq=(int*)malloc(qnum*sizeof(int));
printf("请输入页面请求序列:
\n");
for(i=0;iscanf("%d",&qq[i]);
}
voidprint()
{
inti;
for(i=0;iprintf("%d",zl[i]);
printf("\n");
}
voidOPT()
{
intcout=0;//记录缺页数
//floatv;//缺页率
inti,j,q,max,t,y,z;
intbz;
int*jl=(int*)malloc(znum*sizeof(int));
y=i=0;z=znum;
while(i{
for(bz=0,j=0;j
{if(zl[j]==qq[i]){bz=1;y--;z++;break;}}
if(bz==0){zl[y]=qq[i];cout++;}//若缺页
printf("%d:
",qq[i]);
print();
y++;
i++;
}//将前znum个不同的页装入驻留集
for(;i{
for(bz=0,j=0;j{if(zl[j]==qq[i]){bz=1;break;}}
if(bz==0)//若缺页
{
for(q=i,j=0;j{for(;qfor(max=0,q=0;q{if(maxfor(q=0;q{if(jl[q]==max){t=q;break;}}
zl[t]=qq[i];//将该页换出
cout++;
}
printf("%d:
",qq[i]);
print();
}
printf("缺页率:
%d分之%d",qnum,cout);
for(j=0;jzl[j]=0;
}
voidFIFO()
{
intcout=0;//记录缺页数
inti,j,t,y,z;
intbz;
//int*jl=(int*)malloc(znum*sizeof(int));
y=i=0;z=znum;
while(i{
for(bz=0,j=0;j
{if(zl[j]==qq[i]){bz=1;y--;z++;break;}}
if(bz==0){zl[y]=qq[i];cout++;}//若缺页
printf("%d:
",qq[i]);
print();
y++;
i++;
}//将前znum个不同的页装入驻留集
for(;i{
for(bz=0,j=0;j{if(zl[j]==qq[i]){bz=1;break;}}
if(bz==0)//若缺页
{
for(j=1;j{t=j-1;zl[t]=zl[j];}
j=j-1;
zl[j]=qq[i];
cout++;
}
printf("%d:
",qq[i]);
print();
}
printf("缺页率:
%d分之%d",qnum,cout);
for(j=0;jzl[j]=0;
}
//采用栈操作
voidLRU()
{
intcout=0;//记录缺页数
inti,j,q,t;
intbz;
for(i=0;i{
bz=0;
for(j=0;j{if(zl[j]==qq[i]){bz=1;break;}}
if(bz==0){for(j=j-1;j>0;j--){t=j-1;zl[j]=zl[t];}zl[j]=qq[i];cout++;}//若缺页
if(bz==1&&j!
=0){q=zl[j];for(;j>0;j--){t=j-1;zl[j]=zl[t];}zl[j]=q;}//不缺页,且不为栈顶
printf("%d:
",qq[i]);
print();
}
printf("缺页率:
%d分之%d",qnum,cout);
for(j=0;jzl[j]=0;
}