西 安 工 业 大 学
信息与计算科学
09 级《操作系统实验》课程设计报告
题 目:三种存储管理方式的地址换算过程
班 级:
学 号:
姓 名:
时 间:
一.任务:
编程演示三种存储管理方式的地址换算过程,分别是:分页式地址换算,分段式地
址换算和段页式地址换算。
二.思想:
为了能将用户地址空间中的逻辑地址变换为内存空间中的物理地址,在系统中必须
设置地址变换机构。该机构的基本任务是实现从逻辑地址到物理地址的转换。
由于页内地址和物理地址是一一对应的,因此,地址变换机构的任务实际上只是将
逻辑地址中的页号,转换内存中的物理块号。又因为页面映射表的作用就是用于实现从
页号到物理块号的变换,因此,分页式地址
变换任务是借助于页表来完成的。
在分段式存储管理系统中,为每个分段分派一个连续的分区,而进程中的各个段可
以离散地移入内存中不同的分区中。为使程序能正常运行,亦即,能从物理内存中找出
每个逻辑段所对应的位置,在系统中为每个进程建立一张“段表”。每个段在表中占有一
个表项,其中记录了该段在内存中的起始地址和段的长度。
分页和分段存储管理方式都各有优缺点。分页系统能有效地提高内存利用率,而分
段系统则能很好地满足用户需要。如果能对两种存储管理方式“各取所长”,则可将两者
结合成一种新的存储管理方式系统。这种新系统既具有分段系统的便于实现,分段可共
享,易于保护,可动态链接等一系列优点,又能像分页系统那样很好地解决内存的外部
碎片问题,以及可为各个分段离散地分配内存等问题。把这种结合起来形成的新系统称
为“段页式系统”。
三.目的:
每种地址换算过程的目的都是把用户地址空间中的逻辑地址变换为内存空间中的物
理地址。
四.方案:
分页式:
当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址的
页号和页内地址两部分,再以页号为索引去检索页表。查找操作由硬件执行,在执行检
索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所
访问的地址已超越进程的地址空间。于是,这一错误将被系统发现并产生一地址越界中
断。若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项
在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。与此
同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。这样
变完成了从逻辑地址到物理地址的变换。
分段式:
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,
用来存放段表始址和段表长度 TL。在进行地址变换时,系统将逻辑地址中的段号与段表
长度 TL 进行比较。若 S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未
越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段
在内存中的起始地址,然后,再检查段内地址 d 是否超过该段的段长 SL。若超过,即 d>SL,
同样发出越界中断信号;若未越界,则将该段的基址与段内地址 d 相加,即可得到要访
问的内存物理地址。
段页式:
在段页式系统中,为了便于实现地址变换,须配置一个段表寄存器,其中存放段表
始址和段表长 TL。进行地址变换时,首先利用段号 S,将它与段表长 TL 进行比较。若
S
段页式:
六.运行环境
在实现地址转换的程序实现时,运用了 eclipse 来实现,因为对 java 程序的编写稍微
熟悉点,可以很好的编写及调试。程序很容易看懂,输入条件在后边备注。
七.程序及运行结果
import java.util.*;
class Ya{
void print(){
System.out.println("***********************");
}
int Ye(){
int b;
int result = 0;
Scanner s=new Scanner(System.in);
System.out.println("请输入页表长度:");
int length=s.nextInt();
int[]a =new int[length];
System.out.println("请按顺序输入页号所对应的块号");
for(int i=0;i=length){
System.out.println("产生越界中断");
}
else{ b=a[i];
result=b*L+d;
}
//System.out.println("物理地址为:"+result);
return result;
}
int Duan(){
int address=0;
int[][] a=new int[10][10];
Scanner s=new Scanner(System.in);
System.out.println("请输入段表长度:");
int length=s.nextInt();
System.out.println("请输入段号所对应的段长和基址:");
for(int i=0;i=length){
System.out.println("产生越界中断");
}
else {
}
if (W>=a[S][0]){
System.out.println("产生越界中断");
else{
address=a[S][1]+W;
}
}
return address;
//System.out.println("转换后的物理地址为:"+address);
}
void Dy(){
int L=1024;
int result=0;
Scanner s=new Scanner(System.in);
System.out.println("请输入段表长度:");
int length=s.nextInt();
System.out.println("请输入段号:");
int S=s.nextInt();
System.out.println("请输入页号:");
int P=s.nextInt();
System.out.println("请输入页内地址:");
int d=s.nextInt();
int[][]a={{3,600},{2,1200},{4,2300},{4,3200}};
int[]b={3,4,9,7};
if(S>=length){
System.out.println("段超长,越界中断");
}
else{ if(P>=a[P][0]){
System.out.println("页超长,越界中断");
}
else
{
result=b[P]*L+d;
System.out.println("转换后的物理地址为:"+result);
}
}
}
}
public class hihihi {
public static void main(String[] args){
Ya r= new Ya();
r.print();
System.out.println("若选择分页方式地址换算方法请输入1");
System.out.println("若选择分段方式地址换算方法请输入2");
System.out.println("若选择段页式地址换算方法请输入3");
r.print();
Scanner s=new Scanner(System.in);
int i=s.nextInt();
switch(i)
{
case 1:System.out.println("转换后的物理地址为:"+r.Ye());break;
case 2:System.out.println("转换后的物理地址为:"+r.Duan());break;
case 3:r.Dy();
}
}
}
运行结果:
八.程序改进:
发现程序中有以下问题:
1.上述程序中的段表和页表是直接从键盘输入,我们可以对程序进行改进,把段
表和页表在程序中显示出来,这样程序的输入就变得简单,并容易理解。段表和
页表确定后,比较段号和段表长度时,段表长度就是固定的,就不需要再设置段
表长度变量。还有,在段页式中,页内始址没有实际用处,所以可以不用输入。
2.第一个分页式中,给定条件应该是逻辑地址,在程序中对逻辑地址换算成页号
和页内地址,而不用直接输入页号和页内地址。
九.改进后的程序和运行结果:
import java.util.*;
class Ya {
void print() {
System.out.println("*****************************");
}
int Ye() {
int b;
int result = 0;
int[]a={3,4,9,7};
Scanner s = new Scanner(System.in);
System.out.println("请输入页面大小:");
int L = s.nextInt();
System.out.println("请输入逻辑地址:");
int r=s.nextInt();
int i,d;
i=(int)(r/L);
d=r%L;
//从键盘输入页面大小