三种存储管理方式的地址换算.docx
- 文档编号:5785040
- 上传时间:2023-01-01
- 格式:DOCX
- 页数:26
- 大小:66.76KB
三种存储管理方式的地址换算.docx
《三种存储管理方式的地址换算.docx》由会员分享,可在线阅读,更多相关《三种存储管理方式的地址换算.docx(26页珍藏版)》请在冰豆网上搜索。
三种存储管理方式的地址换算
三种存储管理方式的地址换算
摘要:
操作系统(OperatingSystem,OS)是方便用户、管理和控制计算机软硬件资源的系统软件(或程序集合).从用户角度看,操作系统可以看成是对计算机硬件的扩充;从人机交互方式来看,操作系统是用户与机器的接口;从计算机的系统结构看,操作系统是一种层次、模块结构的程序集合,属于有序分层法,是无序模块的有序层次调用。
操作系统在设计方面体现了计算机技术和管理技术的结合.操作系统是系统软件的核心,、它控制程序的执行和提供资源分配、调度、输入/输出控制和数据管理等任务。
如DOS、UNIX、OS/2和WindowsNT都是得到广泛使用的操作的系统。
三种管理方式中,分页系统能有效地提高内存利用率,分段系统则能很好地满足用户需要,而段页式系统则是把前两种结合起来形成的系统。
这种新系统既具有分段系统的便于实现、分段可共享、易于保护、可动态链接等一系列优点,有能像分页系统那样很好地解决内存的外部碎片问题,以及可为各个分段离散地分配内存等问题.
关键字:
分页方式,分段方式,段页式方式,操作系统.
1.引言:
分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页.在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。
段的长度由相应的逻辑信息组的长度决定,因而个段长度不等。
段页式存储管理方式是分段和分页原理的结合,即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。
三种存储管理都有其相应的段表、页表和地址变换机构。
2.三种存储管理方式地址换算描述:
(1)分页存储管理方式
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了页表寄存器,用于存放页表在内存中的始址和页表的长度.当进程要访问某个逻辑地址中的数据时,分页地址变换机构会自动地将有效地址(相对地址)分为页号和页内地址两部分,再以页号为索引去检索页表.查找操作由硬件执行。
在执行检索之前,先将页号与页表长度进行比较,如果页号大于或等于页表长度,则表示本次所访问的地址已超越进程的地址空间。
于是,这一错误将被系统发现并产生一地址越界中断。
若未出现越界错误,则将页表始址与页号和页表项长度的乘积相加,便得到该表项在页表中的位置,于是可从中得到该页的物理块号,将之装入物理地址寄存器中。
与此同时,再将有效地址寄存器中的页内地址送入物理地址寄存器的块内地址字段中。
这样便完成了从逻辑地址到物理地址的变换。
(2)分段存储管理方式
为了实现从进程的逻辑地址到物理地址的变换功能,在系统中设置了段表寄存器,用于存放段表始址和段表长度TL。
在进行地址变换时,系统将逻辑地址中的段号与段表长度TL进行比较。
若S>TL,表示段号太大,是访问越界,于是产生越界中断信号;若未越界,则根据段表的始址和该段的段号,计算出该段对应段表项的位置,从中读出该段在内存的起始地址,然后,再检查段内地址d是否超过该段的段长SL。
若超过,即d>SL,同样发出越界中断信号;若未越界,则将该段的基址与段内地址d相加,即可得到要访问的内存物理地址。
(3)段页存储管理方式
在段页式系统中,为了便于实现地址变换,需配置一个段表寄存器,其中存放段表始址和段表长TL.进行地址变换时,首先利用段号S,将它与段表长TL进行比较.若S>TL,表示未越界,于是利用段表始址和段号来球出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用逻辑地址中的段内页号P来获得对应表的页表项位置,从中读出该页所在的物理块号b,再利用块号b和页内地址来构成物理地址。
3.程序模块:
#include h> #include 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语言程序设计教程》机械工业出版社 附: 三种存储管理方式地址换算程序清单如下: #include h> #include〈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];//定义段页式的总长度 intmain() { intchoice1,choice2; inttruth=0,truth1; intjobAddr;//进程的逻辑地址空间 intmd;//页面大小 intaddr1;//输入的逻辑地址 intdc;//定义段表的长度 intdh,sAddr;//定义段表的逻辑地址的段号和段内地址 intdyc;//段页式的段表长度 intjobs,jobt,joba;//段页式逻辑段号、段内页号、页内地址 do{ printf(”组员: 符小平崔健王菲菲王天渤\n”); printf(”--——--——-——-—-操作系统课程设计题目: 分页、分段、段页式地址换算-—--—---—-—--—--———\n\n”); printf("总菜单\n”); printf("1。 分页方式\n”); printf(”2。 分段方式\n"); printf("3.段页式\n"); printf("4。 结束\n\n”); printf("—-———-—-—--—-————-———-—--——-----—-—---——--———-—-—--——-—-—-\n"); printf(”请输入您的选择: \n”); scanf(”%d",&choice1); switch(choice1) { case1: {//分页方式 do{ printf("分页方式\n”); printf(”---——-—-——-—--—-———--—---———-—---—-———-—-—-—--—--—-\n"); printf("1。 随机生成进程大小\n"); printf("2.进程创建页表\n”); printf("3。 显示页表的信息\n”); printf("4。 地址换算\n”); printf(”5.退出\n"); printf(”---—-—————-—--—-——--—-————---—-————————-—--——————--\n\n”); printf(”请输入您的选择: ”); scanf(”%d",&choice2); switch(choice2) { case1: { printf("随机生成一个进程(大小在1024K至2048K)\n"); printf("————-—--—-—-—-—-————-—-——-—----—-——-—--—--—————-—-—\n”); do{ jobAddr=rand()%2048;//随机产生进程的逻辑地址空间 }while(jobAddr<1024); printf("该进程的逻辑地址空间是: %d(K)\n",jobAddr); printf("页面的大小: ”); scanf("%d”,&md); truth=1; printf(”---——-—--—----——------—-——-——--—————-—--——--——-——--\n"); }break; case2: { if(truth==1){ printf("\n进程创建的页表\n”); printf(”—--——-——-————-—-——----———————-—-—\n\n"); settable1(jobAddr,md); truth1=1; printf("\n\n--——-———-----———---—--—------——-—\n"); }else{ printf(”\n\n--—-—--------——-—-—-———----—-————\n”); printf(”\n还没有创建进程。 请先选择1创建进程。 \n\n"); printf(”\n\n———--——-——--————-——--—-—---—-——-—\n"); break; } }break; case3: { if(truth==1){ if(truth1==1){ printf("\n显示进程创建的页表\n”); printf("—-—-—-—-—-----—————-----—---————-\n\n"); printTable1(jobAddr,md); printf("\n\n—-———-——--——--———-—-—-——————-——-—\n”); }else{ printf(”\n\n-—-------—-——--————--—-—----—-—--\n”); printf("\n还没有创建页表.请先选择2创建页表.\n\n”); printf(”\n\n——————-—-—-—--———--—-————-—————--\n"); break; } }else{ printf("\n\n-———-—--——-—-———————-——-——--—-—--\n”); printf(”\n还没有创建进程。 请先选择1创建进程.\n\n"); printf("\n\n-—-—-—-—-—-————---—-—-——--——--—--\n"); break; } }break; case4: { if(truth==1){ if(truth1==1){ printf(”\n地址换算\n"); printf(”---———--—----—---———------—-—-——-\n\n"); printf("请你输入要进行换算的逻辑地址(K): "); scanf("%d",&addr1); if(addr1〉jobAddr){ do{ printf(”输入的逻辑地址大于进程地址空间,请重新输入逻辑地址(K): "); scanf(”%d",&addr1); }while(addr1>jobAddr); } transt(jobAddr,md,addr1); printf(”\n\n---——----———-—--——----———--———-——\n"); }else{ printf("\n\n-—--————--———-—-----——-—--——-——-—\n”); printf(”\n还没有创建页表。 请先选择2创建页表。 \n\n"); printf("\n\n—--—---—-——-—-——---—-————-----—--\n"); break; } }else{ printf(”\n\n—--—-—-—-—-——---—-—-———---—------\n"); printf("\n还没有创建进程.请先选择1创建进程.\n\n”); printf("\n\n—--—-—-——--—---——-----—-——--——--—\n"); break; } }break; case5: { printf(”-——-—————-—-------——————----——-——--—-----—————-————\n\n”); printf("退出分页方式地址换算选项,进入总菜单.\n"); printf(”-—————--—-----—-——-—--—--—--———---—-——--————-—---——\n\n”); }break; default: { printf(”--————----—-——-——-——-—--—--———---———---\n”); printf(”错误提示: 你输入的选择有错,请重新选择! \n"); printf("—-———-——---———--—--—--—-———--—---—-————\n”);} } }while(choice2! =5); }break; case2: {//分段方式 do{ printf(”分段方式地址换算\n”); printf(”—-——---——---———--—-————-—-—--—————--—--——---—--——-—\n"); printf(”1。 创建段表\n"); printf("2.显示段表\n”); printf("3。 地址换算\n"); printf(”4。 退出\n”); printf("--—-——-—--——————--—-———-——-—-—-—---—-—-——---————-—-\n\n”); printf("请输入您的选择: ”); scanf(”%d",&choice2); switch(choice2) { case1: { printf("开始创建段表\n”); printf(”—--—-----—--—---——--—————-——-—-————------—-—-———--—\n”); printf(”请输入你要创建的段表长度(最大为512个): "); scanf("%d",&dc); defSect(dc,&truth); printf("—---———-—-—-——-——-——---—-————----—--———---—-———--—-\n”); }break; case2: { if(truth==1){ printf("\n显示已经创建的段表内容\n"); printf(”———--—-——--————-—--—--—————-——---\n\n”); printSect(dc); printf("\n\n——-----———---—-——--—-—---—--—-—--\n”); }else{ printf("\n\n----—--———--———-——-—-——----———-—-\n"); printf("\n还没有创建段表.请先选择1创建段表。 \n\n"); printf(”\n\n--—-————-——-—-—————--—--—--—-----\n"); break; } }break; case3: { if(truth==1){ printf(”分段地址换算\n"); printf(”——----——-—-——-———--—-——-——-———-———-——-——-——-—-——---\n”); printf(”请您输入逻辑地址的段号,段内地址(K): ”); scanf("%d,%d”,&dh,&sAddr); transSect(dc,dh,sAddr); printf(”--——-—-—-—-—-—-—-——---——--———--——-——-——------——-—--\n"); }else{ printf(”--———-—-----—--—-—----—-—-—-——————-——-—-—---—-—--——\n"); printf("\n还没有创建段表.请先选择1创建段表.\n\n"); printf("-—--—-——--——————-—--———---——------—-—-——---——---———\n"); break; } }break; case4: { printf(”-—--—------———-—----——--——--—-——-—-—-——--—-—-——-—-—\n\n"); printf(”退出分段方式地址换算选项,进入总菜单。 \n"); printf("—---—---—-——--—-——-——-——-———---——————--—————-——————\n\n”); }break; default: { printf("-—-—--—————--———-—--—-—---—---—--—----—\n"); printf(”错误提示: 你输入的选择有错,请重新选择! \n"); printf("—-————-———-—----——---—-----—-—-——-————-\n”);} } }while(choice2! =4); }break; case3: {//段页式 do{ printf("段页式地址换算\n"); printf(”--——-——----—--—-—-—-------——--—-——-—--————--------—\n"); printf(”1.创建段页式\n”); printf(”2.显示段页式结构\n”); printf("3.地址换算\n"); printf(”4。 退出\n"); printf(”-——--—-————--———---------—-——-——--—----—----——--—-—\n\n”); printf(”请输入您的选择: "); scanf(”%d",&choice2); switch(choice2) { case1: { printf(”开始创建段页式\n”); printf("———————-----—-—--—-—-——--—--——-------——---——---—--—\n”); printf(”请输入你要创建的段表长度(最大为512个): ”); scanf("%d”,&dyc); printf(”页面的大小K: ”); scanf(”%d”,&md); setSectTable(dyc,md); truth=1; printf("——-——--—-——-——-—---—-————--—--—--—-—-—
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 存储 管理 方式 地址 换算