1、(二)分段存储管理方式的作用:A.方便编程B.信息共享在实现对程序和数据的共享时,是以信息的逻辑单位为基础的。段是信息的逻辑单位。由此可知,为了实现段的共享,希望存储管理能与用户程序分段的组织方式相适应。C.信息保护信息保护同样是对信息的逻辑单位进行保护,因此,分段管理方式能更有效和方便地实现信息保护功能。D.动态增长在实际应用中,往往有些段,特别是数据段,在使用过程中会不断地增长,而事先又无法确切地知道数据段会增长到多大。分段存储管理方式能较好地解决这一问题。E.动态链接动态链接是指在作业运行之前,并不把几个目标程序段链接起来。要运行时,先将主程序所对应的目标程序装入内存并启动运行,当运行过
2、程中又需要调用某段时,才将该段(目标程序)调入内存并进行链接。可见,动态链接也要求以段作为管理的单位。(三)段页式存储管理方式的作用分页系统以页面作为内存分配的基本单位,能够有效地提高内存利用率,而分段系统以段作为内存分配的基本单位,他能够更好地满足用户多方面的需要。如果能对两种存储管理方式“各取所长”,则可形成一种新的存储器管理方式段页式存储管理方式。这种新的系统既具有分段系统的便于实现、分段可共享、易于保护、可动态链接等一系列优点,又能像分页系统那样,很好地解决内存的外部碎片问题。2. 课程设计任务及要求2.1 设计任务日期陈国毅卢耀荣星期三下午阅读书本关于3种算法转换星期四上午在网上查阅
3、相关资料参考网上相关资料星期四下午开始尝试编写分页方式地址换算开始尝试编写分段方式地址换算星期五上午和队员讨论,开始实现完整的分页方式算法编写且继续查阅相关资料,并一起研究编写段页式方式的换算算法编写和队员讨论,开始实现完整的分段方式算法编写且继续查阅相关资料,并一起研究编写段页式方式的换算算法编写星期五下午讨论和修改相关代码,优化算法,得到最终代码,并共同编写文档讨论和修改相关代码,并且优化算法,得到最终代码并共同编写文档,2.2 设计要求 (一)分页方式的地址换算。1)用户给定一个逻辑地址,首先显示此地址的页号和页内地址,然后显示是第几块,最后显示其物理地址。1)由系统随机生成5个左右的段
4、,并随机生成一个段表并显示。2)由用户给定一个逻辑地址,包括段号和段内地址,最后显示其物理地址。(二)段页式的地址换算。1)先由系统随机生成5个左右的段,然后再由系统随机生成页面大小,但一定为2的幂。然后生成段表和页表。3. 算法及数据结构3.1算法的总体思想3.2数据结构模块3.2.1 功能进程的结构体声明与函数的声明3.2.2 数据结构 int flag; /分配状态,1为已分配,0为未分配 int allo; /页数 int r; /随机数 int l_addr; /逻辑地址int p_addr; /物理地址 int pnum,mnum ; /页号、内存块号 int addr; /页内地
5、址 int memsize; /内存容量 int z; Memory *memory; /内存地址 PageTable *page; /页表地址 int num; /段表长 int l_addr; /段内编移 int p_addr; int snum; /段号 SegTable *seg; /段表地址3.3分页方式的地址换算模块3.3.1功能用户给定一个逻辑地址,首先显示此地址的页号和页内地址,然后显示是第几块,最后显示其物理地址。3.3.2 数据结构void pageTra()/分页方式的地址换算3.3.3算法/页数 int i; int r;/随机数/逻辑地址/物理地址 int pnum,
6、mnum;/页号、内存块号/页内地址/内存容量/内存地址/页表地址 z=6+rand()%8;/随机数Z的范围6到8 memsize=pow(2,z); /2的Z次幂运算得出大小为2的幂 printf(自动生成页面的大小为:%dn,memsize); allo=11;/进程数为11 if(allomemsize)/判断超出内存容量,无法分配!n); return;memory=malloc(memsize*sizeof(Memory);/分配内存page=malloc(allo*sizeof(PageTable);/分配内存给页表initMem(memory,memsize);/内存for(i
7、=0;i=allo)/判断是否越界地址越界! else addr=l_addr%BLOCK;/取余,得出页内地址 mnum=pagepnum.addr;/内存块号 p_addr=mnum*memsize+addr;/计算物理地址逻辑地址%d 所在页号是%d,页内地址是%d,内存块号是%d,物理地址是%dn,l_addr,pnum,addr,mnum,p_addr);/输出物理地址 break; 3.4分段方式的地址换算模块3.4.1功能由系统随机生成5个左右的段,并随机生成一个段表并显示。由用户给定一个逻辑地址,包括段号和段内地址,最后显示其物理地址。3.4.2 数据结构void segTra
8、()/分段方式的地址换算模块3.4.3算法/段表长 int i=0;/段内编移/段号/段表地址 num=5;/段的数目5 seg=malloc(num*sizeof(SegTable);/ initSeg(seg,num);seg0.len=1+rand()%20;/随机生成第0段的大小seg0.addr=1+rand()%20;/随机生成第0段的基址seg1.len=1+rand()%20;/随机生成第1段的大小seg1.addr=21+rand()%40;/随机生成第1段的基址seg2.len=1+rand()%20;/随机生成第2段的大小seg2.addr=41+rand()%60;/随
9、机生成第2段的基址seg3.len=1+rand()%20;/随机生成第3段的大小seg3.addr=61+rand()%80;/随机生成第3段的基址seg4.len=1+rand()%20;/随机生成第4段的大小seg4.addr=81+rand()%100;/随机生成第4段的基址*段表内容*n段号t段长t基址n for(i=0;num;i+)%dt%dt%dn,i,segi.len,segi.addr);*Hetiu*n while(1)请输入段号和段内地址(#:#):/输入段号和段内地址%d:snum,&/赋值段号和段内地址 if(snum=num|snum0|segsnum.lenl_
10、addr)/检验是否越界 p_addr=segsnum.addr+l_addr;逻辑地址%d:%d的物理地址是%dn,snum,l_addr,p_addr);3.5段页方式的地址换算模块3.5.1功能先由系统随机生成5个左右的段,然后再由系统随机生成页面大小,但一定为2的幂。3.5.2数据结构void segPageTra()/段页式的地址换算3.5.2算法 int i,j,count=0; int num,snum,pnum,mnum;/段表长、段号、页号、内存块号 Memory*memory; Segment*seg;/Z随机数,范围6到8/页表大小,2的幂 seg=malloc(num*
11、sizeof(Segment);/分配内存给段表 memory=malloc(memsize*sizeof(Memory);/分配内存大小 initMem(memory,memsize);/初始化内存和大小 i=0;seg0.len=1+rand()%5;/随机分配第0段表的段的数目1到5seg1.len=1+rand()%5;/随机分配第1段表的段的数目1到5seg2.len=1+rand()%5;/随机分配第2段表的段的数目1到5seg3.len=1+rand()%5;/随机分配第3段表的段的数目1到5seg4.len=1+rand()%5;/随机分配第4段表的段的数目1到5 initSe
12、gment(seg,num);/初始化段页表i+) /随机分配内存块 for(j=0;jsegi.len;j+) segi.pagej.addr=r;*段页表内容*n段号t段内页表号t块号ni+)/用FOR循环输出段页表,i);t%dtt%dn,j,segi.pagej.addr);/输出段号,段内页表,块号-n*n/输出页面的大小/提示用户输入段号和段内地址/根据逻辑地址的段内地址和块的大小来获得对应页的页表项位置/取余,求得页表始址pnum)/检验是否越界地址越界! mnum=segsnum.pagepnum.addr;/再获取物理块号 p_addr=segsnum.pagepnum.ad
13、dr*memsize+addr;%d 所在页号是%d,内存块号是%d,页内地址是%d,物理地址是%dn,snum,l_addr,pnum,mnum,addr,p_addr);3.6主函数模块3.6.1功能用于程序与用户的交互操作,由用户选择算法,并执行相应的算法。3.6.2数据结构void main() /主函数3.6.3算法 int select;MENU: system(cls*三种存储管理方式的地址换算*n 1.分页方式的地址换算n 2.分段方式的地址换算n 3.段页方式的地址换算n*计算机操作系统课程设计卢耀荣、陈国毅*n /以上是界面请选择:select); /输入,选择功能模块 s
14、witch(select) /swithch函数 case 1: pageTra(); /分页方式的地址换算模块pause goto MENU; case 2: segTra(); /分段方式的地址换算模块 case 3: segPageTra(); /段页方式的地址换算模块 default:4. 程序设计与实现4.1 程序流程图4.2 程序代码#include/表头文件windows.hstdlib.h#include math.h#define BLOCK 512/默认块大小为512Btypedef struct MEMORY/内存块/分配状态,1为已分配,0为未分配Memory;type
15、def struct PAGETABLE/页表/ int flag; /状态PageTable;typedef struct SEGTABLE /段表 int len; /段长 /段基址SegTable;typedef struct SEGMENT /段页表Segment;/void initMem(Memory *men,int memsize); /初始化内存/void initPage(PageTable *page,int size); /初始化页表/void initSeg(SegTable *seg,int size); /初始化段表void initSegment(Segment
16、 *seg,int size); /初始化段页表void pageTra(); /分页方式的地址换算void segTra(); /分段方式的地址换算void segPageTra(); /段页方式的地址换算void initMem(Memory *mem,int memsize) /初始化内存memsize; memi.flag=0;/*void initPage(PageTable *page,int size) /初始化页表size; pagei.flag=0;void initSeg(SegTable *seg,int size) /初始化段表 segi.flag=0;*/void initSegment(Segment *seg,int size) /初始化段页表 segi.page=malloc(segi.len*sizeof(PageTable); 功能:分页方式的地址换算 输入:逻辑地址 输出:物理地址/进程大小 int
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1