操作系统-页式地址重定位模拟实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
操作系统-页式地址重定位模拟实验报告
实验目的:
1、用高级语言编写和调试模拟实现页式地址重
定位。
2、加深理解页式地址重定位技术在多道程
实验原理:
序设计中的作用和意义。
当进程在CPU±运行时,如指令中涉及逻辑
地址时,操作系统自动根据页长得到页号和页内偏移,把页内偏移拷贝到物理地址寄存器, 再根据页号,查页表,得到该页在内存中的块号,把块号左移页长的位数,写到物理地址寄存器。
三、实验内容;
1、设计页表结构
2、设计地址重定位算法
3、有良好的人机对话界面
四、存储结构
typedef struct PageTable
int page num; int pic num; JPageTable;
PageTable PT[N];
typedef struct LogicalAdd
{
int page_ num;
int page_add;
}LogicalAdd;
LogicalAdd LA;
int Page_le ngth;// 页长
int Page_ num;// 页数
int Process;//进程大小
int Address;// 逻辑地址
一、函数列表
In put (); // 输入
In it (); //初始化
Tran slate ();〃生成物理地址
Output ();〃输出
Main ();〃主函数
六、运行结果截图:
(1)输入
(3)查看物理地址
(4)退出
■ w D?0S_2\Debu g\OS_2 心 h
辆理地;it 为:347
亠-一请输人次下选项-一 ,N 息? 页耒; 吻理地址;
P<n_n>o 谢谢使用.再见! Press k 童y to
continue 七、源程序代码:
#in clude<iostream>
#in clude<cstdlib>
#in clude<stri ng>
#in clude<time.h>using n
amespace std;
#defi ne N 50 typedef struct
PageTable {
int page_ num;
int pic_ num; }PageTable;
PageTable PT[N]; typedef
struct LogicalAdd {
int page_ num;
int page_add;
}LogicalAdd;
1 - 岀
LogicalAdd LA;
int Page_le ngth;// 页长
int Page_ nu m;// 页数
int Process;// 进程大小
int Address;// 逻辑地址
void In put()
{
cout <<"输入进程长度:“;
cin >>Process;
cout<<"输入页长:";
cin >>Page_le ngth;
cout<<"请输入逻辑地址:";
cin >>Address;
}
int In it()
{
sran d(time(0));
int i,temp;
int sum=1;
Page_ nu m=Process/Page_le ngth+1;
〃cout<<"n um="<< Page_ num<< en dl;
PT[0].pic_num=1;
for(i=0;i<Page_ nu m;i++)
{
PT[i].page_ num=i;
temp=ra nd()%3+1;
sum+=temp;
PT[i].pic_ nu m+=sum;
〃cout<< PT[i].pic_ num <<e ndl;
}
LA.page_ num=Address/Page_le ngth;
if(LA.page_ num>=Page_ nu m){
cout <<"所查逻辑地址不在该页内,初始化失败!"<<endl;
return -1;
}
LA.page_add=Address%Page_length;
int Tran slate()
{
int i=0;
in t res;
while(i<Page_ num)
{
if(PT[i].page_ num==LA.page_
num){ res=PT[i].pic_ num;
break;
}
else i++;
}
if(i>=N)
return -1;
return res*Page_le ngth+LA.page_add; }
void Output(int res)
{
if(res==0)
{
cout« "构造的页表如下:"<<endl;
coutvv "页号\t 块号"<<endl;
for(i nt i=0;i<Page_ num;i++)
{
cout << PT[i].page_num <<"\t"; coutvv
PT[i].pic_ num«e ndl;
}
}
else
cout <<"物理地址为:"<< resvvendl;
}
int mai n()
{
int k;
cout« "\t************* 欢迎使用页式地址
^重定位模拟系^统*****************\n";
for(;;)
{
cout <<"\t---请输入以下选项---"v<endl;
coutvv "1.输入信息;"<<endl <<"2.查看页表;"<<endlv<"3.查看物理地址;"<<endl<v"4. 退出;"<<endl;
cin>> k;
H
u
」n a)
」
宀宀
三eaiq
S W X ①
=pu
①v
y
'
旺
o(u —u )0
・・
v v 芍
8
-寸①
Seo
空eaiq0()2e_sue
」匕
芍d-no
G ①Seo
空eaiq
s )
芍
"①Seo
三eaiq
V E m a l u d H s u
w
9ndu-
-L ①Seo
)
(善。
七MS
丿£小结
-通过本次实验,加深了我对于分页式存储管理—方式的理解,以及编程实现了页式地址重定位模拟。
在编程过程中所遇到的困难不多,为了简化模拟过程,我使用了十进制数来表示各数据(单位字节)。
页表的构建上,我是根据输入的页长和进程空间的大小来动态分配空间和页表的表长的,块号的生成用了累加随机数的方式。