实验四 存储器管理

【实验目的】

1.掌握分页式存储管理地址转换和缺页中断。

2.理解虚拟存储器概念。

【实验内容】

模拟分页式存储管理中硬件的地址转换:利用进制来模拟地址转换

【实验步骤】

1.数据结构

long lo_addr;//逻辑地址

long ph_addr;//物理地址

long pagelist[PNUM];

void init_ex1()

{

//左边的角标是页号,右边的值是页号对应的块号

pagelist[0] = 6;

pagelist[1] = 5;

pagelist[2] = 7;

pagelist[3] = 8;

pagelist[4] = 9;

pagelist[5] = 1;

pagelist[6] = 3;

pagelist[7] = 2;

pagelist[8] = 4;

pagelist[9] = 10;

pagelist[10] = 0;

pagelist[11] = 18;

pagelist[12] = 16;

pagelist[13] = 14;

}

void work_ex1()//模拟分页式存储管理中硬件的地址转换和产生缺页中断过程

2.程序流程图

3.实验代码

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#include <math.h>

#define PNUM 10//页号总数

#define PSIZE 4096//页大小

long lo_addr;//逻辑地址

long ph_addr;//物理地址

long pagelist[PNUM];

void init_ex1()

{

//左边的角标是页号,右边的值是页号对应的块号

pagelist[0] = 6;

pagelist[1] = 5;

pagelist[2] = 7;

pagelist[3] = 8;

pagelist[4] = 9;

pagelist[5] = 1;

pagelist[6] = 3;

pagelist[7] = 2;

pagelist[8] = 4;

pagelist[9] = 10;

pagelist[10] = 0;

pagelist[11] = 18;

pagelist[12] = 16;

pagelist[13] = 14;

}

void work_ex1()//模拟分页式存储管理中硬件的地址转换和产生缺页中断过程

{

int stop = 0;

int flag = 0;

//int len = log(2,PSIZE);

long p = 0;//页号

long w = 0;//页内地址

char s[128];

do

{

int i,j;

printf("**************【当前页号与块号的对应关系如下:】**************\n");

printf("页号     块号     (页大小:%d)\n", PSIZE);

for(i = 0;i < PNUM;i++)

printf(" %-10d%ld\n", i, pagelist[i]);

printf("现在您可以输入一个16进制的地址:");

flag = scanf("%x", &lo_addr);

if(flag != 1)

{

fflush(stdin);

printf("如果您不想继续,请输入exit,否则将继续!\n");

flag = scanf("%s",s);

if(strcmp(s,"exit")==0)

{//如果输入的为"exit"那么就退出,进入重选页面

stop = 1;

}

}

else

{

char p_Str[128], w_Str[128];

//1.如何将一个地址变为二进制。

itoa(lo_addr, s, 2);//将16进制的逻辑地址转为二进制数的字符串形式存到s中

int PSIZE_bitLen = log2(PSIZE);//记录页大小用二进制表示时所需的位数

//2.再将二进制变为字符串,拆分为两个字符串?

for(i = 0;i < strlen(s);i++)

{

if(i < strlen(s) - PSIZE_bitLen)

p_Str[i] = s[i];//页号的二进制字符串形式

else

{

if(i == strlen(s) - PSIZE_bitLen)

p_Str[i] = '\0';//给p_Str数组加结束符

w_Str[i-(strlen(s)-PSIZE_bitLen)] = s[i];//页内大小的二进制字符串形式

}

}

w_Str[i-(strlen(s)-PSIZE_bitLen)] = '\0';//给w_Str数组加结束符

//3.将高位字符串先变为整型(10进制)页号。

char * endptr;

p = strtol(p_Str, &endptr, 2);//将字符串形式的二进制页号转为long型

printf("\n该地址的页号为:%d,用二进制表示为:%s\n", p, p_Str);

//4.查页表,将页号对应的块号求出来;

printf("该地址对应的块号为:%ld,", pagelist[p]);

//5.将块号变为二进制;

//6.将二进制变为字符串;

char blockNum_BinaryStr[128];

itoa(pagelist[p], blockNum_BinaryStr, 2);//进十进制形式下的块号转为二进制

printf("用二进制表示为:%s\n\n", blockNum_BinaryStr);//输出二进制形式下的块号

//7.将该字符串与低位字符串合并;

strcat(blockNum_BinaryStr, w_Str);

printf("偏移量(页内地址)为:%s\n", w_Str);

printf("块号与偏移量重新组合后为:%s\n\n", blockNum_BinaryStr);

//8.将新的字符串变为整数(二进制);

ph_addr = strtol(blockNum_BinaryStr, &endptr, 2);//将拼接好的字符串转为二进制整数

//9.将该数用16进制形式输出,就是物理地址;

printf("您输入的16进制逻辑地址为:%X,其对应的物理地址为:%X\n\n", lo_addr, ph_addr);

}

}

while(!stop);

}

int main()

{

init_ex1();

work_ex1();

return 0;

}

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
存储器管理是操作系统中的一个重要组成部分,它主要负责管理计算机的内存资源,包括内存分配和回收、内存保护、虚拟内存管理等。下面介绍一下操作系统实验中的存储器管理。 1. 内存分配和回收 内存分配是将一定大小的内存块分配给进程使用,而内存回收则是将进程不再使用的内存块释放出来,以便其他进程使用。在实现内存分配和回收时,可以采用多种算法,比如首次适应算法、最佳适应算法、最坏适应算法等。这些算法的实现过程可以通过链表或位图来完成。 2. 内存保护 内存保护是指防止进程越界访问内存区域,从而导致系统崩溃或数据损坏。在操作系统中,可以通过硬件和软件两种方式来实现内存保护。硬件保护通常通过内存管理单元(MMU)来实现,而软件保护则通过访问权限控制和地址空间隔离来实现。 3. 虚拟内存管理 虚拟内存管理是操作系统中的一个重要功能,它可以将进程的虚拟地址空间映射到物理内存中,从而使得进程可以访问超过实际物理内存大小的数据。在实现虚拟内存管理时,需要采用一些算法来完成页面置换和页面调度等操作,比如最近最少使用算法(LRU)。 总之,存储器管理是操作系统中重要的组成部分,对于系统的稳定性和性能有着重要的影响。在操作系统实验中,可以通过实现内存分配和回收、内存保护、虚拟内存管理等功能,来加深对操作系统存储器管理的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值