三种存储管理方式的地址换算过程课程设计.docx
《三种存储管理方式的地址换算过程课程设计.docx》由会员分享,可在线阅读,更多相关《三种存储管理方式的地址换算过程课程设计.docx(14页珍藏版)》请在冰点文库上搜索。
三种存储管理方式的地址换算过程课程设计
课程报告
课程设计名称:
计算机操作系统
专业班级:
学生姓名:
学号:
指导教师:
课程设计时间:
2011.6.15-2011.6.25
计算机科学专业课程设计任务书
学生姓名
专业班级
学号
题目
编程演示三种存储管理方式的地址换算过程:
课题性质
其它
课题来源
自拟课题
指导教师
同组姓名
主要内容
1、分页方式的地址换算
2、分段方式的地址换算
3、段页式的地址换算
任务要求
要求演示正确、清晰,编程所用工具不限。
参考文献
任满杰等《操作系统原理实用教程》电子工业出版社2006
汤子瀛《计算机操作系统》(修订版)西安电子科技大学出版社2001
张尧学史美林《计算机操作系统教程》实验指导清华大学出版社2000
罗宇等《操作系统课程设计》机械工业出版社2005
审查意见
指导教师签字:
教研室主任签字:
年月日
说明:
本表由指导教师填写,由教研室主任审核后下达给选题学生,装订在设计(论文)首页
1需求分析
编程演示三种存储管理方式的地址换算过程
【基本要求】
(1)分页方式地址算法。
(2)分段方式地址算法。
(3)段页式地址算法。
2概要设计
一、程序模块
1、主函数main()。
2、分页方式地址算法PageAddress(intpa,intpl)。
3、分段方式地址算法SegmentAddress(intsn,intsd)。
4、段页式地址算法SegPag(intsn,intpn,intpd)。
二、程序总框架
程序框架如图一:
图一:
程序框架
3运行环境
WindowsXPsp3;
4开发工具和编程语言
MicrosoftVisualC++6.0,c语言。
5详细设计
1,定义结构体
typedefstructsegtable//段式结构体
{
intsegf[256];//段首地址
intsegl[256];//段长
}segtable;
structsegtablest;
typedefstructsegpag//段页式结构体
{
intsegf[256];//段首地址
intsegl[256];//段长
intptl[256];//页表长度
intbn[256];//块号
intpf[256];//页表首地址
intpl;//页面长度
}segpagt;
structsegpagsp;
2,voidPageAddress(intpa,intpl)//分页式地址算法
该方法中pa表示要查找的逻辑地址,pl表示页面大小。
页号p=pa/pl,页内地址d=pa%pl。
先比较页号和页表长度大小,如果页号大于页表长度,越界中断。
否者继续通过计算得到物理地址Mac=块号*页面大小+页内地址。
具体代码如下:
voidPageAddress(intpa,intpl)//分页式地址算法
{
intd,p,i;
intMac;//物理地址
intBn[256];//块号
for(i=0;i<256;i++)
{
Bn[i]=rand()%512;//得到块号
}
p=pa/pl;//页号
d=pa%pl;//页内地址
if(p>pl)
printf("页号大于页表长度,越界中断!
\n");
else
{
printf("页号=逻辑地址/页面大小=%d\n页内地址=逻辑地址%%页面大小=%d\n",p,d);
printf("根据页号%d得到块号%d\n",p,Bn[p]);
Mac=Bn[p]*pl+d;
printf("物理地址=块号%d*页面大小%d+页内地址%d\n",Bn[p],pl,d);
printf("逻辑地址%d换算后的物理地址为%d\n\n",pa,Mac);
}
}
3,voidSegmentAddress(intsn,intsd)//分段式地址算法
该方法中sn表示段号、sd表示段内偏移地址。
假定短表长度为256,首先比较段号与段表的大小,若大于则越界中断。
然后比较段内地址与段长度,若大于,越界中断。
否则根据段号找到首地址,然后计算物理地址Mac=段首地址+段内地址。
具体代码如下:
voidSegmentAddress(intsn,intsd)//分段式地址算法
{
inti;
intMac;//物理地址
for(i=0;i<256;i++)
{
st.segf[i]=rand()%256;//初始化段首地址
st.segl[i]=rand()%2048;//初始化段长
}
if(sn>=256)
printf("段号%d大于等于段表长度256,越界中断\n",sn);
elseif(sd>st.segl[sn])
printf("段内地址%d大于段长度%d,越界中断\n",sd,st.segl[sn]);
else
{
printf("根据段号找到段首地址%d\n",st.segf[sn]);
printf("物理地址=段首地址%d+段内地址%d\n",st.segf[sn],sd);
Mac=st.segf[sn]+sd;
printf("换算得到的物理地址为:
%d\n",Mac);
}
}
4,voidSegPag(intsn,intpn,intpd)//段页式地址算法
该方法中sn代表段号,pn代表页号,pd页内地址。
设定段表长度为256,页面大小为256。
比较段号与段表长度大小,若大于则越界中断。
若小于继续下一步,比较页号与页表长度大小,若大于则越界中断。
若小于继续下一步,比较页内地址和页面大小,若大于同样越界中断。
否则继续下一步的计算,通过段号找到页表首地址,然后找到块号。
最后计算物理地址=页表首地址+块号*页面长度+页内地址(Mac=sp.pf[sn]+sp.bn[pn]*sp.pl+pd)。
具体代码如下:
voidSegPag(intsn,intpn,intpd)//段页式地址算法
{
inti,Mac;
sp.pl=256;
for(i=0;i<256;i++)
{
sp.pf[i]=sp.segf[i]=rand()%10240;//初始化页首地址,段表首地址
sp.ptl[i]=sp.segl[i]=rand()%512;//初始化页表长度,段表长度
sp.bn[i]=rand()%256;//初始化块号
}
if(sn>256)
printf("段号%d大于段表长度256,越界中断\n",sn);
elseif(pn>sp.ptl[pn])
{
printf("页号%d大于页表长度%d,越界中断\n",pn,sp.ptl[pn]);
}
elseif(pd>sp.pl)
printf("页内地址%d大于页面长度%d,中断\n",pd,sp.pl);
else
{
printf("通过段号%d找到页表首地址%d找到块号%d\n",sn,sp.pf[sn],sp.bn[pn]);
printf("物理地址=页表首地址%d+块号%d*页面长度%d+页内地址%d\n",sp.pf[sn],sp.bn[pn],sp.pl,pd);
Mac=sp.pf[sn]+sp.bn[pn]*sp.pl+pd;
printf("物理地址:
%d\n",Mac);
}
}
5,voidmain()
该main方法中显示菜单、做选择要使用的方法实现地质换算。
用sel做出选择,并用switch(sel)实现选择的目的。
具体代码如下:
voidmain()
{
intsel;
intpl,pa,sn,sd,pd,pn;
while
(1)
{
printf("…………三种存储管理方式的地址换算过程…………\n\n");
printf("1.分页方式地址换算\t");
printf("2.分段方式地址换算\n\n");
printf("3.短页式地址换算\t");
printf("0.结束运行\n\n");
printf("……………………………………………………………\n\n");
printf("请输入你的选择:
");
scanf("%d",&sel);
if(sel==0)
{
printf("谢谢使用!
");
break;
}
switch(sel)
{
case1:
{
system("cls");
printf("请输入换算逻辑地址:
\n");
scanf("%d",&pa);
printf("页面大小:
\n");
scanf("%d",&pl);
PageAddress(pa,pl);
}
break;
case2:
{
system("cls");
printf("设定段表长度为256\n");
printf("请输入逻辑地址的段号:
\n");
scanf("%d",&sn);
printf("段内地址:
\n");
scanf("%d",&sd);
SegmentAddress(sn,sd);
}
break;
case3:
{
system("cls");
printf("预设定段表长为256,页面大小为256\n");
printf("请输入逻辑地址的段号:
\n");
scanf("%d",&sn);
printf("页号:
\n");
scanf("%d",&pn);
printf("页内地址:
\n");
scanf("%d",&pd);
SegPag(sn,pn,pd);
}
break;
default:
{
system("cls");
printf("\n");
printf("……………………\n");
printf("错误提示:
输入有错,重新输入!
");
printf("……………………\n");
}
}
}
}
6调试分析
通过调试发现了比较多的问题,输出%的问题即printf("页号=逻辑地址/页面大小=%d\n页内地址=逻辑地址%%页面大小=%d\n",p,d)需要用两个百分号,才能显示出来,一个百分号还不显示。
一步一个脚印,循循渐进,慢慢磨,最终就会成功,每一次出错是一次改良的机会,通过过一个个错误的改正,才能做出比较完整的程序,甚至完美的程序。
7测试结果
(1)运行程序出现界面如下图二:
图二:
开始选择界面
(2)选择1,提示输入需换算的逻辑地址,以及页面大小。
输入完成后的结果如图三:
图三:
分页方式换算过程及结果
(3)选则2,进入分段方式地址换算,提示输入逻辑段号,以及页内地址,输入完成后,可得到物理地址。
运行结果如图四:
图四:
分段方式换算过程及结果
(4)选择3,进入段页式地址转换,提示输入段号,页号,页内地址。
然后即可得到物理地址。
运行结果如图五:
图五:
段页式换算过程及结果
(5)选择0,结束运行。
运行结果如图六:
图六:
结束运行结果
(6)如果选择出错。
运行结果如图七:
图七:
选择其他运行结果
8参考文献
[1]谭浩强C程序设计(第三版)清华大学出版社2003。
[2]任满杰等《操作系统原理实用教程》电子工业出版社2006。
[3]汤子瀛《计算机操作系统》(修订版)西安电子科技大学出版社2001。
[4]张尧学史美林《计算机操作系统教程》实验指导清华大学出版社2000。
[5]罗宇等《操作系统课程设计》机械工业出版社2005。
课程设计总结
通过这次课程设计,让我充分了解三种存储管理方式的地址换算算法。
刚开始的时候,看了半天的操作系统书,才弄懂三种算法。
通过对框架的设计,到具体实现是比较麻烦的过程,开始想完全后,写在草纸上,然后一口气敲完代码,一大堆错误,最后,还是一步一步来实现,循循渐进,最终完成。
虽然很辛苦,但是很值得。
尽管只有短短的三天时间,不是很完美,但是还是通过努力做出来的,也是有成就感的。
同时我也学会了,凡是不能一步登天的道理,要一步一个台阶,要有计划,有目的的执行,才能成功。
这次课程设计中我遇到许多问题和麻烦,还需要复习以前的C语言书,得到了老师的帮助和指导,才能够使得这次课程设计顺利的进行下去,另外,在程序调试过程中,也得到很多同学的帮助,给我及时指出错误,提出许多宝贵意见。
在此对老师和同学们表示感谢!