1

我正在编写一个 Fortran 90 程序(使用 gfortran 编译)以在 Mac OS X 下运行。我有 13 个数据数组,每个数组包含大约 0.6 GB 的数据一次内存中的所有 13 个数组,我基本上是在尝试使用所有 8 GB,鉴于其他系统需求,我知道这是不可能的。所以我知道数组会被交换。我不知道的是操作系统如何管理它。尤其是,

当操作系统需要为其他数据结构腾出空间时,操作系统是否会换掉整个数据结构(例如数组),或者它是否更愿意逐页进行?也就是说,它是否根据数组的哪些部分最近最少访问来交换部分数组?

答案可能决定我如何组织数组。如果部分数组可以被换出,那么我可以将所有内容存储在一个巨大的数组中(通过索引来选择我需要的 13 个子数组中的哪一个)并相信操作系统可以有效地管理所有内容。否则,我可能会保留单独且不同的数组,每个数组都可以舒适地适应可用的物理内存。

4

2 回答 2

3

操作系统通常不会意识到用户内存中的结构(如数组)。我知道的大多数操作系统,包括 Mac OS X,都是逐页换出内存的。

于 2012-12-11T22:24:10.910 回答
0

尽管该过程通常被错误地称为交换,但在 x86 以及许多现代架构上,操作系统执行分页到仍然称为交换设备的东西(主要是由于历史原因)。每个进程的虚拟内存空间被划分为页和一个特殊的表,称为进程页表,它保存了虚拟内存中的页和物理内存中的帧之间的映射。每个页面可以被映射或不被映射。进一步的映射页面可以存在或不存在。访问未映射的页面会导致分段错误。访问不存在的页面会导致页面错误,这将由操作系统进一步处理 - 它从交换设备中获取页面并将其安装到物理内存中的帧中(如果有的话)。x86 和当今几乎所有其他广泛使用的架构上的标准页面大小为 4 KiB。此外,现代 MMU(内存管理单元,通常是 CPU 的组成部分)支持大页面(例如

因此,与您的数据结构相比,分页确实是细粒度的,并且通常对操作系统的执行方式有松散的控制或没有任何控制。尽管如此,大多数 Unices 允许您使用 C API 向内存管理器提供指令和提示,该 C API 可在<sys/mman.h>头文件中找到。有一些功能可以让您锁定内存的某个部分并防止操作系统将其分页到磁盘。有一些功能可以让您向操作系统提示某种内存访问模式是预期的,以便它可以优化进出页面的方式。您可以将这些与明确开发的数据结构结合起来,以实现对分页的一些控制并获得给定操作系统的最佳性能。

于 2012-12-12T11:27:48.373 回答