簡體   English   中英

C ++如何從RAM中取消映射未使用的全局數組?

[英]C++ How to unmap unused global array from RAM?

在 C++ 中,當您聲明一個大數組(例如 500MB)時,它不會立即映射到 RAM,因為它尚未使用。 一旦我第一次從數組中訪問一個頁面,它就會被映射到物理內存。 現在系統知道我正在使用該頁面,但是我如何告訴系統我不再使用某個頁面並且它可以隨意取消映射它?

在我的情況下,我只需要偶爾,而不是一直,填充一個大數組並通過快速隨機訪問對其進行操作。 現在我可以每次都使用 malloc 了,但我為什么要這樣做呢? 有一些方法可以告訴系統您不需要某些頁面,但它們都將其從物理空間虛擬空間中取消映射。 我只想從物理空間中取消映射它。 不可能嗎?

你不需要做任何特別的事情。

內存管理單元會根據需要自動將虛擬內存頁面移入和移出物理 RAM。 如果一個頁面有一段時間沒有被使用,並且它的內存需要做其他事情,它將被換出。 物理 RAM 保存最近使用的頁面,如果舊頁面有文件支持(例如程序的文本段),或者它們被寫入磁盤的交換區域然后被逐出,則它們只會被逐出。

完成整個數組后,您應該使用delete[]釋放它。 根據內存分配器的設計,這可能會或可能不會從您的虛擬內存中刪除內存頁面,但您對此沒有任何直接控制權。

如果您談論的是靜態數組,則無法表明您已經完成了它。 如果您需要這樣做,則必須使用new動態分配數組,以便您可以delete它。

經過大量研究,幸運的是,我找到了另一篇文章,其中顯示使用帶有MAP_ANON|MAP_SHARED選項的mmap()來分配數組,而帶有MADV_REMOVE選項的madvise()可以解決問題。 您可以查看手冊頁以獲取詳細信息。

暫無
暫無

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

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