程序员必备内存知识之 ----- 虚拟内存


前言

在计算机发展的初期,我们的程序在运行时都访问的是物理内存。

例如 :
一台计算机的内存为100mb。 运行程序A需要占用30M内存。 运行程序B需要50M内存。
最简单的内存分配方式就是把内存的前30M给程序A,后50M分配给程序B。

这种内存管理策略十分简单粗暴。但是会带来许多问题。


提示:以下是本篇文章正文内容,下面案例可供参考


一、虚拟内存是什么?

简介:虚拟内存是一种操作系统内存管理的一种技术。 它解决了早前计算机程序运行时的内存隔离问题、内存利用率低、运行的地址不确定等问题。


二、解决的问题


1.内存不隔离

程序可以直接访问物理内存。程序之间的内存不是隔离的。一个程序可以很轻易的访问到另一个程序的内存空间。
如果这个程序是个恶意程序,就可能导致非常严重的后果。即使不是恶意程序,由于程序员们自己的失误,也可能写出有问题的代码,破坏了其他程序的数据,可能出现一些莫名其妙的错误。



2.内存利用率低


假设,我们的计算机只有128M内存。此时内存中已经有了程序A和程序B在运行。
程序A占用30M内存,程序B占用50M内存。 此时用户又要运行程序C,程序占用80M内存。
此时已经没有足够的连续空间容纳程序C运行。只能将正在运行的程序数据移动到硬盘里,腾出足够的连续内存空间分配给程序C运行。
这里进行了大量的内存和硬盘之间的数据交换,由于内存和硬盘之间的传输效率差异非常大,导致这种交换的方式效率十分低下。



3.内存运行地址不确定


由于我们每次分配给程序的连续的内存地址都是不确定的。这会给编写代码带来一些麻烦。

程序在编写时,它访问数据和跳转指令的目标地址有很多都是固定的。这其中还涉及到了重定位问题。



二、解决方式

让程序运行在一段虚拟地址上,使用间接的内存访问方式让程序访问内存。 我们再通过映射的方式,将虚拟地址转换成物理地址。
我们只要管理好从虚拟地址到物理地址之间的映射过程,就可以解决以上问题。

在这里插入图片描述

1.

程序只能在给出的虚拟地址内进行读写操作,内存管理单元会对程序所要访问的地址进行判断,如果访问了不属于虚拟地址的内存空间,就会进行上报,由用户或者操作系统决定如何处理。

2.

程序不需要关心自己对应的物理地址,它只要在自己的虚拟地址内进行数据分配,放置变量。 这样就省去了重定位的过程。

3.

利用程序的局部性原理,大多数时候程序运行时只有一部分数据是频繁使用的。而之前程序的载入内存和数据调回都是以整个程序为单位。造成大量的硬盘读写操作,非常影响性能。

这里用到了分页的方法,将内存分为固定大小的页,页的大小可以由人,或者操作系统决定。

我们将虚拟地址的空间按页来分割,运行时,将程序常用的数据调用内存,不常用的放在硬盘里。等到要用的时候再调出。



总结


最近看书的一些理解和总结,笔者了解有限,只是进行了一些简略的介绍,其中还有非常多的细节的点没有说明。

如果有什么错误和补充,欢迎大家留言。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

necesse

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值