课程设计三种存储管理方式的地址换算Word文件下载.docx

上传人:b****5 文档编号:17768552 上传时间:2022-12-09 格式:DOCX 页数:29 大小:177.02KB
下载 相关 举报
课程设计三种存储管理方式的地址换算Word文件下载.docx_第1页
第1页 / 共29页
课程设计三种存储管理方式的地址换算Word文件下载.docx_第2页
第2页 / 共29页
课程设计三种存储管理方式的地址换算Word文件下载.docx_第3页
第3页 / 共29页
课程设计三种存储管理方式的地址换算Word文件下载.docx_第4页
第4页 / 共29页
课程设计三种存储管理方式的地址换算Word文件下载.docx_第5页
第5页 / 共29页
点击查看更多>>
下载资源
资源描述

课程设计三种存储管理方式的地址换算Word文件下载.docx

《课程设计三种存储管理方式的地址换算Word文件下载.docx》由会员分享,可在线阅读,更多相关《课程设计三种存储管理方式的地址换算Word文件下载.docx(29页珍藏版)》请在冰豆网上搜索。

课程设计三种存储管理方式的地址换算Word文件下载.docx

(二)分段存储管理方式的作用:

A.方便编程

B.信息共享

在实现对程序和数据的共享时,是以信息的逻辑单位为基础的。

段是信息的逻辑单位。

由此可知,为了实现段的共享,希望存储管理能与用户程序分段的组织方式相适应。

C.信息保护

信息保护同样是对信息的逻辑单位进行保护,因此,分段管理方式能更有效和方便地实现信息保护功能。

D.动态增长

在实际应用中,往往有些段,特别是数据段,在使用过程中会不断地增长,而事先又无法确切地知道数据段会增长到多大。

分段存储管理方式能较好地解决这一问题。

E.动态链接

动态链接是指在作业运行之前,并不把几个目标程序段链接起来。

要运行时,先将主程序所对应的目标程序装入内存并启动运行,当运行过程中又需要调用某段时,才将该段(目标程序)调入内存并进行链接。

可见,动态链接也要求以段作为管理的单位。

(三)段页式存储管理方式的作用

分页系统以页面作为内存分配的基本单位,能够有效地提高内存利用率,而分段系统以段作为内存分配的基本单位,他能够更好地满足用户多方面的需要。

如果能对两种存储管理方式“各取所长”,则可形成一种新的存储器管理方式——段页式存储管理方式。

这种新的系统既具有分段系统的便于实现、分段可共享、易于保护、可动态链接等一系列优点,又能像分页系统那样,很好地解决内存的外部碎片问题。

2.课程设计任务及要求

2.1设计任务

日期

陈国毅

卢耀荣

星期三下午

阅读书本关于3种算法转换

星期四上午

在网上查阅相关资料

参考网上相关资料

星期四下午

开始尝试编写分页方式地址换算

开始尝试编写分段方式地址换算

星期五上午

和队员讨论,开始实现完整的分页方式算法编写且继续查阅相关资料,并一起研究编写段页式方式的换算算法编写

和队员讨论,开始实现完整的分段方式算法编写且继续查阅相关资料,并一起研究编写段页式方式的换算算法编写

星期五下午

讨论和修改相关代码,优化算法,得到最终代码,并共同编写文档

讨论和修改相关代码,并且优化算法,得到最终代码并共同编写文档,

2.2设计要求

(一)分页方式的地址换算。

1)用户给定一个逻辑地址,首先显示此地址的页号和页内地址,然后显示是第几块,最后显示其物理地址。

1)由系统随机生成5个左右的段,并随机生成一个段表并显示。

2)由用户给定一个逻辑地址,包括段号和段内地址,最后显示其物理地址。

(二)段页式的地址换算。

1)先由系统随机生成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功能

用户给定一个逻辑地址,首先显示此地址的页号和页内地址,然后显示是第几块,最后显示其物理地址。

3.3.2数据结构

voidpageTra()//分页方式的地址换算

3.3.3算法

{

//页数

inti;

intr;

//随机数

//逻辑地址

//物理地址

intpnum,mnum;

//页号、内存块号

//页内地址

//内存容量

//内存地址

//页表地址

z=6+rand()%8;

//随机数Z的范围6到8

memsize=pow(2,z);

//2的Z次幂运算得出大小为2的幂

printf("

自动生成页面的大小为:

%d\n"

memsize);

allo=11;

//进程数为11

if(allo>

memsize)//判断

超出内存容量,无法分配!

\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"

页号\t块号\n"

//输出页表

i++)//输出页表

%d\t%d\n"

i,page[i].addr);

****************************************\n"

while

(1)

请输入逻辑地址:

"

scanf("

%d"

&

l_addr);

//逻辑地址赋值

pnum=l_addr/BLOCK;

//求页号

if(pnum>

=allo)//判断是否越界

地址越界!

else

{

addr=l_addr%BLOCK;

//取余,得出页内地址

mnum=page[pnum].addr;

//内存块号

p_addr=mnum*memsize+addr;

//计算物理地址

逻辑地址%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算法

//段表长

inti=0;

//段内编移

//段号

//段表地址

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段的基址

***********************段表内容*************************\n"

段号\t段长\t基址\n"

for(i=0;

num;

i++)

%d\t%d\t%d\n"

i,seg[i].len,seg[i].addr);

***********************Hetiu***************************\n"

while

(1)

请输入段号和段内地址(#:

#):

"

//输入段号和段内地址

%d:

snum,&

//赋值段号和段内地址

if(snum>

=num||snum<

0||seg[snum].len<

l_addr)//检验是否越界

p_addr=seg[snum].addr+l_addr;

逻辑地址%d:

%d的物理地址是%d\n"

snum,l_addr,p_addr);

3.5段页方式的地址换算模块

3.5.1功能

先由系统随机生成5个左右的段,然后再由系统随机生成页面大小,但一定为2的幂。

3.5.2数据结构

voidsegPageTra()//段页式的地址换算

3.5.2算法

inti,j,count=0;

intnum,snum,pnum,mnum;

//段表长、段号、页号、内存块号

Memory*memory;

Segment*seg;

//Z随机数,范围6到8

//页表大小,2的幂

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);

//初始化段页表

i++)//随机分配内存块

for(j=0;

j<

seg[i].len;

j++)

seg[i].page[j].addr=r;

********************段页表内容******************************\n"

段号\t段内页表号\t块号\n"

i++)//用FOR循环输出段页表

i);

\t%d\t\t%d\n"

j,seg[i].page[j].addr);

//输出段号,段内页表,块号

----------------------------\n"

***********************************************************\n"

//输出页面的大小

//提示用户输入段号和段内地址

//根据逻辑地址的段内地址和块的大小来获得对应页的页表项位置

//取余,求得页表始址

pnum)//检验是否越界

地址越界!

mnum=seg[snum].page[pnum].addr;

//再获取物理块号

p_addr=seg[snum].page[pnum].addr*memsize+addr;

%d所在页号是%d,内存块号是%d,页内地址是%d,物理地址是%d\n"

snum,l_addr,pnum,mnum,addr,p_addr);

3.6主函数模块

3.6.1功能

用于程序与用户的交互操作,由用户选择算法,并执行相应的算法。

3.6.2数据结构

voidmain()//主函数

3.6.3算法

intselect;

MENU:

system("

cls"

**************************三种存储管理方式的地址换算**********************\n"

1.分页方式的地址换算\n"

2.分段方式的地址换算\n"

3.段页方式的地址换算\n"

*********************计算机操作系统课程设计——卢耀荣、陈国毅**************\n"

//以上是界面

请选择:

select);

//输入,选择功能模块

switch(select)//swithch函数

case1:

pageTra();

//分页方式的地址换算模块

pause"

gotoMENU;

case2:

segTra();

//分段方式的地址换算模块

case3:

segPageTra();

//段页方式的地址换算模块

default:

4.程序设计与实现

4.1程序流程图

4.2程序代码

#include<

stdio.h>

//表头文件

windows.h>

stdlib.h>

#include<

time.h>

math.h>

#defineBLOCK512//默认块大小为512B

typedefstructMEMORY//内存块

//分配状态,1为已分配,0为未分配

}Memory;

typedefstructPAGETABLE//页表

//intflag;

//状态

}PageTable;

typedefstructSEGTABLE//段表

intlen;

//段长

//段基址

}SegTable;

typedefstructSEGMENT//段页表

}Segment;

//voidinitMem(Memory*men,intmemsize);

//初始化内存

//voidinitPage(PageTable*page,intsize);

//初始化页表

//voidinitSeg(SegTable*seg,intsize);

//初始化段表

voidinitSegment(Segment*seg,intsize);

//初始化段页表

voidpageTra();

//分页方式的地址换算

voidsegTra();

//分段方式的地址换算

voidsegPageTra();

//段页方式的地址换算

voidinitMem(Memory*mem,intmemsize)//初始化内存

memsize;

mem[i].flag=0;

/*

voidinitPage(PageTable*page,intsize)//初始化页表

size;

page[i].flag=0;

voidinitSeg(SegTable*seg,intsize)//初始化段表

seg[i].flag=0;

*/

voidinitSegment(Segment*seg,intsize)//初始化段页表

seg[i].page=malloc(seg[i].len*sizeof(PageTable));

功能:

分页方式的地址换算

输入:

逻辑地址

输出:

物理地址

//进程大小

int

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1