版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、三种存储管理方式的地址换算摘要:操作系统(Operating System,OS)是便利用户、管理和把握计算机软硬件资源的系统软件(或程序集合)。从用户角度看,操作系统可以看成是对计算机硬件的扩充;从人机交互方式来看,操作系统是用户与机器的接口;从计算机的系统结构看,操作系统是一种层次、模块结构的程序集合,属于有序分层法,是无序模块的有序层次调用。操作系统在设计方面体现了计算机技术和管理技术的结合。操作系统是系统软件的核心,、它把握程序的执行和供应资源安排、调度、输入/输出把握和数据管理等任务。如DOS、UNIX、OS/2和Windows NT都是得到广泛使用的操作的系统。 三种管理方式中,分
2、页系统能有效地提高内存利用率,分段系统则能很好地满足用户需要,而段页式系统则是把前两种结合起来形成的系统。这种新系统既具有分段系统的便于实现、分段可共享、易于爱护、可动态链接等一系列优点,有能像分页系统那样很好地解决内存的外部碎片问题,以及可为各个分段离散地安排内存等问题。关键字:分页方式,分段方式,段页式方式,操作系统。1. 引言:分页存储管理是将一个进程的规律地址空间分成若干个大小相等的片,称为页面或页。在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组规律信息。段的长度由相应的规律信息组的长度打算,因而个段长度不等。段页式存储管理方式是分段和分页原理的结合,即先将用户
3、程序分成若干个段,再把每个段分成若干个页,并为每一个段赐予一个段名。三种存储管理都有其相应的段表、页表和地址变换机构。2三种存储管理方式地址换算描述: (1)分页存储管理方式为了实现从进程的规律地址到物理地址的变换功能,在系统中设置了页表寄存器,用于存放页表在内存中的始址和页表的长度。当进程要访问某个规律地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号和页内地址两部分,再以页号为索引去检索页表。查找操作由硬件执行。在执行检索之前,先将页号与页表长度进行比较,假如页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间。于是,这一错误将被系统发觉并产生一地址越界中
4、断。若未消灭越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。这样便完成了从规律地址到物理地址的变换。(2)分段存储管理方式为了实现从进程的规律地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度TL。在进行地址变换时,系统将规律地址中的段号与段表长度TL进行比较。若S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未越界,则依据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段
5、在内存的起始地址,然后,再检查段内地址d是否超过该段的段长SL。若超过,即d>SL,同样发出越界中断信号;若未越界,则将该段的基址与段内地址d相加,即可得到要访问的内存物理地址。(3)段页存储管理方式在段页式系统中,为了便于实现地址变换,需配置一个段表寄存器,其中存放段表始址和段表长TL。进行地址变换时,首先利用段号S,将它与段表长TL进行比较。若S>TL,表示未越界,于是利用段表始址和段号来球出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用规律地址中的段内页号P来获得对应表的页表项位置,从中读出该页所在的物理块号b,再利用块号b和页内地址来构成物理地址。3程序模
6、块:#include <stdlib.h> #include <stdio.h>int settable1(int n,int k);/创建页表 int printTable1(int n,int k);/显示页表 int transt(int n,int k,int add);/分页地址换算 int defSect(int n,int *t);/创建段表 int printSect(int n);/输出段表内容 int transSect(int n,int s,int d);/进行分段地址换算函数 int setSectTable(int n,int k);/创建段
7、页式内容 int printSectTable(int n,int k);/显示段页内容 int transSectPage(int n,int k,int s1,int s2,int s3);/段页式地址换算 /定义页表结构体 typedef struct stable int y1;/页号 int y2;/块号 stable; struct stable setst512; /建立段表的结构体 typedef struct setsect int d1;/段号 int d2;/段长 int d3;/基址 setsect; struct setsect sets512;/定义段表的总长度 /
8、建立段页式内的页表的结构体 typedef struct table int dy1;/页号 int dy2;/块号 table; /建立段页式的结构体 typedef struct setAll struct table c1512;/定义段内页表的结构体 int c2;/段号 int c3;/段长 int c4;/起始地址 setAll; struct setAll set512;/定义段页式的总长度 4三种存储管理方式的地址变换机构(1) 分页系统的地址变换机构页表始址页表长度>页号(3)页内地址1b页表物理地址规律地址L越界中断页表寄存器页号块号0123 欢迎下载(2) 分段系统
9、的地址变换机构段号S位移量W段表始址段表长度>2100越界有效地址段号段长基址0123物理地址(3) 段页式系统中的地址变换机构段表始址段表长度段表寄存器>段超长页号P段号S页内地址0123段表长度页表始址0123b块号b块内地址页表段表5结束语:为期二周的操作系统课程设计很快就结束了,做为每个学期末的一项必修课,课程设计的目的就是要让我们能够更加深刻的理解课堂上所学的学问,并能够将它们应用到实践中去,让学问能为实践服务。这次操作系统的课程设计,我是通过编程演示三种存储管理方式的地址换算过程。通过这次课程设计,加深了我对课堂上所学的三种存储管理方式的地址换算的概念的理解,了解了操作
10、系统的工作原理已经平常遇到的一些状况是怎么样产生的,通过这次操作系统的课程设计,另我学到了很多在课堂上学不到的学问,以及动手力量,这次课程设计老师不限开发工具,因此也熬炼了我们对新的开发工具的把握力量。对于我们计算机专业的同学来说,在软件更新如此之快的今日,对新的开发工具的快速把握力量也是一项必不行少的力量。当然,在这次课程设计中,也暴露出来了一些问题,就是我对开发工具的使用,虽然高校三年基本是用C编写程序比较多,但是还是感到了力不从心的感觉,就是自己对一些C函数库的了解不够,导致自己在用的时候走了很多弯路,这也从间接让我了解了很多平常学习不到的学问。课程设计不仅能熬炼我们把学问应用于实践的力
11、量,还熬炼了我们思维的规律性。编写一个BUG尽可能少的程序,需要考虑很多方面的问题,包括给别人试用,这就熬炼了我们规律思维的力量,为今后走上工作岗位打下了坚实的基础。6参考文献:计算机操作系统 西安电子科技高校出版社C语言程序设计教程 机械工业出版社附:三种存储管理方式地址换算程序清单如下:#include <stdlib.h> #include <stdio.h>int settable1(int n,int k);/创建页表 int printTable1(int n,int k);/显示页表 int transt(int n,int k,int add);/分页地
12、址换算 int defSect(int n,int *t);/创建段表 int printSect(int n);/输出段表内容 int transSect(int n,int s,int d);/进行分段地址换算函数 int setSectTable(int n,int k);/创建段页式内容 int printSectTable(int n,int k);/显示段页内容 int transSectPage(int n,int k,int s1,int s2,int s3);/段页式地址换算 /定义页表结构体 typedef struct stable int y1;/页号 int y2;/
13、块号 stable; struct stable setst512; /建立段表的结构体 typedef struct setsect int d1;/段号 int d2;/段长 int d3;/基址 setsect; struct setsect sets512;/定义段表的总长度 /建立段页式内的页表的结构体 typedef struct table int dy1;/页号 int dy2;/块号 table; /建立段页式的结构体 typedef struct setAll struct table c1512;/定义段内页表的结构体 int c2;/段号 int c3;/段长 int
14、c4;/起始地址 setAll; struct setAll set512;/定义段页式的总长度 int main() int choice1,choice2; int truth=0,truth1; int jobAddr;/进程的规律地址空间 int md;/页面大小 int addr1;/输入的规律地址 int dc;/定义段表的长度 int dh,sAddr;/定义段表的规律地址的段号和段内地址 int dyc;/段页式的段表长度 int jobs,jobt,joba;/段页式规律段号、段内页号、页内地址 do printf(" 组员:符小平 崔健 王菲菲 王天渤n"
15、;); printf("-操作系统课程设计题目:分页、分段、段页式地址换算-nn"); printf(" 总菜单n"); printf(" 1.分页方式n"); printf(" 2.分段方式n"); printf(" 3.段页式n"); printf(" 4.结束nn"); printf("-n"); printf("请输入您的选择:n"); scanf("%d",&choice1); switch(cho
16、ice1) case 1:/分页方式 do printf(" 分页方式n"); printf("-n"); printf(" 1.随机生成进程大小n"); printf(" 2.进程创建页表n"); printf(" 3.显示页表的信息n"); printf(" 4.地址换算n"); printf(" 5.退出n"); printf("-nn"); printf("请输入您的选择:"); scanf("%d
17、",&choice2); switch(choice2) case 1: printf(" 随机生成一个进程(大小在1024K至2048K)n"); printf("-n"); do jobAddr=rand()%2048;/随机产生进程的规律地址空间 while(jobAddr<1024); printf("该进程的规律地址空间是:%d(K)n",jobAddr); printf("页面的大小:"); scanf("%d",&md); truth=1; prin
18、tf("-n"); break; case 2: if(truth=1) printf("n 进程创建的页表n"); printf("-nn"); settable1(jobAddr,md); truth1=1; printf("nn-n"); else printf("nn-n"); printf("n还没有创建进程.请先选择1创建进程.nn"); printf("nn-n"); break; break; case 3: if(truth=1) if(
19、truth1=1) printf("n 显示进程创建的页表n"); printf("-nn"); printTable1(jobAddr,md); printf("nn-n"); else printf("nn-n"); printf("n还没有创建页表.请先选择2创建页表.nn"); printf("nn-n"); break; else printf("nn-n"); printf("n还没有创建进程.请先选择1创建进程.nn");
20、 printf("nn-n"); break; break; case 4: if(truth=1) if(truth1=1) printf("n 地址换算n"); printf("-nn"); printf("请你输入要进行换算的规律地址(K):"); scanf("%d",&addr1); if(addr1>jobAddr) do printf("输入的规律地址大于进程地址空间,请重新输入规律地址(K):"); scanf("%d",&a
21、mp;addr1); while(addr1>jobAddr); transt(jobAddr,md,addr1); printf("nn-n"); else printf("nn-n"); printf("n还没有创建页表.请先选择2创建页表.nn"); printf("nn-n"); break; else printf("nn-n"); printf("n还没有创建进程.请先选择1创建进程.nn"); printf("nn-n"); break
22、; break; case 5: printf("-nn"); printf("退出分页方式地址换算选项,进入总菜单.n"); printf("-nn"); break; default: printf("-n"); printf("错误提示:你输入的选择有错,请重新选择!n"); printf("-n"); while (choice2!=5); break; case 2:/分段方式 do printf(" 分段方式地址换算n"); printf(&q
23、uot;-n"); printf(" 1.创建段表n"); printf(" 2.显示段表n"); printf(" 3.地址换算n"); printf(" 4.退出n"); printf("-nn"); printf("请输入您的选择:"); scanf("%d",&choice2); switch(choice2) case 1: printf(" 开头创建段表n"); printf("-n")
24、; printf("请输入你要创建的段表长度(最大为512个):"); scanf("%d",&dc); defSect(dc,&truth); printf("-n"); break; case 2: if(truth=1) printf("n 显示已经创建的段表内容n"); printf("-nn"); printSect(dc); printf("nn-n"); else printf("nn-n"); printf("n还
25、没有创建段表.请先选择1创建段表.nn"); printf("nn-n"); break; break; case 3: if(truth=1) printf(" 分段地址换算n"); printf("-n"); printf("请您输入规律地址的段号,段内地址(K):"); scanf("%d,%d",&dh,&sAddr); transSect(dc,dh,sAddr); printf("-n"); else printf("-n&qu
26、ot;); printf("n还没有创建段表.请先选择1创建段表.nn"); printf("-n"); break; break; case 4: printf("-nn"); printf("退出分段方式地址换算选项,进入总菜单.n"); printf("-nn"); break; default: printf("-n"); printf("错误提示:你输入的选择有错,请重新选择!n"); printf("-n"); while
27、(choice2!=4); break; case 3:/段页式 do printf(" 段页式地址换算n"); printf("-n"); printf(" 1.创建段页式n"); printf(" 2.显示段页式结构n"); printf(" 3.地址换算n"); printf(" 4.退出n"); printf("-nn"); printf("请输入您的选择:"); scanf("%d",&choice
28、2); switch(choice2) case 1: printf(" 开头创建段页式n"); printf("-n"); printf("请输入你要创建的段表长度(最大为512个):"); scanf("%d",&dyc); printf("页面的大小K:"); scanf("%d",&md); setSectTable(dyc,md); truth=1; printf("-n"); break; case 2: if(truth=1)
29、 printf("n 显示段页式结构n"); printf("-nn"); printSectTable(dyc,md); printf("nn-n"); else printf("nn-n"); printf("n还没有创建段页式.请先选择1创建段页式.nn"); printf("nn-n"); break; break; case 3: if(truth=1) printf(" 段页式地址换算n"); printf("-n"); p
30、rintf("请输入要查找的规律地址段号:"); scanf("%d",&jobs); printf("段内页号:"); scanf("%d",&jobt); printf("页内地址(K):"); scanf("%d",&joba); transSectPage(dyc,md,jobs,jobt,joba); printf("-n"); else printf("-n"); printf("n还没有创
31、建段表.请先选择1创建段页式.nn"); printf("-n"); break; break; case 4: printf("-nn"); printf("退出段页式地址换算选项,进入总菜单.n"); printf("-nn"); break; default: printf("-n"); printf("错误提示:你输入的选择有错,请重新选择!n"); printf("-n"); while (choice2!=4); break; cas
32、e 4: printf("预备退出程序!n"); break; default: printf("-n"); printf("错误提示:你输入的选择有错,请重新选择!n"); printf("-n"); while (choice1!=4); return (0); /创建页表 int settable1(int n,int k) int p;/页号 int d;/剩余地址 int i; int block;/块号 p=n/k;/求出规律地址空间总页数 d=n%k;/求出该页大小 block=1024*1024/k
33、; /求出最大块号 for(i=0;i<p;i+) setsti.y1=i;/页号 setsti.y2=rand()%block;/定义随机产生的块号在1到(1M内存/页面大小)之间 printf("正在创建中···n"); if(d!=0) setstp.y1=p;/页号 setstp.y2=rand()%block;/定义随机产生的块号在1到(1M内存/页面大小)之间 printf("n页表已经创建成功!"); return (0); /显示页表 int printTable1(int n,int k) int p
34、; int d; int i; p=n/k;/求出总页数 d=n%k;/求出该页大小 printf(" 进程规律地址空间:%dK 页面大小:%dKn",n,k); printf(" 页表n"); if(d!=0) for(i=0;i<=p;i+) printf("页号:%d->块号:%dn",setsti.y1,setsti.y2); else for(i=0;i<p;i+) printf("页号:%d->块号:%dn",setsti.y1,setsti.y2); return (0); /
35、分页地址换算 int transt(int n,int k,int add) int p1,d1; p1=add/k;/求出规律页号 d1=add%k;/求出规律页内地址 printf("n 分页地址换算结果.n"); printf("-n"); printf("进程规律地址空间=%dKn",n); printf("页面大小=%dKn",k); printf("给定的规律地址=%dKn",add); printf("页号=%dn",p1); printf("块号=%
36、dn",setstp1.y2); printf("起始地址=%dKn",setstp1.y2*k); printf("页内地址=%dKn",d1);printf("物理地址=(起始地址+页内地址)=%dKn",setstp1.y2*k+d1);printf("n-n"); return (0); /创建段表 int defSect(int n,int *t) int i; printf("n 开头给各个段号安排段长和基址.n"); printf("-n"); for
37、(i=0;i<n;i+) setsi.d1=i; printf("定义第%d段的段长(K):",i); scanf("%d",&setsi.d2);/自己定义段长 (1050) setsi.d3=rand()%2048;/定义随机产生基址为1到2048之间 *t=1; printf("n-n"); return (0); /输出段表 int printSect(int n) int i; printf(" 段表n"); for(i=0;i<n;i+) printf("n");
38、 printf("段号:%d->段长:%dK->起始地址:%dK",setsi.d1,setsi.d2,setsi.d3); return (0); /进行分段地址换算 int transSect(int n,int s,int d) int sum; printf(" 分段地址换算结果"); printf("n-n"); if(s<n)/段号与段表长度比较 if(d<=setss.d2)/段内地址与该段的段长比较 sum=setss.d3+d; printf("查找段号=%dn",s);
39、printf("该段段长=%dKn",setss.d2); printf("该段起始地址=%dKn",setss.d3); printf("分段地址中的段内地址=%dKn",d); printf("物理地址=(起始地址+段内地址)=%dKn",sum); else printf("输入的段内地址超过该段的段长,访问越界,产生越界中断信号!n"); else printf("输入的段号太大,访问越界,产生越界中断信号n!"); printf("-nn");
40、return (0); /创建段页式内容 int setSectTable(int n,int k) int p,d; int i,j; int block; block=1024*1024*1024/k;/求出最大块号 for(i=0;i<n;i+) seti.c2=i; printf("定义第%d段的段长(大于1024K,小于2048K):",i); scanf("%d",&seti.c3);/自己定义段长 p=seti.c3/k; d=seti.c3%k; seti.c4=rand()%1024;/定义随机产生的起始地址在1到1024
41、之间 for(j=0;j<p;j+) seti.c1j.dy1=j;/页号 seti.c1j.dy2=rand()%block;/定义随机产生的起始地址在1到(1G内存/页面大小)之间 if(d!=0) seti.c1p.dy1=p;/页号 seti.c1p.dy2=rand()%block;/定义随机产生的起始地址在1到(1G内存/页面大小)之间 return (0); /显示段页式内容 int printSectTable(int n,int k) int i,j; int s,p,d; printf(" 段表长度:%d 页面大小:%dKn",n,k); printf(" 段页式:"); for(i=0;i<n;i+)printf("n段号:%d->页表大小:%dK->页表起始地址:%dK->页表n",i,seti.c3,seti.c4); s=seti.c3; p=s/k; d=s%k; /显示段页式结构的内容 if(d!=0) for(j=0;j<=p;j+) printf("页号:%d->块号:%dn",seti
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 心理咨询员报考条件
- 二零二四年度股权投资合同标的投资额度3篇
- 二零二四年文化艺术交流与推广合同
- 二零二四年度出版合同
- 2024存量住宅装修设计合同
- 二零二四年度环保产业技术合作合同
- 二零二四年度数据中心装修工程安全标准合同
- 二零二四年智能电网用特种电缆订购合同
- 二零二四年度新能源汽车采购代理合同
- 存量航空器材租赁合同04年专用
- 胸腰椎骨折的微创手术治疗优选ppt资料
- 初三毕业班语文家长会
- 包覆产品工艺课件
- 初一班会课课件
- 货物采购验收单
- 等比数列的前n项和-(完美版)课件
- 心电图理论知识考核试题与答案
- 中医护理创新项目:耳穴刮痧课件
- 非洲安哥拉项目计划书以及运营模式简介5.30
- 环三亚甲基三硝胺(黑索金、旋风炸药)的理化性质及危险特性表
- 广东省义务教育阶段学生学籍卡表格
评论
0/150
提交评论