如果你有一个阵列
int arr[100];
这究竟是如何存储在一台现代机器中,显然使用虚拟内存运行?
我知道我们必须使用虚拟内存分页,因为数组是一个连续的块,如果我们有一个4kb的页面,这个数组arr
将适合1页。
但是这个页面存储在DISK或RAM上吗?
总之,数据可能位于不同的位置,可能会自动更改(通过操作系统的操作),并且在正常程序中工作时,通常不需要了解它。
首先,在源代码中声明数组的事实并不一定意味着在内存中创建完整数组或任何数组。编译器可以以消除部分或全部阵列的方式优化源代码。
但是,让我们假设数组是实际创建的。创建虚拟内存是为了表示一个进程独占使用物理内存和/或它具有比实际可用的物理内存更多的内存的错觉。这种错觉的一个目的是,流程不应该关注其数据的实际位置。绝大多数正常过程都可以忽略这一点。
此外,在大多数情况下,编译器很少关注相对于页面边界放置小对象的位置。是否放置100个int
的数组以使其完全在一页内或跨越页面边界通常没什么区别。
当有必要知道或影响数据的实际位置时,会出现许多问题。
有一些方法可以影响相对于页面边界的数据位置,或者通过使用系统或库调用来实现该目的,或者通过分配多余的内存然后将数据放在其中的选定位置。
如果数据很重要并且是首选或需要保留在物理内存中,则可能需要进行系统调用(当然,取决于系统)。
在没有这种具体要求的情况下,数据的位置取决于许多因素。如果声明int
的静态数组并使用编译时数据对其进行初始化,则数据可能会出现在最终生成的可执行文件的一部分中。在某些系统中,当启动可执行文件时,系统不会将整个文件加载到内存中。它仅在引用时从可执行文件加载各种数据部分。因此,此数据最初可能驻留在磁盘上。将其加载到内存后,如果系统负载了其他需要内存的东西,系统可能会从内存中丢弃这些数据,因此它只会再次存在于磁盘上的可执行文件中。
另一方面,如果在程序执行期间生成数据,则当程序生成数据时,它当然在内存中。但是,如果系统承受其他需求,系统可能会从内存中删除数据。在这种情况下,由于磁盘上尚不存在数据(如可执行文件中的数据所示),因此首先将数据写入磁盘上的页面或交换文件。
通常,数据可能会随时间而变化。
我知道我们必须使用虚拟内存分页。
您不必使用分页。您可以关闭分页。
如果我们有一个4kb的页面,这个数组
arr
将适合1页。
它可能适合4kb页面,但它很可能不会在4kb边界上(或接近)对齐,所以实际上它可能存储在两页之间。
此页面是存储在DISK还是RAM上?
数组与其他数据结构没有什么不同。它们存储在内存(RAM)中,除非由于内存不足而被操作系统换成DISK。