模拟设计段式存储管理中地址转换

更新时间:2024-04-30 20:53:01 阅读量: 综合文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

学 号:

课 程 设 计

课程名称 设计题目

计算机操作系统教程

模拟设计段式存储管理中

地址转换

学 院 专 业 班 级 姓 名 指导教师

计算机科学与技术学院 计算机科学与技术专业

2011 年 1

1

月 20 日

课程设计任务书

学生姓名: 专业班级: 计算机

指导教师: 工作单位: 计算机科学与技术学院

题 目: 模拟设计段式存储管理中地址转换 初始条件:

1.预备内容:阅读操作系统的内存管理章节内容,理解段式存储管理的思想及相应的分配主存的过程。

2.实践准备:掌握一种计算机高级语言的使用。

要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写

等具体要求)

1.实现段式存储管理中逻辑地址到物理地址的转换。能够处理以下的情形:指定内存的大小,进程的个数,每个进程的段数及段大小; 能检查地址的合法性,如果

合法进行转换,否则显示地址非法的原因。

2.设计报告内容应说明:

⑴ ⑵ ⑶ ⑷

课程设计目的与功能;

需求分析,数据结构或模块说明(功能与框图); 源程序的主要部分;

测试用例,运行结果与运行情况分析;

⑸ 自我评价与总结:

i)你认为你完成的设计哪些地方做得比较好或比较出色;

ii)什么地方做得不太好,以后如何改正;

iii)从本设计得到的收获(在编写,调试,执行过程中的经验和教训); iv)完成本题是否有其他的其他方法(如果有,简要说明该方法); v)对实验题的评价和改进意见,请你推荐设计题目。

时间安排:

设计安排一周:周1、周2:完成程序分析及设计。

周2、周3:完成程序调试及测试。

周4、周5:验收、撰写课程设计报告。

(注意事项:严禁抄袭,一旦发现,抄与被抄的一律按0分记)

指导教师签名: 年 月 日 系主任(或责任教师)签名: 年 月 日

2

模拟段式虚拟存储管理中

地址转换

1段式管理的功能

1.1段式管理的基本思想

把程序按内容或过程(函数)关系分成段,每段有自己的名字。一个用户作业或进程所包含的段对应于一个二维线性虚拟空间,也就是一个二维虚拟存储器。段式管理程序以段为单位分配内存,然后通过地址映射机构把段式虚拟地址转换成实际的内存物理地址。和页式管理一样,段式管理也采用只把那些经常访问的段驻留内存,而把那些将来一段时间内不被访问的段放入外存,待需要时自动调入的方法实现二维虚拟存储器。

1.2段式存储的实现原理

1.2.1段式虚存空间

段式管理管理把一个进程的虚拟地址空间设计成二维结构,即短号s与段内相对地址w。与页式管理时不一样的是,页式管理中,被划分的页号按顺序编号递增排列,属一维空间,而段式管理中的段号与段号之间无顺序关系。另外,段的划分也不像页的划分那样具有相同的页长,段的长度的不固定的。每个段定义一组逻辑上完整的程序或数据。

每个段是一个首地址为零、连续的一维线性空间。根据需要,段长课动态增长。对

段式虚地址空间的访问包括两个部分:段名和段内地址。其中的段名经编译程序和链接程序编译链接后转换成机器内部可以识别的段号和段内单元号。

3

1.2.2段式管理的内存分配与释放

段式管理中以段为单位分配内存,每段分配一个连续的内存区。由于各段长度不等,所以这些存储区的大小不一。而且,同一进程所包含的各段之间不要求连续。

段式管理的内存分配与释放在作业或进程的执行过程中动态进行。

动态分配过程:

首先,段式管理为进程或作业分配部分内存,以作为该进程的工作区和放置即将执行的程序段。

随着进程的执行,进程根据需要随时申请调入新段和释放老段。 进程对内存区的申请和释放可分为两种情况:

一种是当进程要求调入某一段时,内存中有足够的空闲区满足该段的内存要求

另一种是内存中没有足够的空闲区满足该段的内存要求。

除了初始分配之外,段的动态分配是在CPU所要访问的指令和数据不在内存时产生缺段中断的情况下发生的。

因此,段的淘汰或置换算法实际上是缺段中断处理过程的一部分。

1.2.3 段式管理的地址变换

(1)段表(segment mapping table)

和页式管理方案类似,段式管理程序在进行初始内存分配之前,首先根据用户要求的内存大小为一个作业或进程建立一个段表。

与页式管理时一样,段式管理也是通过段表来进行内存管理。 段号 始址 长度 存取方式 内外 访问位

4

(2)动态地址变换

一般在内存中给出一块固定的区域放置段表。

当某进程开始执行时,管理程序首先把该进程的段表始址放入段表地址寄存器。

通过访问段表寄存器,管理程序得到该进程的段表始址从而可开始访问段表。 然后,由虚地址中的段号s为索引,查段表。 若该段在内存,则判断其存取控制方式是否有错。

如果存取控制方式正确,则从段表相应表目中查出该段在内存的起始地址,并将其和段内相对地址w相加,从而得到实际内存地址。

如果该段不在内存,则产生缺段中断将CPU控制权交给内存分配程序。 内存分配程序首先检查空闲区链,以找到足够长度的空闲区来装入所需要的段。

如果内存中的可用空闲区总数小于所要求的段长时,则检查段表中访问位,以淘汰那些访问概率低的段并将需要段调入。

与页式管理时相同,段式管理时的地址变换过程也必须经过二次以上的内存访问。

首先访问段表以计算得到待访问指令或数据的物理地址。 然后才是对物理地址进行取数据或存数据操作。

为了提高访问速度,页式地址变换时使用的高速联想寄存器的方法也可以用

5

4.3调度进程:

4.4显示调用后的进程:

11

4.5地址转换: 4.5.1输入进程p1:

4.5.2输入段号:

4.5.3输入偏移地址(未超出范围):

12

4.5.4输入偏移地址(超出范围)的情况:

4.6结束:

5程序源代码:

#include #include\

13

#include \#include\#include using namespace std; struct duan {

long capacity;//该段的长度 long addr;//起始逻辑地址

long realaddr;//该段实际起始地址 };

struct duanbiao {

duan duans[10];

char processname[20]; // 进程的名字 int Isdiaoyong; //是否被调用 int num; //段的数目

long total; //该进程的总占用量 };

long neicun=0;

int duanbiaonum=0; //段表的数目 long zhanyong=0; // 占用的内存 long baseaddr=0; duanbiao duanbiaos[10];

void show1(int ); void show();

void diaodu() {

cout<<\您要调度的进程是:p\ int n; cin>>n;

if(n>duanbiaonum)

cout<<\段表不存在!\

else if(duanbiaos[n-1].Isdiaoyong==1)

cout<<\操作错误,该进程已经被调入到内存!\

14

else if(duanbiaos[n-1].total>neicun-zhanyong) cout<<\内存空间不足,调度不成功!\ else {

cout<<\下面对进程\进行地址转化:\

for(int j=0;j

cout<<\正在进行第\段的地址转换,请稍后......\

duanbiaos[n-1].duans[j].realaddr=duanbiaos[n-1].duans[j].addr+zhanyong;

cout<<\第\段的地址转换成功!\ }

zhanyong=zhanyong+duanbiaos[n-1].total; duanbiaos[n-1].Isdiaoyong =1; cout<<\调度后的结果是:\ show1(n-1); } }

void zhuanhuan() {

int n,i,j;

cout<<\请输入进程:p\ cin>>n;

if(n>duanbiaonum)

cout<<\进程不存在或没被调度!\ else if(duanbiaos[n-1].Isdiaoyong==1) {

cout<<\请输入段号:\ cin>>i;

cout<<\输入偏移地址:\ cin>>j;

if(i>duanbiaos[n-1].num)

15

本文来源:https://www.bwwdw.com/article/thlg.html

Top