在回答大家的这个疑问之前 , 让我们先来看下 , 如果在程序中直接使用物理内存地址会发生什么情况?
假设现在没有虚拟内存地址 , 我们在程序中对内存的操作全都都是使用物理内存地址 , 在这种情况下 , 程序员就需要精确的知道每一个变量在内存中的具体位置 , 我们需要手动对物理内存进行布局 , 明确哪些数据存储在内存的哪些位置 , 除此之外我们还需要考虑为每个进程究竟要分配多少内存?内存紧张的时候该怎么办?如何避免进程与进程之间的地址冲突?等等一系列复杂且琐碎的细节 。
如果我们在单进程系统中比如嵌入式设备上开发应用程序 , 系统中只有一个进程 , 这单个进程独享所有的物理资源包括内存资源 。在这种情况下 , 上述提到的这些直接使用物理内存的问题可能还好处理一些 , 但是仍然具有很高的开发门槛 。
然而在现代操作系统中往往支持多个进程 , 需要处理多进程之间的协同问题 , 在多进程系统中直接使用物理内存地址操作内存所带来的上述问题就变得非常复杂了 。
这里笔者为大家举一个简单的例子来说明在多进程系统中直接使用物理内存地址的复杂性 。
比如我们现在有这样一个简单的 Java 程序 。
public static void main(String[] args) throws Exception {string i = args[0];..........}在程序代码相同的情况下 , 我们用这份代码同时启动三个 JVM 进程 , 我们暂时将进程依次命名为 a , b , c。
这三个进程用到的代码是一样的 , 都是我们提前写好的 , 可以被多次运行 。由于我们是直接操作物理内存地址 , 假设变量 i 保存在 0x354 这个物理地址上 。这三个进程运行起来之后 , 同时操作这个 0x354 物理地址 , 这样这个变量 i 的值不就混乱了吗? 三个进程就会出现变量的地址冲突 。

文章插图
所以在直接操作物理内存的情况下 , 我们需要知道每一个变量的位置都被安排在了哪里 , 而且还要注意和多个进程同时运行的时候 , 不能共用同一个地址 , 否则就会造成地址冲突 。
现实中一个程序会有很多的变量和函数 , 这样一来我们给它们都需要计算一个合理的位置 , 还不能与其他进程冲突 , 这就很复杂了 。
那么我们该如何解决这个问题呢?程序的局部性原理再一次救了我们~~
程序局部性原理表现为:时间局部性和空间局部性 。时间局部性是指如果程序中的某条指令一旦执行 , 则不久之后该指令可能再次被执行;如果某块数据被访问 , 则不久之后该数据可能再次被访问 。空间局部性是指一旦程序访问了某个存储单元 , 则不久之后 , 其附近的存储单元也将被访问 。从程序局部性原理的描述中我们可以得出这样一个结论:进程在运行之后 , 对于内存的访问不会一下子就要访问全部的内存 , 相反进程对于内存的访问会表现出明显的倾向性 , 更加倾向于访问最近访问过的数据以及热点数据附近的数据 。
根据这个结论我们就清楚了 , 无论一个进程实际可以占用的内存资源有多大 , 根据程序局部性原理 , 在某一段时间内 , 进程真正需要的物理内存其实是很少的一部分 , 我们只需要为每个进程分配很少的物理内存就可以保证进程的正常执行运转 。
经验总结扩展阅读
- 神话中高要一步一步往上爬是第几集?
- 神话一步一步爬到最高是几集?
- 总以为她会永远陪我一步一步慢慢走是什么歌
- 爱情不会一步到位而是会经过颇多挫折才圆满的星座
- Dubbo 03: 直连式 + 接口工程
- 一篇文章带你了解热门版本控制系统——Git
- 一篇文章带你了解网页框架——Vue简单入门
- 一直在等待爱却不敢主动迈出一步的星座
- 我用canvas带你看一场流星雨
- 一篇文章带你掌握MyBatis简化框架——MyBatisPlus
