三种存储管理方式的地址换算Word文档格式.docx
《三种存储管理方式的地址换算Word文档格式.docx》由会员分享,可在线阅读,更多相关《三种存储管理方式的地址换算Word文档格式.docx(26页珍藏版)》请在冰豆网上搜索。
(3)段页存储管理方式
在段页式系统中,为了便于实现地址变换,需配置一个段表寄存器,其中存放段表始址和段表长TL.进行地址变换时,首先利用段号S,将它与段表长TL进行比较.若S>
TL,表示未越界,于是利用段表始址和段号来球出该段所对应的段表项在段表中的位置,从中得到该段的页表始址,并利用逻辑地址中的段内页号P来获得对应表的页表项位置,从中读出该页所在的物理块号b,再利用块号b和页内地址来构成物理地址。
3.程序模块:
#include<
stdlib。
h>
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];
//定义段页式的总长度
4.三种存储管理方式的地址变换机构
(1)分页系统的地址变换机构
(2)分段系统的地址变换机构
段号S
位移量W
(3)段页式系统中的地址变换机构
5.结束语:
为期二周的操作系统课程设计很快就结束了,做为每个学期末的一项必修课,课程设计的目的就是要让我们能够更加深刻的理解课堂上所学的知识,并能够将它们应用到实践中去,让知识能为实践服务。
这次操作系统的课程设计,我是通过编程演示三种存储管理方式的地址换算过程。
通过这次课程设计,加深了我对课堂上所学的三种存储管理方式的地址换算的概念的理解,了解了操作系统的工作原理已经平时遇到的一些状况是怎么样产生的,通过这次操作系统的课程设计,另我学到了很多在课堂上学不到的知识,以及动手能力,这次课程设计老师不限开发工具,因此也锻炼了我们对新的开发工具的掌握能力。
对于我们计算机专业的学生来说,在软件更新如此之快的今天,对新的开发工具的快速掌握能力也是一项必不可少的能力。
当然,在这次课程设计中,也暴露出来了一些问题,就是我对开发工具的使用,虽然大学三年基本是用C编写程序比较多,但是还是感到了力不从心的感觉,就是自己对一些C函数库的了解不够,导致自己在用的时候走了很多弯路,这也从间接让我了解了许多平时学习不到的知识。
课程设计不仅能锻炼我们把知识应用于实践的能力,还锻炼了我们思维的逻辑性。
编写一个BUG尽可能少的程序,需要考虑很多方面的问题,包括给别人试用,这就锻炼了我们逻辑思维的能力,为今后走上工作岗位打下了坚实的基础。
6.参考文献:
《计算机操作系统》西安电子科技大学出版社
《C语言程序设计教程》机械工业出版社
附:
三种存储管理方式地址换算程序清单如下:
#include<
#include〈stdio.h>
intsettable1(intn,intk);
inttranst(intn,intk,intadd);
intdefSect(intn,int*t);
intprintSect(intn);
intsetSectTable(intn,intk);
inttransSectPage(intn,intk,ints1,ints2,ints3);
{
inty1;
}stable;
structstablesetst[512];
intd1;
}setsect;
structsetsectsets[512];
intdy2;
}table;
structtablec1[512];
intc2;
intc3;
}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”);
1。
分页方式\n”);
printf(”2。
分段方式\n"
);
3.段页式\n"
4。
结束\n\n”);
—-———-—-—--—-————-———-—--——-----—-—---——--———-—-—--——-—-—-\n"
);
printf(”请输入您的选择:
\n”);
scanf(”%d"
,&
choice1);
switch(choice1)
case1:
{//分页方式
do{
分页方式\n”);
printf(”---——-—-——-—--—-———--—---———-—---—-———-—-—-—--—--—-\n"
随机生成进程大小\n"
2.进程创建页表\n”);
3。
显示页表的信息\n”);
地址换算\n”);
printf(”5.退出\n"
printf(”---—-—————-—--—-——--—-————---—-————————-—--——————--\n\n”);
printf(”请输入您的选择:
”);
scanf(”%d"
&choice2);
switch(choice2)
随机生成一个进程(大小在1024K至2048K)\n"
————-—--—-—-—-—-————-—-——-—----—-——-—--—--—————-—-—\n”);
jobAddr=rand()%2048;
//随机产生进程的逻辑地址空间
}while(jobAddr<
1024);
该进程的逻辑地址空间是:
%d(K)\n"
,jobAddr);
页面的大小:
”);
scanf("
%d”,&
md);
truth=1;
printf(”---——-—--—----——------—-——-——--—————-—--——--——-——--\n"
}break;
case2:
if(truth==1){
\n进程创建的页表\n”);
printf(”—--——-——-————-—-——----———————-—-—\n\n"
settable1(jobAddr,md);
truth1=1;
\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){
\n显示进程创建的页表\n”);
—-—-—-—-—-----—————-----—---————-\n\n"
printTable1(jobAddr,md);
\n\n—-———-——--——--———-—-—-——————-——-—\n”);
}else{
printf(”\n\n-—-------—-——--————--—-—----—-—--\n”);
\n还没有创建页表.请先选择2创建页表.\n\n”);
printf(”\n\n——————-—-—-—--———--—-————-—————--\n"
\n\n-———-—--——-—-———————-——-——--—-—--\n”);
请先选择1创建进程.\n\n"
\n\n-—-—-—-—-—-————---—-—-——--——--—--\n"
}
}break;
case4:
if(truth1==1){
printf(”\n地址换算\n"
printf(”---———--—----—---———------—-—-——-\n\n"
请你输入要进行换算的逻辑地址(K):
"
%d"
&
addr1);
if(addr1〉jobAddr){
printf(”输入的逻辑地址大于进程地址空间,请重新输入逻辑地址(K):
&addr1);
}while(addr1>
jobAddr);
transt(jobAddr,md,addr1);
printf(”\n\n---——----———-—--——----———--———-——\n"
\n\n-—--————--———-—-----——-—--——-——-—\n”);
printf(”\n还没有创建页表。
请先选择2创建页表。
\n\n—--—---—-——-—-——---—-————-----—--\n"
printf(”\n\n—--—-—-—-—-——---—-—-———---—------\n"
\n还没有创建进程.请先选择1创建进程.\n\n”);
\n\n—--—-—-——--—---——-----—-——--——--—\n"
case5:
printf(”-——-—————-—-------——————----——-——--—-----—————-————\n\n”);
退出分页方式地址换算选项,进入总菜单.\n"
printf(”-—————--—-----—-——-—--—--—--———---—-——--————-—---——\n\n”);
default:
printf(”--————----—-——-——-——-—--—--———---———---\n”);
printf(”错误提示:
你输入的选择有错,请重新选择!
\n"
—-———-——---———--—--—--—-———--—---—-————\n”);
}while(choice2!
=5);
{//分段方式
printf(”分段方式地址换算\n”);
printf(”—-——---——---———--—-————-—-—--—————--—--——---—--——-—\n"
printf(”1。
创建段表\n"
2.显示段表\n”);
地址换算\n"
printf(”4。
退出\n”);
--—-——-—--——————--—-———-——-—-—-—---—-—-——---————-—-\n\n”);
请输入您的选择:
choice2);
开始创建段表\n”);
printf(”—--—-----—--—---——--—————-——-—-————------—-—-———--—\n”);
printf(”请输入你要创建的段表长度(最大为512个):
dc);
defSect(dc,&
truth);
—---———-—-—-——-——-——---—-————----—--———---—-———--—-\n”);
case2:
\n显示已经创建的段表内容\n"
printf(”———--—-——--————-—--—--—————-——---\n\n”);
printSect(dc);
\n\n——-----———---—-——--—-—---—--—-—--\n”);
}else{
\n\n----—--———--———-——-—-——----———-—-\n"
\n还没有创建段表.请先选择1创建段表。
printf(”\n\n--—-————-——-—-—————--—--—--—-----\n"
break;
printf(”分段地址换算\n"
printf(”——----——-—-——-———--—-——-——-———-———-——-——-——-—-——---\n”);
printf(”请您输入逻辑地址的段号,段内地址(K):
%d,%d”,&dh,&
sAddr);
transSect(dc,dh,sAddr);
printf(”--——-—-—-—-—-—-—-——---——--———--——-——-——------——-—--\n"
printf(”--———-—-----—--—-—----—-—-—-——————-——-—-—---—-—--——\n"
\n还没有创建段表.请先选择1创建段表.\n\n"
-—--—-——--——————-—--———---——------—-—-——---——---———\n"
printf(”-—--—------———-—----——--——--—-——-—-—-——--—-—-——-—-—\n\n"
printf(”退出分段方式地址换算选项,进入总菜单。
—---—---—-——--—-——-——-——-———---——————--—————-——————\n\n”);
}break;
default:
-—-—--—————--———-—--—-—---—---—--—----—\n"
你输入的选择有错,请重新选择!
—-————-———-—----——---—-----—-—-——-————-\n”);
=4);
{//段页式
段页式地址换算\n"
printf(”--——-——----—--—-—-—-------——--—-——-—--————--------—\n"
printf(”1.创建段页式\n”);
printf(”2.显示段页式结构\n”);
3.地址换算\n"
退出\n"
printf(”-——--—-————--———---------—-——-——--—----—----——--—-—\n\n”);
,&choice2);
printf(”开始创建段页式\n”);
———————-----—-—--—-—-——--—--——-------——---——---—--—\n”);
%d”,&dyc);
printf(”页面的大小K:
scanf(”%d”,&
setSectTable(dyc,md);
——-——--—-——-——-—---—-————--—--—--—-—-—