我正在编写一个Fortran 90程序(使用gfortran编译)在Mac OS X下运行。我有13个数据阵列,每个数据包含大约0.6 GB的数据我的机器最大输出为8 GB实内存,如果我尝试一次将所有13个阵列保存在内存中,我基本上尝试使用所有8 GB,我知道鉴于其他系统需求,这是不可能的。所以我知道数组会受到交换。我不知道的是这是如何由操作系统管理的。特别是,
当操作系统需要为其他数据结构腾出空间时,它是否会更换整个数据结构(例如,数组),还是在逐页的基础上进行操作?也就是说,它是否根据最近最少访问的阵列部分交换出部分数组?
答案可能决定我如何组织数组。如果部分数组可以被换出,那么我可以将所有内容存储在一个巨大的数组中(使用索引来选择我需要的13个子数组中的哪一个)并信任操作系统来有效地管理所有内容。否则,我可能会保留单独且不同的数组,每个数组都可以在可用的物理内存中轻松适应。
答案 0 :(得分:3)
操作系统通常不会意识到用户内存中的结构(如数组)。我所知道的大多数操作系统,包括Mac OS X,都是逐页更换内存。
答案 1 :(得分:0)
虽然该过程经常被错误地称为交换,但在x86以及许多现代架构上,操作系统执行 paging 到仍然称为交换设备(主要是)因为历史原因)。每个进程的虚拟内存空间分为页面和一个称为进程页面表的特殊表,它保存虚拟内存中的页面与物理内存中的帧之间的映射。每个页面都可以映射或不映射。可以存在或不存在进一步映射的页面。访问未映射的页面会导致分段错误。访问不存在的页面会导致页面错误,这将由操作系统进一步处理 - 它从交换设备获取页面并将其安装到物理内存中的帧中(如果有的话)。 x86上的标准页面大小为4 KiB,现在几乎任何其他广泛的架构。此外,现代MMU(内存管理单元,通常是CPU的一个组成部分)支持大页面(例如2 MiB),可用于减少页表中的条目数量,从而为用户进程留下更多内存。 p>
因此,与数据结构相比,分页的确非常精细,而且对于操作系统的操作方式,分页往往松散或无法控制。尽管如此,大多数Unices允许您使用<sys/mman.h>
头文件中提供的C API向内存管理器提供说明和提示。有些功能允许您锁定内存的某一部分,并阻止操作系统将其分页到磁盘。有些功能允许您提示操作系统预期某个内存访问模式,以便它可以优化页面的移入和移出方式。您可以将这些与明确开发的数据结构相结合,以实现对分页的某些控制并获得给定OS的最佳性能。