三种存储管理方式的地址换算过程课程设计.docx

上传人:b****4 文档编号:24324160 上传时间:2023-05-26 格式:DOCX 页数:14 大小:78.20KB
下载 相关 举报
三种存储管理方式的地址换算过程课程设计.docx_第1页
第1页 / 共14页
三种存储管理方式的地址换算过程课程设计.docx_第2页
第2页 / 共14页
三种存储管理方式的地址换算过程课程设计.docx_第3页
第3页 / 共14页
三种存储管理方式的地址换算过程课程设计.docx_第4页
第4页 / 共14页
三种存储管理方式的地址换算过程课程设计.docx_第5页
第5页 / 共14页
点击查看更多>>
下载资源
资源描述

三种存储管理方式的地址换算过程课程设计.docx

《三种存储管理方式的地址换算过程课程设计.docx》由会员分享,可在线阅读,更多相关《三种存储管理方式的地址换算过程课程设计.docx(14页珍藏版)》请在冰豆网上搜索。

三种存储管理方式的地址换算过程课程设计.docx

三种存储管理方式的地址换算过程课程设计

 

课程报告

 

课程设计名称:

计算机操作系统

专业班级:

学生姓名:

学号:

指导教师:

课程设计时间:

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语言书,得到了老师的帮助和指导,才能够使得这次课程设计顺利的进行下去,另外,在程序调试过程中,也得到很多同学的帮助,给我及时指出错误,提出许多宝贵意见。

在此对老师和同学们表示感谢!

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

当前位置:首页 > IT计算机 > 电脑基础知识

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

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