阵列如何存储在虚拟内存中?

时间:2018-09-09 07:46:52

标签: java c operating-system virtual-memory

如果有数组

int arr[100];

这如何精确地存储在现代机器中,该机器显然使用虚拟内存运行?

我知道我们必须对虚拟内存使用分页,并且由于数组是连续的块,因此如果我们有4kb页面,则此数组arr将适合1页。

但是此页面是否存储在DISK或RAM中?

2 个答案:

答案 0 :(得分:2)

总而言之,数据可能在各个位置,它们可能会自动更改(通过操作系统的操作),并且在正常程序中运行时,通常不需要了解它。

首先,您在源代码中声明一个数组的事实并不一定意味着在内存中创建了完整的数组或根本没有任何数组。编译器可以通过消除部分或全部数组的方式来优化源代码。

但是,让我们假设该数组是实际创建的。创建虚拟内存是为了使人产生一种幻想,即一个进程专用于物理内存和/或它具有的内存比实际用作物理内存的内存更多。这种错觉的目的是使流程不必关心其数据的实际位置。而且绝大多数正常过程可以忽略这一点。

此外,在大多数情况下,编译器将很少注意相对于页面边界放置小对象的位置。通常放置100个int的数组以使其完全在一页内还是跨页边界几乎没有什么区别。

当有必要了解或影响数据的实际位置时,就会出现许多问题。

有几种方法可以影响数据相对于页面边界的位置,方法是为此目的而使用系统或库调用,或者分配过多的内存,然后将数据放置在其中的选定位置。

如果数据很重要并且需要或希望保留在物理内存中,则可能会有系统调用(当然,取决于系统)。

在没有此类特定请求的情况下,数据的位置取决于许多因素。如果您声明int的静态数组并使用编译时数据对其进行初始化,则该数据可能会出现在最终生成的可执行文件的一部分中。在某些系统中,启动可执行文件时,系统不会将整个文件加载到内存中。仅在引用可执行文件时,它才会从可执行文件中加载数据的各个部分。因此,该数据最初可能驻留在磁盘上。将数据加载到内存中后,如果系统负担了其他需要内存的事情,则系统可能会从内存中丢弃此数据,从而使其仅再次存在于磁盘上的可执行文件中。

另一方面,如果数据是在程序执行期间生成的,则当程序生成数据时,它当然在内存中。同样,如果系统负担其他要求,则系统可能会从内存中删除数据。在这种情况下,由于磁盘上尚不存在数据(就像可执行文件中的数据一样),因此首先将数据写入磁盘上的页面或交换文件。

通常,数据的位置可能会随时间变化。

答案 1 :(得分:0)

  

我了解我们必须对虚拟内存使用分页。

您不必不必使用分页。您可以关闭分页。

  

如果我们有一个4kb的页面,则此数组{{1}}将适合一页。

它可能适合4kb页面,但很可能不会在4kb边界上(或附近)对齐,因此实际上,它可能会存储在两页中。 / p>

  

此页面存储在DISK或RAM中吗?

数组与其他数据结构没有什么不同。它们存储在内存(RAM)中,除非操作系统内存不足,除非被OS换成DISK。