陈泳鑫3110006379操作系统课程设计Word文档下载推荐.docx
《陈泳鑫3110006379操作系统课程设计Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《陈泳鑫3110006379操作系统课程设计Word文档下载推荐.docx(16页珍藏版)》请在冰豆网上搜索。
任务要求
要求演示正确、清晰,编程所用工具不限。
参考文献
[1]计算机操作系统,汤小丹等,西安电子科技大学出版社
[2]操作系统实验指导书,傅秀芬,广东工业大学(自编)
[3]计算机操作系统教程(第二版),张尧学、史美林,清华大学出版社
[4]现代操作系统,A.S.Tanenbaum著,陈向群等译机械工业出版社
审查意见
指导教师签字:
系主任签字:
年月日
1、设计思想说明
1.1设计环境
在实现地址转换的程序实现时,运用了C++6.0来实现,因为对C语言程序的编写稍微熟悉点,可以很好的编写及调试。
程序很容易看懂,输入条件在后边备注。
1.2设计思想
编程演示三种存储管理方式的地址换算过程,分别为分页方式的地址换算,分段方式的地址换算,段页式的地址换算。
分页方式通过逻辑地址算出页号与叶内地址,然后通过页表来实现向物理地址的转换。
分段方式通过段号和段内地址得到物理地址。
段叶式通过段号得到页表首地址,通过页号得到块号,进而得到物理地址。
2、系统结构
程序主要有三个功能,分别是分页方式的地址换算,分段方式的地址换算,段页式的地址换算。
Switch函数包含3个case语句,分别用page,Segment,SegPagt完成分页方式的地址换算,分段方式的地址换算,段页式的地址换算。
3、数据结构的说明
typedefstructsegtable
{
intsegf[256];
intsegl[256];
}segtable;
structsegtablest;
typedefstructsegpagt
intptl[256];
intpt[256];
intpf[256];
intpl;
}segpagt;
structsegpagtsp;
4、算法流程图
分页式:
分段式:
段页式:
5、主要函数列表
函数原型
功能
入口、出口参数说明
voidmain()
输入、输出
Int整形变量
6、测试与分析
分页式地址换算结果:
分页式地址越界中断:
分段式地址转换结果:
分段式地址段号越界中断:
分段式地址段内越界中断:
段页式地址转换结果:
段页式地址转换段号越界中断:
段页式地址转换页号越界中断:
段页式地址转换段内地址越界中断:
结束:
7、用户使用说明
根据提示输入1-4,然后有相应的提示说明,分别输入,错误的时候有提示,正确的输入会输出相应的正确的结果。
附录:
#include<
stdlib.h>
stdio.h>
intpage(intA,intL);
intSegment(intsn,intsl);
intSegPagt(intsn,intpn,intpd);
intmain()
intcode;
intpl,pa,sn,sd,pd,pn,pc;
//constintptl;
inttemp;
do{
printf("
----------------地址换算过程----------------------------\n\n"
);
******本程序由陈泳鑫设计--2013年1月3号*****\n"
1.分页式地址换算\n"
2.分段式地址换算\n"
3.段页式地址换算\n"
4.结束运行\n\n"
--------------------------------------------------------\n"
请输入1-4:
"
scanf("
%d"
&
temp);
switch(temp)
{
case1:
printf("
预设页表长度为256\n"
page(pl,pa);
break;
case2:
intpl,pa;
预设段表长度为256\n"
请输入您的逻辑地址段号:
scanf("
pl);
printf("
请输入您的页内地址:
pa);
if(pl>
256)
段号%d大于段表长度256,越界中断\n"
pl);
else{
if(pa>
段内地址%d大于段长度256,越界中断\n"
pa);
else
{
Segment(pl,pa);
}
}
case3:
预设段表长度为256,页面大小为256\n"
请输入您的页号:
pc);
if(pl>
页号长度%d大于页表长度256,越界中断\n"
if(pc>
页内地址%d大于页面长度256,越界中断\n"
pc);
else
SegPagt(pl,pa,pc);
}
}
}while(temp!
=4);
return0;
}
//分页式地址换算部分:
intpage(intA,intL)
{
intpl,pa;
请输入您的逻辑地址:
请输入您的页面大小:
if(pl>
页号%d大于页表长度256,越界中断\n"
else{
intd,P,kd,i;
intWD;
intPT[256];
for(i=0;
i<
256;
i++)
{
PT[i]=rand()%512;
//定义随机产生的快号在1到512之间
}
P=A/L;
//页号等于逻辑地址/页面大小
d=A%L;
//页内地址=逻辑地址%页面大小
if(P>
=256)printf("
页号大于页表长度,越界中断\n\n"
//如果页号大于页表长度,输出越界中段
else{
页号=逻辑地址/页面大小=%d,页内地址=逻辑地址%页面大小=%d\n"
P,d);
//输出页号和页内地址
kd=PT[P];
//根据页号随机产生快号
根据页号%d得到块号%d\n"
P,kd);
WD=kd*L+d;
//计算物理地址的公式
物理地址=块号*页面大小+页内地址\n"
物理地址=%d*%d+%d\n"
kd,L,d);
//输出物理地址=块号*页面大小+页内地址
逻辑地址%d换算后的物理地址=%d\n\n"
A,WD);
//输出物理地址的结果
return(0);
//分段式地址换算部分:
intSegment(intsn,intsd)
inti,wd;
255;
st.segf[i]=rand()%255;
//定义随机产生段首地址为1到255之间
st.segl[i]=rand()%2048;
//定义随机产生段长度为1到2048之间
if(sn>
256)printf("
段号%d大于段表长度256,越界中断\n\n"
sn);
//如果段号大于段表长度,输出越界中断
elseif(sd>
st.segl[sn])printf("
段内地址%d大于段长度%d,越界中断\n\n"
sd,st.segl[sn]);
//如果段内地址大于段长度,输出越界中断
根据段号找到段首地址%d\n"
st.segf[sn]);
物理地址=段首地址+段内地址\n"
物理地址=%d+%d\n"
st.segf[sn],sd);
//输出物理地址=段首地址+段内地址
wd=st.segf[sn]+sd;
//计算物理地址的算法
换算得到的物理地址=%d\n\n"
wd);
//输出物理地址
//段页式地址换算部分:
intSegPagt(intsn,intpn,intpd)
inti,wd;
sp.pl=256;
for(i=0;
sp.pf[i]=sp.segf[i]=rand()%26624;
//定义随机产生的数在1到26624之间
sp.ptl[i]=sp.segl[i]=rand()%512;
//定义随机产生的数在1到512之间
sp.pt[i]=rand()%256;
//定义随机产生的数在1到256之间
if(sn>
=256)
printf("
//如果段号大于段表长度256,输出越界中断
else
if(pn>
页号%d大于页表长度256,越界中断\n\n"
pn);
//如果页号大于页表长度,输出越界中断
else
if(pd>
sp.pl)
页内地址%d大于页面长度%d,中断\n\n"
pd,sp.pl);
//如果页内地址大于页面长度,输出中断
通过段号%d找到页表首地址%d\n通过页号%d找到块号%d\n"
sn,sp.pf[sn],pn,sp.pt[pn]);
//输出页表首地址和块号
物理地址=页表首地址+块号*页面长度+页内地址\n"
物理地址=%d+%d*%d+%d\n"
sp.pf[sn],sp.pt[pn],sp.pl,pd);
//输出物理地址=页表首地址+快号*页面长度+页内地址
wd=sp.pf[sn]+sp.pt[pn]*sp.pl+pd;
物理地址为:
%d\n\n"
//输出物理地址的最好结果
return(0);