虚拟内存页面置换算法

虚拟内存是计算机系统内存管理的一种技术。
它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。
目前,大多数操作系统都使用了虚拟内存,如Windows家族的“虚拟内存”;Linux的“交换空间”等

虚拟地址空间

在C语言中我们称之为程序地址空间,而Linux下称之为进程虚拟地址空间
在这里插入图片描述

#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>

int main()
{
   
    pid_t pid = fork();
    int g_val = 10;
    if(pid < 0)
    {
   
        perror("fork");
        return 0;
    }
    else if(pid == 0)
    {
    
        //child,子进程肯定先跑完,也就是子进程先修改
        //完成之后,父进程再读取
        g_val=100;
        printf("child [%d]: [%d] : [%p]\n", getpid(), g_val, &g_val);
    }
    else
    {
    
        //parent
        sleep(3);
        printf("parent [%d]: [%d] : [%p]\n", getpid(), g_val, &g_val);
    }
    sleep(1);
    return 0;
}

运行之后我们发现变量内容不一样,所以父子进程输出的变量绝对不是同一个变量,但他们的地址值是一样的,说明,该地址绝对不是物理地址!

在Linux地址下,这种地址叫做虚拟地址,而我们在用C/C++语言所看到的地址,全部都是虚拟地址!物理地址,用户一概看不到,由OS统一管理,这块就涉及一个写时拷贝的概念。

  • 写时拷贝 : 当数据发生修改的时候,才重新分配一个物理内存,并将页表当中的映射关系改掉
  • 物理内存: 存储数据时需要依靠的介质
  • 逻辑地址: 进程虚拟地址空间,也就是人为规定的,不能存储数据的.

在这里插入图片描述

页表

页表的作用是将虚拟地址映射成物理地址
页表的存储在汇编中就是 段基址 * 16 + 偏移量,段基址是页内偏移,块号是偏移量

分页式

前提:会将虚拟地址分成一页一页的格式,会将物理内存分成一块一块的格式。

分页的原因:假设我们有一个16M大小的存储空间,因为计算机存储的时候,地址都是随机分配的,如果很不凑巧,这段空间的正中间的位置分配一个8M大小的数据,那么之后要是再存储一个5M大小的数据就会出现存不下的问题,这就造成了内存的浪费。
在这里插入图片描述
分页式的存储就和书差不多,把知识点都分成一页一页的,然后每一块知识点都有一个目录,可以通过目录很快的找到这一块的位置,然后在这一页中找知识点,唯一有区别的就是,在计算机中,每一块物理内存的大小都是一样的。

  • 块号: 根据页号在页表中的映射去查找的块的标号
    假设虚拟地址为5000,块的大小是4096,如何计算物理地址?
  • 页号 = 虚拟地址 / 块大小
  • 页内偏移 = 虚拟地址 % 块的大小
  • 块的起始地址 = 块号 * 大小
  • 物理地址 = 块的起始地址 + 页内偏移
页号 : 5000 / 4096 = 1
页内偏移 :5000 % 4096 = 904
块的起始地址 :5 * 4096
物理地址 : 5 * 
  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值