看板 C_and_CPP 關於我們 聯絡資訊
作業系統會有個原則:盡量延後「真的把記體配置出去的動作」 譬如說,如果有個程式 malloc 了 1KB 的記憶體,作業系統可能不會馬上給他 1KB 而會在這個程式「真的使用」了這些記憶體,作業系統才會在那一刻分配下去 所以你才會看到,剛完成 malloc 的時候,該程式佔用的記憶體並沒有變多 因為程式還沒有使用到,因此作業系統就延後分配了 但是作了賦值之後,真的把一些數字寫入記憶體,就一定要把記憶體給下去 不過如果程式只用到半個陣列,那作業系統也就給一半的記憶體就好了 所以,這個現象跟「節省記憶體」並沒有什麼關係 如果你想要節省記憶體的話,一開始就不要 malloc 那麼大的空間吧? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.117.171.46 ※ 編輯: james732 來自: 140.117.171.46 (02/26 11:45)
alimaalimaaa:請問使用malloc有回傳值, 若沒有足夠的記憶體時會回 02/26 11:45
alimaalimaaa:傳NULL, 所以說在執行malloc的當下會去檢查是否有足 02/26 11:45
alimaalimaaa:夠的記憶體可使用, 但真正給的時候是在"指定"的時候 02/26 11:46
alimaalimaaa:這樣是否表示在配置後,指定前,這塊記憶體都不能動? 02/26 11:47
這就牽扯到「virtual memory」的觀念了 malloc 得到的記憶體位置,其實是一個 virtual memory address 它並不是主機板插的那個記憶體的真實位置 (physical memory address) 也就是說,如果呼叫 malloc(500) 回傳了 10000 它並不是真的把實體記憶體上面 10000 至 10499 這塊記憶體給程式用 而你拿到的這個 10000 到底對映到實體記憶體的哪裡,就是作業系統的責任了 強烈建議閱讀「作業系統恐龍書」關於記憶體管理的章節 :) ※ 編輯: james732 來自: 140.117.171.46 (02/26 11:53)
alimaalimaaa:感謝james7322大的回答... 02/26 11:52
alimaalimaaa:所以說可降低同一時間最大記憶體的使用量(無誤?) 02/26 11:54
buganini:就跟sparse file一樣道理啦 02/26 19:49
buganini:也不會降低使用量 端看你到底用到多少 02/26 19:50
buganini:虛擬記憶體的進一步用法就是paging 02/26 19:52
buganini:把比較少用到的實體記憶體內容搬去硬碟 02/26 19:53
buganini:下次page fault的時候再搬回來用 02/26 19:53
buganini:至於他怎麼判斷該不該產生page fault 在我前面推文說的 02/26 19:54
buganini:那個struct裡面會有個紀錄resident/non-resident的東西 02/26 19:54
buganini:表示他對應的東西有沒有在實體記憶體裡 02/26 19:55