课程设计:三种存储管理方式的地址换算_第1页
课程设计:三种存储管理方式的地址换算_第2页
课程设计:三种存储管理方式的地址换算_第3页
课程设计:三种存储管理方式的地址换算_第4页
课程设计:三种存储管理方式的地址换算_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

摘要分页存储管理是将一个进程的逻辑地址空间分成若干个大小相等的片,称为页面或页,并为各页加以编号,从0开始,相应地,也把内存空间分成与页面相同大小的若干个存储块,称为(物理)块或页框(frame),也同样为它们加以编号。在分段存储管理方式中,作业的地址空间被划分为若干个段,每个段定义了一组逻辑信息。每个段都从0开始编址,并采用一段连续的地址空间。段的长度由相应的逻辑信息组的长度决定,因而各段长度不等。整个作业的地址空间由于是分成多个段,因而是二维的,亦即,其逻辑地址由段号(段名)和段内地址所组成。段页式系统的基本原理,是基本分段存储管理方式和基本分页存储管理方式原理的结合,即先将用户程序分成若干个段,再把每个段分成若干个页,并为每一个段赋予一个段名。

目录1概述 4(一) 分页存储管理方式的作用: 4(二) 分段存储管理方式的作用: 4(三) 段页式存储管理方式的作用 42.课程设计任务及要求 52.1设计任务 52.2设计要求 5(一) 分页方式的地址换算。具体要求: 5随机生成页面大小,但一定为2的幂,系统随机生成一个至少有10行的页表,页号、块号从0开始。 5分段方式的地址换算。具体要求: 5(二) 段页式的地址换算。具体要求: 53.算法及数据结构 63.1算法的总体思想 63.2数据结构模块 63.3分页方式的地址换算模块 73.4分段方式的地址换算模块 93.5段页方式的地址换算模块 103.6主函数模块 124.程序设计与实现 144.1程序流程图 145.结论 246.收获、体会和建议 257.参考文献 261概述分页存储管理方式的作用:页表的功能可以由一组专门的寄存器来实现。一个页表项用一个寄存器。由于寄存器具有较高的访问速度,因而有利于提高地址变换的速度;在分页系统中,选择过小的页面大小,可以减少内存碎片,起到减少内存碎片总空间的作用,有利于内存利用率的提高。分段存储管理方式的作用:方便编程信息共享在实现对程序和数据的共享时,是以信息的逻辑单位为基础的。段是信息的逻辑单位。由此可知,为了实现段的共享,希望存储管理能与用户程序分段的组织方式相适应。信息保护信息保护同样是对信息的逻辑单位进行保护,因此,分段管理方式能更有效和方便地实现信息保护功能。动态增长在实际应用中,往往有些段,特别是数据段,在使用过程中会不断地增长,而事先又无法确切地知道数据段会增长到多大。分段存储管理方式能较好地解决这一问题。动态链接动态链接是指在作业运行之前,并不把几个目标程序段链接起来。要运行时,先将主程序所对应的目标程序装入内存并启动运行,当运行过程中又需要调用某段时,才将该段(目标程序)调入内存并进行链接。可见,动态链接也要求以段作为管理的单位。段页式存储管理方式的作用分页系统以页面作为内存分配的基本单位,能够有效地提高内存利用率,而分段系统以段作为内存分配的基本单位,他能够更好地满足用户多方面的需要。如果能对两种存储管理方式“各取所长”,则可形成一种新的存储器管理方式——段页式存储管理方式。这种新的系统既具有分段系统的便于实现、分段可共享、易于保护、可动态链接等一系列优点,又能像分页系统那样,很好地解决内存的外部碎片问题。

2.课程设计任务及要求2.1设计任务日期陈国毅卢耀荣星期三下午阅读书本关于3种算法转换阅读书本关于3种算法转换星期四上午在网上查阅相关资料参考网上相关资料星期四下午开始尝试编写分页方式地址换算开始尝试编写分段方式地址换算星期五上午和队员讨论,开始实现完整的分页方式算法编写且继续查阅相关资料,并一起研究编写段页式方式的换算算法编写和队员讨论,开始实现完整的分段方式算法编写且继续查阅相关资料,并一起研究编写段页式方式的换算算法编写星期五下午讨论和修改相关代码,优化算法,得到最终代码,并共同编写文档讨论和修改相关代码,并且优化算法,得到最终代码并共同编写文档,2.2设计要求分页方式的地址换算。具体要求:随机生成页面大小,但一定为2的幂,系统随机生成一个至少有10行的页表,页号、块号从0开始。用户给定一个逻辑地址,首先显示此地址的页号和页内地址,然后显示是第几块,最后显示其物理地址。分段方式的地址换算。具体要求:由系统随机生成5个左右的段,并随机生成一个段表并显示。由用户给定一个逻辑地址,包括段号和段内地址,最后显示其物理地址。段页式的地址换算。具体要求:先由系统随机生成5个左右的段,然后再由系统随机生成页面大小,但一定为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到8memsize=pow(2,z);//2的Z次幂运算得出大小为2的幂printf("自动生成页面的大小为:%d\n",memsize);allo=11;//进程数为11if(allo>memsize)//判断{printf("超出内存容量,无法分配!\n");return;}memory=malloc(memsize*sizeof(Memory));//分配内存page=malloc(allo*sizeof(PageTable));//分配内存给页表initMem(memory,memsize);//内存for(i=0;i<allo;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<allo;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;//段的数目5seg=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<num;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<l_addr)//检验是否越界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到8memsize=pow(2,z);//页表大小,2的幂num=5;//段的数目5seg=malloc(num*sizeof(Segment));//分配内存给段表memory=malloc(memsize*sizeof(Memory));//分配内存大小initMem(memory,memsize);//初始化内存和大小i=0;seg[0].len=1+rand()%5;//随机分配第0段表的段的数目1到5seg[1].len=1+rand()%5;//随机分配第1段表的段的数目1到5seg[2].len=1+rand()%5;//随机分配第2段表的段的数目1到5seg[3].len=1+rand()%5;//随机分配第3段表的段的数目1到5seg[4].len=1+rand()%5;//随机分配第4段表的段的数目1到5initSegment(seg,num);//初始化段页表for(i=0;i<num;i++)//随机分配内存块for(j=0;j<seg[i].len;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<num;i++)//用FOR循环输出段页表{printf("%d",i);for(j=0;j<seg[i].len;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<pnum)//检验是否越界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<stdio.h>//表头文件#include<windows.h>//表头文件#include<stdlib.h>//表头文件#include<time.h>//表头文件#include<math.h>//表头文件#defineBLOCK512//默认块大小为512BtypedefstructMEMORY//内存块{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<memsize;i++)mem[i].flag=0;}/*voidinitPage(PageTable*page,intsize)//初始化页表{inti;for(i=0;i<size;i++)page[i].flag=0;}voidinitSeg(SegTable*seg,intsize)//初始化段表{inti;for(i=0;i<size;i++)seg[i].flag=0;}*/voidinitSegment(Segment*seg,intsize)//初始化段页表{inti;for(i=0;i<size;i++)seg[i].page=malloc(seg[i].len*sizeof(PageTable));}/*功能:分页方式的地址换算输入:逻辑地址输出:物理地址*/voidpageTra()//分页方式的地址换算{intallo;//进程大小inti;intr;//随机数intl_addr;//逻辑地址intp_addr;//物理地址intpnum,mnum;//页号、内存块号intaddr;//页内地址intmemsize;//内存块 intz;Memory*memory;//内存地址PageTable*page;//页表地址 z=6+rand()%8;//随机数Z的范围6到8memsize=pow(2,z);//2的Z次幂运算得出大小为2的幂printf("自动生成页面的大小为:%d\n",memsize);allo=11;//页号数为11if(allo>memsize){printf("超出内存容量,无法分配!\n");return;}memory=malloc(memsize*sizeof(Memory));//分配内存page=malloc(allo*sizeof(PageTable));//页表initMem(memory,memsize);//内存for(i=0;i<allo;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<allo;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;}}}/*功能:分段方式的地址换算输入:逻辑地址输出:物理地址*/voidsegTra()//分段方式的地址换算模块{intnum;//段表长inti=0;intl_addr;//段内编移intp_addr;//物理地址intsnum;//段号SegTable*seg;//段表地址num=5;//段的数目5seg=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<num;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<l_addr)//检验是否越界printf("地址越界!\n");else{p_addr=seg[snum].addr+l_addr;//计算物理地址printf("逻辑地址%d:%d的物理地址是%d\n",snum,l_addr,p_addr);//输出物理地址break;}}}/*功能:段页式的地址换算输入:逻辑地址输出:物理地址*/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到8memsize=pow(2,z);//页表大小,2的幂num=5;//段的数目5seg=malloc(num*sizeof(Segment));//分配内存给段表memory=malloc(memsize*sizeof(Memory));//分配内存大小initMem(memory,memsize);//初始化内存和大小i=0;seg[0].len=1+rand()%5;//随机分配第0段表的段的数目1到5seg[1].len=1+rand()%5;//随机分配第1段表的段的数目1到5seg[2].len=1+rand()%5;//随机分配第2段表的段的数目1到5seg[3].len=1+rand()%5;//随机分配第3段表的段的数目1到5seg[4].len=1+rand()%5;//随机分配第4段表的段的数目1到5initSegment(seg,num);//初始化段页表for(i=0;i<num;i++)//随机分配内存块for(j=0;j<seg[i].len;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<num;i++)//用FOR循环输出段页表{printf("%d",i);for(j=0;j<seg[i].len;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<pnum)//检验是否越界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;}}}

4.3实验结果(1)进程初始化:(2)分页方式的地址换算(3)分段方式的地址换算(4)段页方式的地址换算

5.结论:页表的功能可以由一组专门的寄存器来实现。一个页表项用一个寄存器

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论