课程设计三种存储管理方式的地址换算.docx
- 文档编号:4819703
- 上传时间:2022-12-09
- 格式:DOCX
- 页数:29
- 大小:177.02KB
课程设计三种存储管理方式的地址换算.docx
《课程设计三种存储管理方式的地址换算.docx》由会员分享,可在线阅读,更多相关《课程设计三种存储管理方式的地址换算.docx(29页珍藏版)》请在冰豆网上搜索。
课程设计三种存储管理方式的地址换算
摘要
分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,相应地,也把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框(frame),也同样为它们加以编号。
在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。
每个段都从0开始编址,并采用一段连续的地址空间。
段的长度由相应的逻辑信息组的长度决定,因而各段长度不等。
整个作业的地址空间由于是分成多个段,因而是二维的,亦即,其逻辑地址由段号(段名)和段内地址所组成。
段页式系统的基本原理,是基本分段存储管理方式和基本分页存储管理方式原理的结合,即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。
1概述4
(一)分页存储管理方式的作用:
4
(二)分段存储管理方式的作用:
4
(三)段页式存储管理方式的作用4
2.课程设计任务及要求5
2.1设计任务5
2.2设计要求5
(一)分页方式的地址换算。
具体要求:
5
随机生成页面大小,但一定为2的幂,系统随机生成一个至少有10行的页表,页号、块号从0开始。
5
分段方式的地址换算。
具体要求:
5
(二)段页式的地址换算。
具体要求:
5
3.算法及数据结构6
3.1算法的总体思想6
3.2数据结构模块6
3.3分页方式的地址换算模块7
3.4分段方式的地址换算模块9
3.5段页方式的地址换算模块10
3.6主函数模块12
4.程序设计与实现14
4.1程序流程图14
5.结论24
6.收获、体会和建议25
7.参考文献26
1概述
(一)分页存储管理方式的作用:
页表的功能可以由一组专门的寄存器来实现。
一个页表项用一个寄存器。
由于寄存器具有较高的访问速度,因而有利于提高地址变换的速度;在分页系统中,选择过小的页面大小,可以减少内存碎片,起到减少内存碎片总空间的作用,有利于内存利用率的提高。
(二)分段存储管理方式的作用:
A.方便编程
B.信息共享
在实现对程序和数据的共享时,是以信息的逻辑单位为基础的。
段是信息的逻辑单位。
由此可知,为了实现段的共享,希望存储管理能与用户程序分段的组织方式相适应。
C.信息保护
信息保护同样是对信息的逻辑单位进行保护,因此,分段管理方式能更有效和方便地实现信息保护功能。
D.动态增长
在实际应用中,往往有些段,特别是数据段,在使用过程中会不断地增长,而事先又无法确切地知道数据段会增长到多大。
分段存储管理方式能较好地解决这一问题。
E.动态链接
动态链接是指在作业运行之前,并不把几个目标程序段链接起来。
要运行时,先将主程序所对应的目标程序装入内存并启动运行,当运行过程中又需要调用某段时,才将该段(目标程序)调入内存并进行链接。
可见,动态链接也要求以段作为管理的单位。
(三)段页式存储管理方式的作用
分页系统以页面作为内存分配的基本单位,能够有效地提高内存利用率,而分段系统以段作为内存分配的基本单位,他能够更好地满足用户多方面的需要。
如果能对两种存储管理方式“各取所长”,则可形成一种新的存储器管理方式——段页式存储管理方式。
这种新的系统既具有分段系统的便于实现、分段可共享、易于保护、可动态链接等一系列优点,又能像分页系统那样,很好地解决内存的外部碎片问题。
2.课程设计任务及要求
2.1设计任务
日期
陈国毅
卢耀荣
星期三下午
阅读书本关于3种算法转换
阅读书本关于3种算法转换
星期四上午
在网上查阅相关资料
参考网上相关资料
星期四下午
开始尝试编写分页方式地址换算
开始尝试编写分段方式地址换算
星期五上午
和队员讨论,开始实现完整的分页方式算法编写且继续查阅相关资料,并一起研究编写段页式方式的换算算法编写
和队员讨论,开始实现完整的分段方式算法编写且继续查阅相关资料,并一起研究编写段页式方式的换算算法编写
星期五下午
讨论和修改相关代码,优化算法,得到最终代码,并共同编写文档
讨论和修改相关代码,并且优化算法,得到最终代码并共同编写文档,
2.2设计要求
(一)分页方式的地址换算。
具体要求:
随机生成页面大小,但一定为2的幂,系统随机生成一个至少有10行的页表,页号、块号从0开始。
1)用户给定一个逻辑地址,首先显示此地址的页号和页内地址,然后显示是第几块,最后显示其物理地址。
分段方式的地址换算。
具体要求:
1)由系统随机生成5个左右的段,并随机生成一个段表并显示。
2)由用户给定一个逻辑地址,包括段号和段内地址,最后显示其物理地址。
(二)段页式的地址换算。
具体要求:
1)先由系统随机生成5个左右的段,然后再由系统随机生成页面大小,但一定为2的幂。
然后生成段表和页表。
2)由用户给定一个逻辑地址,包括段号和段内地址,最后显示其物理地址。
3.算法及数据结构
3.1算法的总体思想
3.2数据结构模块
3.2.1功能
进程的结构体声明与函数的声明
3.2.2数据结构
intflag;//分配状态,1为已分配,0为未分配
intallo;//页数
intr;//随机数
intl_addr;//逻辑地址
intp_addr;//物理地址
intpnum,mnum;//页号、内存块号
intaddr;//页内地址
intmemsize;//内存容量
intz;//随机数
Memory*memory;//内存地址
PageTable*page;//页表地址
intnum;//段表长
intl_addr;//段内编移
intp_addr;//物理地址
intsnum;//段号
SegTable*seg;//段表地址
3.3分页方式的地址换算模块
3.3.1功能
随机生成页面大小,但一定为2的幂,系统随机生成一个至少有10行的页表,页号、块号从0开始。
用户给定一个逻辑地址,首先显示此地址的页号和页内地址,然后显示是第几块,最后显示其物理地址。
3.3.2数据结构
voidpageTra()//分页方式的地址换算
3.3.3算法
voidpageTra()//分页方式的地址换算
{
intallo;//页数
inti;
intr;//随机数
intl_addr;//逻辑地址
intp_addr;//物理地址
intpnum,mnum;//页号、内存块号
intaddr;//页内地址
intmemsize;//内存容量
intz;//随机数
Memory*memory;//内存地址
PageTable*page;//页表地址
z=6+rand()%8;//随机数Z的范围6到8
memsize=pow(2,z);//2的Z次幂运算得出大小为2的幂
printf("自动生成页面的大小为:
%d\n",memsize);
allo=11;//进程数为11
if(allo>memsize)//判断
{
printf("超出内存容量,无法分配!
\n");
return;
}
memory=malloc(memsize*sizeof(Memory));//分配内存
page=malloc(allo*sizeof(PageTable));//分配内存给页表
initMem(memory,memsize);//内存
for(i=0;i { r=rand()%memsize; while(memory[r].flag) r=(r+1)%memsize; page[i].addr=r;//页表地址 memory[r].flag=1; } printf("******************页表内容**************\n"); printf("页号\t块号\n");//输出页表 for(i=0;i printf("%d\t%d\n",i,page[i].addr);//输出页表 printf("****************************************\n"); while (1) { printf("请输入逻辑地址: "); scanf("%d",&l_addr);//逻辑地址赋值 pnum=l_addr/BLOCK;//求页号 if(pnum>=allo)//判断是否越界 printf("地址越界! \n"); else { addr=l_addr%BLOCK;//取余,得出页内地址 mnum=page[pnum].addr;//内存块号 p_addr=mnum*memsize+addr;//计算物理地址 printf("逻辑地址%d所在页号是%d,页内地址是%d,内存块号是%d,物理地址是%d\n",l_addr,pnum,addr,mnum,p_addr);//输出物理地址 break; } } } 3.4分段方式的地址换算模块 3.4.1功能 由系统随机生成5个左右的段,并随机生成一个段表并显示。 由用户给定一个逻辑地址,包括段号和段内地址,最后显示其物理地址。 3.4.2数据结构 voidsegTra()//分段方式的地址换算模块 3.4.3算法 voidsegTra()//分段方式的地址换算模块 { intnum;//段表长 inti=0; intl_addr;//段内编移 intp_addr;//物理地址 intsnum;//段号 SegTable*seg;//段表地址 num=5;//段的数目5 seg=malloc(num*sizeof(SegTable));//分配内存 //initSeg(seg,num); seg[0].len=1+rand()%20;//随机生成第0段的大小 seg[0].addr=1+rand()%20;//随机生成第0段的基址 seg[1].len=1+rand()%20;//随机生成第1段的大小 seg[1].addr=21+rand()%40;//随机生成第1段的基址 seg[2].len=1+rand()%20;//随机生成第2段的大小 seg[2].addr=41+rand()%60;//随机生成第2段的基址 seg[3].len=1+rand()%20;//随机生成第3段的大小 seg[3].addr=61+rand()%80;//随机生成第3段的基址 seg[4].len=1+rand()%20;//随机生成第4段的大小 seg[4].addr=81+rand()%100;//随机生成第4段的基址 printf("***********************段表内容*************************\n"); printf("段号\t段长\t基址\n"); for(i=0;i printf("%d\t%d\t%d\n",i,seg[i].len,seg[i].addr); printf("***********************Hetiu***************************\n"); while (1) { printf("请输入段号和段内地址(#: #): ");//输入段号和段内地址 scanf("%d: %d",&snum,&l_addr);//赋值段号和段内地址 if(snum>=num||snum<0||seg[snum].len printf("地址越界! \n"); else { p_addr=seg[snum].addr+l_addr;//计算物理地址 printf("逻辑地址%d: %d的物理地址是%d\n",snum,l_addr,p_addr);//输出物理地址 break; } } } 3.5段页方式的地址换算模块 3.5.1功能 先由系统随机生成5个左右的段,然后再由系统随机生成页面大小,但一定为2的幂。 然后生成段表和页表。 由用户给定一个逻辑地址,包括段号和段内地址,最后显示其物理地址。 3.5.2数据结构 voidsegPageTra()//段页式的地址换算 3.5.2算法 voidsegPageTra()//段页式的地址换算 { inti,j,count=0; intr;//随机数 intl_addr;//逻辑地址 intp_addr;//物理地址 intnum,snum,pnum,mnum;//段表长、段号、页号、内存块号 intaddr;//页内地址 intmemsize;//内存容量 intz; Memory*memory;//内存地址 Segment*seg;//段表地址 z=6+rand()%8;//Z随机数,范围6到8 memsize=pow(2,z);//页表大小,2的幂 num=5;//段的数目5 seg=malloc(num*sizeof(Segment));//分配内存给段表 memory=malloc(memsize*sizeof(Memory));//分配内存大小 initMem(memory,memsize);//初始化内存和大小 i=0; seg[0].len=1+rand()%5;//随机分配第0段表的段的数目1到5 seg[1].len=1+rand()%5;//随机分配第1段表的段的数目1到5 seg[2].len=1+rand()%5;//随机分配第2段表的段的数目1到5 seg[3].len=1+rand()%5;//随机分配第3段表的段的数目1到5 seg[4].len=1+rand()%5;//随机分配第4段表的段的数目1到5 initSegment(seg,num);//初始化段页表 for(i=0;i for(j=0;j { r=rand()%memsize; while(memory[r].flag) r=(r+1)%memsize; seg[i].page[j].addr=r; memory[r].flag=1; } printf("********************段页表内容******************************\n"); printf("段号\t段内页表号\t块号\n"); for(i=0;i { printf("%d",i); for(j=0;j printf("\t%d\t\t%d\n",j,seg[i].page[j].addr);//输出段号,段内页表,块号 printf("----------------------------\n"); } printf("***********************************************************\n"); printf("自动生成页面的大小为: %d\n",memsize);//输出页面的大小 while (1) { printf("请输入段号和段内地址(#: #): ");//提示用户输入段号和段内地址 scanf("%d: %d",&snum,&l_addr);//赋值段号和段内地址 pnum=l_addr/BLOCK;//根据逻辑地址的段内地址和块的大小来获得对应页的页表项位置 addr=l_addr%BLOCK;//取余,求得页表始址 if(snum>=num||snum<0||seg[snum].len printf("地址越界! \n"); else { mnum=seg[snum].page[pnum].addr;//再获取物理块号 p_addr=seg[snum].page[pnum].addr*memsize+addr;//计算物理地址 printf("逻辑地址%d: %d所在页号是%d,内存块号是%d,页内地址是%d,物理地址是%d\n",snum,l_addr,pnum,mnum,addr,p_addr); break; } } } 3.6主函数模块 3.6.1功能 用于程序与用户的交互操作,由用户选择算法,并执行相应的算法。 3.6.2数据结构 voidmain()//主函数 3.6.3算法 voidmain()//主函数 { intselect; MENU: system("cls"); printf("**************************三种存储管理方式的地址换算**********************\n"); printf("1.分页方式的地址换算\n"); printf("2.分段方式的地址换算\n"); printf("3.段页方式的地址换算\n"); printf("*********************计算机操作系统课程设计——卢耀荣、陈国毅**************\n");//以上是界面 printf("请选择: "); scanf("%d",&select);//输入,选择功能模块 switch(select)//swithch函数 { case1: pageTra();//分页方式的地址换算模块 system("pause"); gotoMENU; break; case2: segTra();//分段方式的地址换算模块 system("pause"); gotoMENU; break; case3: segPageTra();//段页方式的地址换算模块 system("pause"); gotoMENU; break; default: gotoMENU; break; } } 4.程序设计与实现 4.1程序流程图 4.2程序代码 #include #include #include #include #include #defineBLOCK512//默认块大小为512B typedefstructMEMORY//内存块 { intflag;//分配状态,1为已分配,0为未分配 }Memory; typedefstructPAGETABLE//页表 { //intflag;//状态 intaddr;//物理地址 }PageTable; typedefstructSEGTABLE//段表 { //intflag;//状态 intlen;//段长 intaddr;//段基址 }SegTable; typedefstructSEGMENT//段页表 { //intflag;//状态 intlen;//段长 PageTable*page;//页表地址 }Segment; //voidinitMem(Memory*men,intmemsize);//初始化内存 //voidinitPage(PageTable*page,intsize);//初始化页表 //voidinitSeg(SegTable*seg,intsize);//初始化段表 voidinitSegment(Segment*seg,intsize);//初始化段页表 voidpageTra();//分页方式的地址换算 voidsegTra();//分段方式的地址换算 voidsegPageTra();//段页方式的地址换算 voidmain()//主函数 { intselect; MENU: system("cls"); printf("**************************三种存储管理方式的地址换算**********************\n"); printf("1.分页方式的地址换算\n"); printf("2.分段方式的地址换算\n"); printf("3.段页方式的地址换算\n"); printf("*********************计算机操作系统课程设计——卢耀荣、陈国毅**************\n");//以上是界面 printf("请选择: "); scanf("%d",&select);//输入,选择功能模块 switch(select)//swithch函数 { case1: pageTra();//分页方式的地址换算模块 system("pause"); gotoMENU; break; case2: segTra();//分段方式的地址换算模块 system("pause"); gotoMENU; break; case3: segPageTra();//段页方式的地址换算模块 system("pause"); gotoMENU; break; default: gotoMENU; break; } } voidinitMem(Memory*mem,intmemsize)//初始化内存 { inti; for(i=0;i mem[i].flag=0; } /* voidinitPage(PageTable*page,intsize)//初始化页表 { inti; for(i=0;i page[i].flag=0; } voidinitSeg(SegTable*seg,intsize)//初始化段表 { inti; for(i=0;i seg[i].flag=0; } */ voidinitSegment(Segment*seg,intsize)//初始化段页表 { inti; for(i=0;i seg[i].page=malloc(seg[i].len*sizeof(PageTable)); } /* 功能: 分页方式的地址换算 输入: 逻辑地址 输出: 物理地址 */ voidpageTra()//分页方式的地址换算 { intallo;//进程大小 inti; int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 课程设计 存储 管理 方式 地址 换算
![提示](https://static.bdocx.com/images/bang_tan.gif)