页式存储管理中地址转换.docx

上传人:b****6 文档编号:6887454 上传时间:2023-01-12 格式:DOCX 页数:16 大小:92.93KB
下载 相关 举报
页式存储管理中地址转换.docx_第1页
第1页 / 共16页
页式存储管理中地址转换.docx_第2页
第2页 / 共16页
页式存储管理中地址转换.docx_第3页
第3页 / 共16页
页式存储管理中地址转换.docx_第4页
第4页 / 共16页
页式存储管理中地址转换.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

页式存储管理中地址转换.docx

《页式存储管理中地址转换.docx》由会员分享,可在线阅读,更多相关《页式存储管理中地址转换.docx(16页珍藏版)》请在冰豆网上搜索。

页式存储管理中地址转换.docx

页式存储管理中地址转换

操作系统课程设计报告

 

课程设计题目:

页式存储管理中的地址变换

作者所在系部:

计算机科学与工程系

作者所在专业:

网络工程专业

作者所在班级:

B09521

作者姓名:

作者学号:

200940521

指导教师姓名:

完成时间:

2011-12-12

 

北华航天工业学院教务处制

 

摘要

页表的功能可以由一组专门的寄存器来实现。

一个页表项一个寄存器。

由于寄存器具有较高的访问速度,因而有利于提高地址变换的速度;但由于寄存器成本较高,且大多数现在计算机的页表又可能很大,是页表项的总数可达几千甚至几十万个,显然这些页表项不可能都用寄存器来实现,因此,页表大多驻留在内存中。

在系统中只设置页表寄存器PTR(Page-Table-Register),在其中存放页表在的内存的始址和页表的长度。

平时,进程为执行时,页表的始址和页表长度存放在本进程的PCB中。

当调度程序调度到某进程时,才将这两个数据装入页表寄存器中。

因此,在单处理机环境下,虽然系统中可以运行多个进程,但只需一个页表寄存器。

当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号页内地址两部分,再以页号为索引去检索页表。

查找操作由硬件执行。

在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间。

于是,这一错误将被系统发现并产生一地址越界中断。

若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。

与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。

这样便完成了从逻辑地址到物理地址的变换。

在内存的管理的分页管理中,进程的存放是分为若干页的,这些可能存放在连续的内存中,也可能存放在不联系的内存中。

进程所分的页的大小与内存中块的大小相同。

在页表中存放着页与内存块的对应关系,调度进程时要先访问页表,将所需的页调入内存才能执行。

 

关键词:

页表,进程,逻辑地址,物理地址,寄存器。

目录

摘要1

目录2

第1章绪论3

1.1综述3

1.2设计内容与要求3

1.3设计目的4

1.4设计意义4

第2章系统需求分析4

2.1题目描述4

2.2页式存储管理5

2.3基本要求5

第3章程序设计与实现5

3.1概要设计5

3.2数据结构设计6

3.3详细设计6

3.3.1创建进程6

3.3.2撤销进程6

3.3.3地址转换6

第4章程序调试与运行7

4.1实现代码7

4.1.1创建进程7

4.1.2撤销进程9

4.1.3撤销进程10

4.2运行结果11

总结12

致谢13

附录14

第1章绪论

1.1综述

分页系统中的页面其大小应适中。

页面若太小,一方面虽然可使内存碎片减小,从而减少了内存碎片的总空间,有利于提高内存利用率,但另一方面也会使每个进程占用较多的页面,从而导致进程的页表过长,占用大量内存;此外,还会降低页面换进换出的效率。

然而,如果选择的页面较大,虽然可以减少页表的长度,提高页面换进换出的速度,但却又会使页内碎片增大。

在分页系统中,允许将进程的各个页离散地存储在内存不同的物理块中,但系统应能保证进程的正确运行,即能在内存中找到每个页面所对应的物理块。

1.2设计内容与要求

编程模拟页式存储管理中内存分配和地址变换。

设计要求:

(1)能够输入进程名称和内存需求量,按页式存储管理方式把进程分成若干页,分配到内存中的若干个块中,同时生成并显示相应的页表。

(2)输入一个逻辑地址能够转换并输出相应的物理地址。

1.3设计目的

本课程设计是学生学习完《计算机操作系统》课程后,进行的一次全面的综合训练,通过课程设计,让学生更好地掌握操作系统的原理及实现方法,实现操作系统中银行家算法和安全算法来避免死锁的问题,加深对操作系统基础理论和重要算法的理解,加强学生的动手能力。

1.4设计意义

能够理解分页存储的思想,了解页表的结构。

掌握逻辑地址要逻辑的转换。

了解内存的分配及回收。

当创建一个进程之后,根据这个进程的大小,会给这个进程分配内存,可能是连续的内存,也可能是不连续的。

首先会将进程分成若干的页,每页对应内存中的一个物理块。

页的大小等于物理块的大小,这样就形成了页和内存块对应的页表。

进程执行的会先访问页表。

 

第2章系统需求分析

2.1题目描述

能够输入进程名称和内存需求量,按页式存储管理方式把进程分成若干页,分配到内存中的若干个块中,同时生成并显示相应的页表。

输入一个逻辑地址能够转换并输出相应的物理地址。

2.2页式存储管理

在存储器管理中,连续分配方式会形成许多“碎片”,虽然可通过“紧凑”方法将许多碎片拼接成可用的大块空间,但须为之付出很大开销。

如果允许将一个进程直接分散地装入到许多不相邻的分区中,则无须再进行“紧凑”。

基于这一思想而产生了离散分配方式。

如果离散分配的基本单位是页,则称为分页存储管理方式。

在分页存储管理方式中,如果不具备页面对换功能,则称为基本分页存储管理方式,或称为纯分页存储管理方式,它不具有支持实现虚拟存储器的功能,它要求把每个作业全部装入内存后方能运行。

 

分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,也把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框(frame),也同样为它们加以编号。

在为进程分配内存时,以块为单位将进程中的若干个页分别装入到多个可以不相邻接的物理块中。

由于进程的最后一页经常装不满一块而形成了不可利用的碎片,称之为“页内碎片”。

在分页系统中的页面其大小应适中。

页面若太小,一方面虽然可使内存碎片减小,从而减少了内存碎片的总空间,有利于提高内存利用率,但另一方面也会使每个进程占用较多的页面,从而导致进程的页表过长,占用大量内存;此外,还会降低页面换进换出的效率。

2.3基本要求

1)实现创建一个进程,其中包括进程的编号、名称、大小

2)实现能够查询内存块的状态,其中包括已分配的和未分配的内存块

3)能够查询进程的信息

4)能够撤销进程,回收进程占用的内存块

5)能实现进程中逻辑地址到物理地址的转换

第3章程序设计与实现

3.1概要设计

能够输入进程名称和内存需求量,按页式存储管理方式把进程分成若干页,分配到内存中的若干个块中,同时生成并显示相应的页表。

输入一个逻辑地址能够转换并输出相应的物理地址。

另外还可以撤销进程回收已分配的内存块,可以随时查看内存的分配情况。

3.2数据结构设计

privateintpageid;//页号

privateintfreeid;//块号

finalintfreenum=10;//10个空闲的内存块

privateintprocessid;//进程的编号

privateStringprocessname;//进程的名称

privateintprocesssize;//进程的大小

publicpagepagesum[]=newpage[freenum];//存放分页的数量

privateintpagelength;//进程可以分为多少页

finalintfreenum=10;//空闲内存块的数量10

finalintfreesize=1024;//每块的大小也就是每页的大小

processallprocess[]=newprocess[freenum];//存放进程的数组

intprocstate[]=newint[freenum];//将10个内存块放入数组

staticintcount=0;//记录进程个数

staticintavailable=0;//可用的空闲块的数量

3.3详细设计

3.3.1创建进程

创建新进程,根据指示输入选项,进入创建进程命令,输入进程的编号,名称,大小。

其中在输入进程的编号时,若编号重复则不能创建,进程的编号是唯一的。

可以创建多个进程,进程可以同名但是编号不允许重复。

创建之后可以查看新建进程的信息。

3.3.2撤销进程

在操作界面,选择操作项撤销进程,首先通过进程的编号或者名称找到要撤销的进程,撤销成功后出现提示,之后可以查看内存的使用情况,查看已分配的内存是否回收

3.3.3地址转换

实现逻辑地址到物理地址的转换,先确定某进程,然后输入进程的逻辑地址,若输入的逻辑地址大于进程的大小则提示输入错误。

 

第4章程序调试与运行

4.1实现代码

4.1.1创建进程

publicvoidcreateProcess(){//创建进程

p=newprocess();

try{

intnumber=Integer.parseInt(JOptionPane.showInputDialog("请输入进程的编号:

"));

p.setProcessid(number);

intk;

for(k=0;k

if(allprocess[k].getProcessid()==p.getProcessid()){break;}

}//出现相同的编号跳出循环.之后K自加,此时K一定小于count.若无相同的编号K一定等于count

if(k

System.out.println("该进程已经存在!

");//若编号不重复则输入进程的名称

else{

Stringname=String.valueOf(JOptionPane

.showInputDialog("请输入进程的名称:

"));

p.setProcessname(name);//进程的名称

intsize=Integer.parseInt(JOptionPane

.showInputDialog("请输入进程的大小:

"));

p.setProcesssize(size);//进程的大小

intlength=(p.getProcesssize()%freesize==0?

(p

.getProcesssize()/freesize)

:

(p.getProcesssize()/freesize)+1);//确定分页的数量

p.setPagelength(length);//确定新建进程可以分为多少页

for(intc=0;c

if(procstate[c]==0){

available++;

}

}//统计可用的空闲的内存块的数量

if(p.getPagelength()

for(inti=0;i

paged=newpage();

p.pagesum[i]=d;

p.pagesum[i].setPageid(i);

for(intj=0;j

if(procstate[j]==0){

p.pagesum[i].setFreeid(j);

procstate[j]=1;

break;}}}

allprocess[count]=p;

count++;

System.out.println("创建成功!

");

System.out.println("进程的编号为:

"+p.getProcessid()

+"进程的名称为:

"+p.getProcessname()

+"进程分为"+p.getPagelength()+"页储存");

}else{

System.out.println("内存空间不够!

");}}}catch(NumberFormatExceptione){e.getMessage();}}

4.1.2撤销进程

publicvoiddelProcess(){//删除进程

try{

intn,proid,i,j;intflag=0,temp=0;

Stringproname;n=Integer.parseInt(JOptionPane

.showInputDialog("按编号删除请输入1,按名称删除请输入2"));

switch(n){case1:

proid=Integer.parseInt(JOptionPane.showInputDialog("请输入进程的编号:

"));

for(i=0;i

if(allprocess[i].getProcessid()==proid){

flag=1;temp=i;System.out.println(i);

System.out.println(allprocess[i].getPagelength());}}

if(flag==1){

for(intk=0;k

intcode=allprocess[temp].pagesum[k].getFreeid();

procstate[code]=0;}

for(j=temp;j

if(j==freenum-1)allprocess[j]=null;

elseallprocess[j]=allprocess[j+1];

}count--;System.out.println("进程撤销成功!

");}

elseSystem.out.println("进程不存在,无法完成撤消!

!

");break;

case2:

proname=String.valueOf(JOptionPane

.showInputDialog("请输入进程的名称:

"));

for(i=0;i

if(allprocess[i].getProcessname().equals(proname)){flag=1;temp=i;}}

if(flag==1){

for(intk=0;k

intcode=allprocess[temp].pagesum[k].getFreeid();

procstate[code]=0;}

for(j=temp;j

elseallprocess[j]=allprocess[j+1];}count--;System.out.println("进程撤销成功!

");}else

System.out.println("进程不存在,无法完成撤消!

!

");break;

default:

System.out.println("输入有误!

");}

}catch(NumberFormatExceptione){e.getMessage();}}

4.1.3撤销进程

publicvoidAddressSwitch(){//地址转换

try{

intn,proid,i,proaddress=0;

intflag=0,j=0;

Stringproname;n=Integer.parseInt(JOptionPane

.showInputDialog("按编号查找进程请输入1,按名称查找请输入2:

"));

switch(n){

case1:

proid=Integer.parseInt(JOptionPane

.showInputDialog("请输入进程的编号:

"));

for(i=0;i

proaddress=Integer.parseInt(JOptionPane.showInputDialog("输入进程的逻辑地址:

"));}}

if(flag==1){

if(proaddress>allprocess[j].getProcesssize()){System.out.println("地址超出进程范围!

");

}else{intfreeid=0;

intpageid=proaddress/freesize;intPageInnerAddress=proaddress%freesize;

for(intcc=0;cc

if(allprocess[j].pagesum[cc].getPageid()==pageid){

freeid=allprocess[j].pagesum[cc].getFreeid();}}

intObjectAddress=freeid*freesize+PageInnerAddress;

System.out.println("逻辑地址"+proaddress+"转换成物理地址为:

"+ObjectAddress);}

}else{System.out.println("进程不存在,无法完成地址转换!

!

!

");}break;case2:

proname=String.valueOf(JOptionPane.showInputDialog("请输入进程的名称:

"));

for(i=0;i

proaddress=Integer.parseInt(JOptionPane.showInputDialog("输入进程的逻辑地址:

"));}}

if(flag==1){

if(proaddress>allprocess[j].getProcesssize()){

System.out.println("地址超出进程范围!

");}else{

intfreeid=0;intpageid=proaddress/freesize;intPageInnerAddress=proaddress%freesize;

for(intcc=0;cc

if(allprocess[j].pagesum[cc].getPageid()==pageid){

freeid=allprocess[j].pagesum[cc].getFreeid();}}

intObjectAddress=freeid*freesize+PageInnerAddress;

System.out.println("逻辑地址"+proaddress+"转换成物理地址为:

"+ObjectAddress);}}else{

System.out.println("进程不存在,无法完成地址转换!

!

!

");}break;

default:

System.out.println("输入有误!

");

break;}}catch(NumberFormatExceptione)e.getMessage();}}

4.2运行结果

 

 

 

总结

课程设计终于结束了,我们的程序也通过了,这次的课程设计给我们很大的收获,使我们对操作系统的基本知识有了进一步的提高,并在实践中对各种概念有了进一步的深化,开始的时候总觉得很简单的课程设计,因为程序的编写确实不是很难的,所以在开始的时候都没有认真做,一直到要交需求分析的时候才发现老师的要求蛮高的,因为写了三遍的需求分析才通过,虽然只用了一个下午,但明白了一个道理,简单的应付是不容易完成的。

程序的设计思想的精巧的重要性,是不管怎么说都不为过的,好的设计可以让大家很快的明白你的思想,而且很方便的来实现它。

良好的编程习惯,它可以使你的程序很方便的被别人阅读,也很方便的被更改,所以可以的话,尽可能多的写出注释,没有人会闲你写的太多

 

致谢

对于此次课程设计,我早就开始准备了,提前做好了充分的准备,把课本仔细的读了几遍,还在图书馆找了相关的参考书籍,因此此次课设能够很顺利的完成

以前做过的软件方面的课设如C#语言课设、JSP课设,由于自己总是在写程序之前做好充分的准备,因此每次都很顺利,而且成绩也不错。

对于课程设计,我历来都是相当认真的,此次操作系统的课程设计当然也不例外。

可是关于内存的没怎么接触过,所以需要花费更多的时间来准备基础知识。

分数不过是个数字,知识才是自己的。

通过这次课程设计,我确实学到了很多东西,多年后我可能已经忘记这次课设最后打了多少分,但这些学到的东西却可以使我受益终生。

除了知识技术上的东西,我更锻炼了自己的快速学习能力;我学会了如何快速有效地从图书馆、网络获取自己需要的信息;我尝到了在周围很多同学拷来拷去时孤军奋战的痛苦;我体会了夜以继日完成一个项目时中途过程的艰辛及最终完成后巨大的成就感……我更加深了人生的信心,以后面对任何一个困难的项目,我想我都不会惧怕,并最终能够成功地将其完成。

   感谢老师,感谢此次课程设计。

虽然在其中吃了不少苦头,但我毫不后悔,因为我满载而归

 

附录

publicclassjincheng{

finalintfreenum=10;//空闲内存块的数量10

finalintfreesize=1024;//每块的大小也就是每页的大小

processallprocess[]=newprocess[freenum];//

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1