操作系统课设内存管理.docx

上传人:b****8 文档编号:9554502 上传时间:2023-02-05 格式:DOCX 页数:31 大小:347.26KB
下载 相关 举报
操作系统课设内存管理.docx_第1页
第1页 / 共31页
操作系统课设内存管理.docx_第2页
第2页 / 共31页
操作系统课设内存管理.docx_第3页
第3页 / 共31页
操作系统课设内存管理.docx_第4页
第4页 / 共31页
操作系统课设内存管理.docx_第5页
第5页 / 共31页
点击查看更多>>
下载资源
资源描述

操作系统课设内存管理.docx

《操作系统课设内存管理.docx》由会员分享,可在线阅读,更多相关《操作系统课设内存管理.docx(31页珍藏版)》请在冰豆网上搜索。

操作系统课设内存管理.docx

操作系统课设内存管理

 

操作系统

课程设计说明书

 

班级:

_______________

学号:

_______________

姓名:

_______________

指导教师:

___________

 

电子与信息工程学院计算机科学系

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;i

zl[i]=0;

}

//输入数据

voidin()

{

inti;

printf("请输入页面请求序列大小:

\n");

scanf("%d",&qnum);

qq=(int*)malloc(qnum*sizeof(int));

printf("请输入页面请求序列:

\n");

for(i=0;i

scanf("%d",&qq[i]);

}

voidprint()

{

inti;

for(i=0;i

printf("%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(;q

for(max=0,q=0;q

{if(max

for(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;j

zl[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;j

zl[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;j

zl[j]=0;

}

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1