Java并发编程:虚拟内存详解(一)

366 阅读3分钟

src=http___i0.hdslb.com_bfs_article_807aa46619617caf3a3ea976300b575abae0676c.png&refer=http___i0.hdslb.webp 本文已参与「新人创作礼」活动,一起开启掘金创作之路。

前言

       在上文《【千字长文】带你了解操作系统内核》,我们了解了操作系统内核的概念以及分类。也知道了应用程序要与硬件交互,需要通过操作系统内核才行。接下来,就为大家讲解下操作系统中另外一个核心模块:虚拟内存。

虚拟内存是什么?

       我们知道,在计算机硬件中,有一个非常重要的模块:物理内存。而在现在的大部分操作系统中,也同样存在一个类似的模块,虚拟内存。它是什么东西?
       对于虚拟内存,这里引用下百度百科的定义:

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

       从上面的定义中可以看出,虚拟内存是一种将内存管理技术,它通过整合物理内存磁盘存储器,在物理内存应用程序中间构建了一层中间层。对应用程序来说,没有物理内存的概念,它直接接触的就是虚拟内存
       虚拟内存会为应用程序提供简洁和易用的接口,以及一些更复杂的功能,方便应用程序的内存使用。具体的可以参考下图:

src=http___mp.ofweek.com_Upload_News_Img_member42749_202105_wx_article__b0cf37b711ab080984e0c3d3b4ad7652.jpg&refer=http___mp.ofweek.webp

为什么需要虚拟内存?

       我们先假设没有虚拟内存的存在,应用程序可以直接访问物理内存,这样的话,会存在以下这些问题:
       1、应用程序可以随意操作其它应用程序,甚至是操作系统的内存,此问题已经在《【千字长文】带你了解操作系统内核》中描述过,此处不再赘述。而虚拟内存的一个基本功能就是会将应用程序所属内存隔离,虚拟内存会为每个应用程序分配独立内存空间。每个应用程序只能操作其所拥有的内存空间,没办法操作其它应用程序的内存空间。提供了系统的安全性。
       2、应用程序如果直接访问物理内存的话,应用程序在操作物理内存的时候,需要明确的知道每个数据所存储的物理内存地址,而且,在多进程的环境下,我们还要注意变量不能使用同一个地址,否则将会出现地址冲突。而虚拟内存自带了一套地址转换机制,能够通过操作系统内核将虚拟内存地址转换为物理内存地址,应用程序不用进行任何相关处理。
       3、其它复杂逻辑处理,例如:如果物理内存空间不足,应用程序需要提供内存淘汰逻辑处理;进程启动或者其它需要申请内存空间的时候,需要计算向物理内存申请多少空间......而虚拟内存还已经帮我们完成了所有这些功能。

后言

       既然看到这里了,感觉有所收获的朋友,不妨来个大大的点赞吧~~~