前言
在计算机发展的初期,我们的程序在运行时都访问的是物理内存。
例如 :
一台计算机的内存为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.
利用程序的局部性原理,大多数时候程序运行时只有一部分数据是频繁使用的。而之前程序的载入内存和数据调回都是以整个程序为单位。造成大量的硬盘读写操作,非常影响性能。
这里用到了分页的方法,将内存分为固定大小的页,页的大小可以由人,或者操作系统决定。
我们将虚拟地址的空间按页来分割,运行时,将程序常用的数据调用内存,不常用的放在硬盘里。等到要用的时候再调出。
总结
最近看书的一些理解和总结,笔者了解有限,只是进行了一些简略的介绍,其中还有非常多的细节的点没有说明。
如果有什么错误和补充,欢迎大家留言。