madvise


 

void MemMap::MadviseDontNeedAndZero() {
  if (base_begin_ != nullptr || base_size_ != 0) {
    if (!kMadviseZeroes) {
      memset(base_begin_, 0, base_size_);
    }
    int result = madvise(base_begin_, base_size_, MADV_DONTNEED);
    if (result == -1) {
      PLOG(WARNING) << "madvise failed";
    }
  }
}

 在低內存模式中,Dalvik虛擬機假設對象不會馬上就使用分配到的內存,因此,它就通過系統接口madvice和MADV_DONTNEED標志告訴內核,剛剛分配出去的內存在近期內不會使用,內核可以該內存對應的物理頁回收。當分配出去的內存被使用時,內核就會重新給它映射物理頁,這樣就可以做按需分配物理內存,適合在內存小的設備上運行。這里有三點需要注意。

 

 

madvise 給關於使用內存
int madvise(void *addr 、長度 size_t , int 建議);


在madvise()系統調用內核中關於如何處理分頁 input/output 判斷地址 addr 處開始的區域的地址和大小長度的字節.它允許一個 application 來告訴內核如何它需要使用某些映射或共享內存區域,使內核可以選擇適當的預讀和緩存技術.此調用不會影響應用程序的語義的(除在 madv_dontneed 大小寫),但可以配置它的性能.要忽略建議的內核是免費的.

在處理,建議參數可以是

madv_normal
    特殊處理.這是默認的.
madv_random
    類以隨機順序引用頁.(因此,預讀比通常會很有用 .)
madv_sequential
    類按順序依次引用頁.(因此,在給定的頁面區域可以 aggressively 預讀.和可能釋放后 .)
madv_willneed
    預計在不久的將來訪問(因此,可能最好以閱讀一些頁面 .)
madv_dontneed
    不要期待在不久的將來訪問(用的時間.用給定的范圍后,使內核可以釋放與它關聯的資源.)在此范圍內的頁的后續訪問都將成功,但從基礎會在重新裝入存儲器內容的映射文件(看到mmap(2))在沒有基本映射的頁面請求或零填充
madv_remove(因為已經為)
    釋放給定的范圍和與其相關聯的備份存儲.目前,只有 shmfs/tmpfs 支持此;其他文件系統的錯誤返回 enosys .
madv_dontfork(因為已經為)
    不要使在此范圍內的頁子之后fork(2).這是有用的,防止寫上復制語義更改頁的物理位置.(s)如果寫入之后fork(2).(這樣的頁面指令導致硬件 dmas 至頁面(s).)
madv_dofork(因為已經為)
    撤消 madv_dontfork ,還原默認行為,即映射繼承在 fork 的效果(2).
madv_hwpoison(因為 linux 2.6.32)
    當一個網頁以及其句柄可以像內存硬件的損壞.此操作僅對於特權(cap_sys_admin)進程.此操作可能導致接收日志和頁面調用進程沒有定義.此功能僅用於測試的內存錯誤處理代碼;它僅在配置為使用 config_memory_failure .
madv_soft_offline(因為 linux 2.6.33)
    區域中的軟脫機頁的地址和長度.指定區域中的每一頁的內存是保留(即,當訪問,都將看到相同的內容,但在一個新的物理頁面框架),和原始網頁 offlined(例如,不再使用,超出正常的內存管理).以下是 madv_soft_offline 隱身的效果來(即,不能更改語義)調用進程.此功能僅用於測試的內存錯誤處理代碼;它僅在配置為使用 config_memory_failure .
madv_mergeable(因為 linux 2.6.32)
    啟用內核 samepage 合並(內存膨脹和ksm)指定的范圍中的頁地址和長度.內核經常能夠掃描用戶的內存已經被標為 mergeable ,具有相同內容的頁.這些是用單個寫保護頁(可自動復制如果進程以后想要更新的頁的內容).ksm操作合並私有匿名頁面(看到mmap(2)).用於生成 實例數目相同的內存膨脹和 ksm 特征數據(例如,諸如 kvm 的虛擬系統).它可以消耗大量的處理能力;請謹慎使用.查看內核源文件 documentation/vm/ksm.txt 有關的細節.與 config_ksm madv_mergeable 和 madv_unmergeable 操作只能在內核被配置.
madv_unmergeable(因為 linux 2.6.32)
    撤消先前的效果 madv_mergeable 操作在指定的地址范圍;內存膨脹和 ksm unmerges 任何頁面時,合並在地址范圍指定的地址和長度.
madv_hugepage(因為 linux 2.6.38)
    啟用透明極大的頁(thp)指定的區域中的網頁地址和長度.目前,透明向來僅使用私有匿名頁面的頁面(看到mmap(2)).下面的例子將定期掃 描區域被標為候選頁面來替換它們,極大的網頁了.內核也將分配大頁面直接當分解的龐大與頁大小(看到posix_memalign(2)).此功能主要是 以使用大型映射訪問大型和數據的內存區域的時間(例如,諸如 qemu 虛擬系統).它可以非常輕松地浪費內存(例如, 2mb 曾訪問映射只1個字節將導致有線的 2mb 內存的一個為 4kb 頁面).查看內核源文件 documentation/vm/transhuge.txt 有關的細節.以下 madv_hugepage 和 madv_nohugepage 操作 如果內核配置為使用 config_transparent_hugepage 可用.
madv_nohugepage(因為 linux 2.6.38)
    在指定的地址范圍以確保內存地址和長度將不會被折疊到極大的頁.

返回值

在成功madvise()返回零.上的錯誤,則返回-1, errno 提到它.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM