三种存储管理方式的地址换算教材文档格式.docx
《三种存储管理方式的地址换算教材文档格式.docx》由会员分享,可在线阅读,更多相关《三种存储管理方式的地址换算教材文档格式.docx(25页珍藏版)》请在冰豆网上搜索。
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号和页内地址两部分,再以页号为索引去检索页表。
查找操作由硬件执行。
在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间。
于是,这一错误将被系统发现并产生一地址越界中断。
若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。
与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。
这样便完成了从逻辑地址到物理地址的变换。
(2)分段存储管理方式
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度TL。
在进行地址变换时,系统将逻辑地址中的段号与段表长度TL进行比较。
若S>
TL,表示段号太大,是访问越界,于是产生越界中断信号;
若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址,然后,再检查段内地址d是否超过该段的段长SL。
若超过,即d>
SL,同样发出越界中断信号;
若未越界,则将该段的基址与段内地址d相加,即可得到要访问的内存物理地址。
(3)段页存储管理方式
在段页式系统中,为了便于实现地址变换,需配置一个段表寄存器,其中存放段表始址和段表长TL。
进行地址变换时,首先利用段号S,将它与段表长TL进行比较。
TL,表示未越界,于是利用段表始址和段号来球出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用逻辑地址中的段内页号P来获得对应表的页表项位置,从中读出该页所在的物理块号b,再利用块号b和页内地址来构成物理地址。
3.程序模块:
#include<
stdlib.h>
stdio.h>
intsettable1(intn,intk);
//创建页表
intprintTable1(intn,intk);
//显示页表
inttranst(intn,intk,intadd);
//分页地址换算
intdefSect(intn,int*t);
//创建段表
intprintSect(intn);
//输出段表内容
inttransSect(intn,ints,intd);
//进行分段地址换算函数
intsetSectTable(intn,intk);
//创建段页式内容
intprintSectTable(intn,intk);
//显示段页内容
inttransSectPage(intn,intk,ints1,ints2,ints3);
//段页式地址换算
//定义页表结构体
typedefstructstable
{
inty1;
//页号
inty2;
//块号
}stable;
structstablesetst[512];
//建立段表的结构体
typedefstructsetsect
intd1;
//段号
intd2;
//段长
intd3;
//基址
}setsect;
structsetsectsets[512];
//定义段表的总长度
//建立段页式内的页表的结构体
typedefstructtable
intdy1;
intdy2;
}table;
//建立段页式的结构体
typedefstructsetAll
structtablec1[512];
//定义段内页表的结构体
intc2;
intc3;
intc4;
//起始地址
}setAll;
structsetAllset[512];
//定义段页式的总长度
4.三种存储管理方式的地址变换机构
(1)分页系统的地址变换机构
(2)分段系统的地址变换机构
段号S
位移量W
(3)段页式系统中的地址变换机构
5.结束语:
为期二周的操作系统课程设计很快就结束了,做为每个学期末的一项必修课,课程设计的目的就是要让我们能够更加深刻的理解课堂上所学的知识,并能够将它们应用到实践中去,让知识能为实践服务。
这次操作系统的课程设计,我是通过编程演示三种存储管理方式的地址换算过程。
通过这次课程设计,加深了我对课堂上所学的三种存储管理方式的地址换算的概念的理解,了解了操作系统的工作原理已经平时遇到的一些状况是怎么样产生的,通过这次操作系统的课程设计,另我学到了很多在课堂上学不到的知识,以及动手能力,这次课程设计老师不限开发工具,因此也锻炼了我们对新的开发工具的掌握能力。
对于我们计算机专业的学生来说,在软件更新如此之快的今天,对新的开发工具的快速掌握能力也是一项必不可少的能力。
当然,在这次课程设计中,也暴露出来了一些问题,就是我对开发工具的使用,虽然大学三年基本是用C编写程序比较多,但是还是感到了力不从心的感觉,就是自己对一些C函数库的了解不够,导致自己在用的时候走了很多弯路,这也从间接让我了解了许多平时学习不到的知识。
课程设计不仅能锻炼我们把知识应用于实践的能力,还锻炼了我们思维的逻辑性。
编写一个BUG尽可能少的程序,需要考虑很多方面的问题,包括给别人试用,这就锻炼了我们逻辑思维的能力,为今后走上工作岗位打下了坚实的基础。
6.参考文献:
《计算机操作系统》西安电子科技大学出版社
《C语言程序设计教程》机械工业出版社
附:
三种存储管理方式地址换算程序清单如下:
intmain()
intchoice1,choice2;
inttruth=0,truth1;
intjobAddr;
//进程的逻辑地址空间
intmd;
//页面大小
intaddr1;
//输入的逻辑地址
intdc;
//定义段表的长度
intdh,sAddr;
//定义段表的逻辑地址的段号和段内地址
intdyc;
//段页式的段表长度
intjobs,jobt,joba;
//段页式逻辑段号、段内页号、页内地址
do{
printf("
组员:
符小平崔健王菲菲王天渤\n"
);
--------------操作系统课程设计题目:
分页、分段、段页式地址换算-------------------\n\n"
总菜单\n"
1.分页方式\n"
2.分段方式\n"
3.段页式\n"
4.结束\n\n"
----------------------------------------------------------\n"
请输入您的选择:
\n"
scanf("
%d"
&
choice1);
switch(choice1)
case1:
{//分页方式
分页方式\n"
---------------------------------------------------\n"
1.随机生成进程大小\n"
2.进程创建页表\n"
3.显示页表的信息\n"
4.地址换算\n"
5.退出\n"
---------------------------------------------------\n\n"
"
choice2);
switch(choice2)
随机生成一个进程(大小在1024K至2048K)\n"
jobAddr=rand()%2048;
//随机产生进程的逻辑地址空间
}while(jobAddr<
1024);
该进程的逻辑地址空间是:
%d(K)\n"
jobAddr);
页面的大小:
md);
truth=1;
}break;
case2:
if(truth==1){
\n进程创建的页表\n"
---------------------------------\n\n"
settable1(jobAddr,md);
truth1=1;
\n\n---------------------------------\n"
}else{
\n还没有创建进程.请先选择1创建进程.\n\n"
break;
}
case3:
if(truth1==1){
\n显示进程创建的页表\n"
printTable1(jobAddr,md);
\n还没有创建页表.请先选择2创建页表.\n\n"
case4:
\n地址换算\n"
请你输入要进行换算的逻辑地址(K):
addr1);
if(addr1>
jobAddr){
输入的逻辑地址大于进程地址空间,请重新输入逻辑地址(K):
}while(addr1>
jobAddr);
transt(jobAddr,md,addr1);
case5:
退出分页方式地址换算选项,进入总菜单.\n"
default:
---------------------------------------\n"
错误提示:
你输入的选择有错,请重新选择!
}while(choice2!
=5);
{//分段方式
分段方式地址换算\n"
1.创建段表\n"
2.显示段表\n"
3.地址换算\n"
4.退出\n"
开始创建段表\n"
请输入你要创建的段表长度(最大为512个):
dc);
defSect(dc,&
truth);
\n显示已经创建的段表内容\n"
printSect(dc);
\n还没有创建段表.请先选择1创建段表.\n\n"
分段地址换算\n"
请您输入逻辑地址的段号,段内地址(K):
%d,%d"
dh,&
sAddr);
transSect(dc,dh,sAddr);
退出分段方式地址换算选项,进入总菜单.\n"
=4);
{//段页式
段页式地址换算\n"
1.创建段页式\n"
2.显示段页式结构\n"
开始创建段页式\n"
dyc);
页面的大小K:
setSectTable(dyc,md);
-----------------------------------