簡體   English   中英

Mac OS X下Fortran中的虛擬內存管理

[英]Virtual memory management in Fortran under Mac OS X

我正在編寫一個Fortran 90程序(使用gfortran編譯)在Mac OS X下運行。我有13個數據陣列,每個數據包含大約0.6 GB的數據我的機器最大輸出為8 GB實內存,如果我試圖保持內存中的所有13個陣列,我基本上都在嘗試使用所有8 GB,我知道這是不可能的,因為其他系統需求。 所以我知道數組會受到交換。 我不知道的是這是如何由操作系統管理的。 尤其是,

操作系統在需要為其他數據結構騰出空間時是否會交換整個數據結構(例如,數組),還是在逐頁的基礎上進行更換? 也就是說,它是否根據最近最少訪問的陣列部分交換出部分數組?

答案可能決定我如何組織數組。 如果部分數組可以被換出,那么我可以將所有內容存儲在一個巨大的數組中(使用索引來選擇我需要的13個子數組中的哪一個)並信任操作系統來有效地管理所有內容。 否則,我可能會保留單獨且不同的陣列,每個陣列都可以在可用的物理內存中舒適地分配。

操作系統通常不了解用戶存儲器中的結構(如陣列)。 我所知道的大多數操作系統,包括Mac OS X,都是逐頁更換內存。

盡管該過程經常被錯誤地稱為交換 ,但在x86以及許多現代架構上,操作系統會對仍稱為交換設備的內容執行分頁 (主要是因為歷史原因)。 每個進程的虛擬內存空間分為頁面和一個稱為進程頁面表的特殊表,它保存虛擬內存中的頁面與物理內存中的幀之間的映射。 每個頁面都可以映射或不映射。 可以存在或不存在進一步映射的頁面。 訪問未映射的頁面會導致分段錯誤。 訪問不存在的頁面會導致頁面錯誤,這將由操作系統進一步處理 - 它從交換設備獲取頁面並將其安裝到物理內存中的幀中(如果有的話)。 x86上的標准頁面大小為4 KiB,現在幾乎任何其他廣泛的架構。 此外,現代MMU(內存管理單元,通常是CPU的組成部分)支持大頁面(例如2 MiB),可用於減少頁表中的條目數量,從而為用戶進程留出更多內存。

因此,與數據結構相比,分頁的確非常精細,而且對於操作系統的操作方式,分頁通常無法控制或無法控制。 盡管如此,大多數Unices允許您使用<sys/mman.h> API <sys/mman.h>頭文件中提供的C API向內存管理器提供說明和提示。 有些功能允許您鎖定內存的某一部分,並阻止操作系統將其分頁到磁盤。 有些功能允許您提示操作系統預期某個內存訪問模式,以便它可以優化頁面的移入和移出方式。 您可以將這些與明確開發的數據結構相結合,以實現對分頁的某些控制並獲得給定OS的最佳性能。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM