簡體   English   中英

在malloc和免費通話期間如何分配和釋放物理頁面?

[英]How does physical pages are allocated and freed during the malloc and free call?

Malloc從名為Heap的進程的一個虛擬內存區域分配內存。 堆的初始大小是什么(在執行開始之后和任何malloc調用之前)? 比如說,如果Heap從X虛擬地址開始並以Y虛擬地址結束,我想知道X和Y之間的區別。

我已經閱讀了之前提出的重復問題的答案。

malloc()和free()如何工作?

寫的答案都在虛擬地址的上下文中,但我想知道如何分配物理頁面。 我不確定,但我認為這個初始大小(XY)在操作系統中沒有相應的頁表條目。 如果我錯了,請糾正我。

現在,假設有一個請求分配(和使用)10個字節的內存,將分配一個新頁面。 那么,從這個頁面或每次分配新頁面時,是否滿足所有進一步的內存請求? 誰來決定這個?

當釋放內存時(使用free()),那么在什么時候這個分配的物理頁面將被釋放並標記為可用? 據我所知,虛擬地址和物理頁面不會立即釋放,因為釋放的內存量可能非常少。 那么在什么時候物理和虛擬地址之間的相應關聯將被終止?

如果我的問題聽起來很奇怪,我很抱歉。 我只是一個新手,並試圖了解內部。

通常,您可以將物理頁面視為臨時分配。 如果程序正在使用的內存交換到磁盤,那么任何時候都可以刪除虛擬地址和物理RAM之間的關聯,並將該物理RAM用於其他內容。

如果程序稍后訪問該內存,則操作系統將為該虛擬頁面分配新的物理頁面,將數據從頁面文件復制回物理內存,並完成內存訪問。

因此,要回答您的問題,當您的程序不再使用其中或之前的分配時,可能會將物理頁面標記為可用。 或之后,因為malloc並不總是費心將內存釋放回操作系統。 你真的無法預測這些東西。

這一切都發生在內核中,從C的角度來看它是不可見的,就像從C中看不到內存的CPU緩存一樣。在你的程序由於交換而大量減速之前,它是不可見的。 顯然,如果你禁用交換文件,那么事情會發生一些變化:由於交換而導致程序運行速度變慢,某些程序無法分配內存,或者某些東西會被OOM殺手殺死。

如何在每個操作系統,Linux,Mac,Windows等中分配頁面是不同的。在大多數/所有實現中,都有一個內核機制來定義它的分配方式。

http://www.linuxjournal.com/article/1133

操作系統如何處理這一點與操作系統有關。 在大多數(如果不是全部)情況下,操作系統至少會在其表中注意到存在分配。 您可能會對以下事實感到困惑:在某些情況下某些操作系統在訪問之前不會提交內存。 (關鍵字:overcommit;如果你想要我的意見,它應該是每個進程設置,而不是全局設置,並默認為提交內存)。

現在將釋放的內存返回給操作系統,這取決於分配器。 它不能返回任何小於頁面的內容,因此當頁面包含已分配的內存時,將不會返回它。 根據它的分配方式,可能還有其他限制因素; 例如,當傳統上在Unix上使用sbreak()時,你只能返回最新分配的頁面(即如果你返回一個頁面,也會返回之后分配的所有頁面)。 Unix上更現代的方法使用mmapped內存用於大塊,理由是可以按需要返回mmapped內存。 對於小的分配塊,通常認為不值得檢查中間的頁面是否可以返回,因此不使用mmapped內存。

暫無
暫無

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

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