Re: [閒聊] 動態配置記憶體給初值與記憶體使用間的 …

看板C_and_CPP作者 (好人超)時間15年前 (2010/02/26 03:40), 編輯推噓3(3011)
留言14則, 2人參與, 最新討論串1/1
作業系統會有個原則:盡量延後「真的把記體配置出去的動作」 譬如說,如果有個程式 malloc 了 1KB 的記憶體,作業系統可能不會馬上給他 1KB 而會在這個程式「真的使用」了這些記憶體,作業系統才會在那一刻分配下去 所以你才會看到,剛完成 malloc 的時候,該程式佔用的記憶體並沒有變多 因為程式還沒有使用到,因此作業系統就延後分配了 但是作了賦值之後,真的把一些數字寫入記憶體,就一定要把記憶體給下去 不過如果程式只用到半個陣列,那作業系統也就給一半的記憶體就好了 所以,這個現象跟「節省記憶體」並沒有什麼關係 如果你想要節省記憶體的話,一開始就不要 malloc 那麼大的空間吧? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.117.171.46 ※ 編輯: james732 來自: 140.117.171.46 (02/26 11:45)

02/26 11:45, , 1F
請問使用malloc有回傳值, 若沒有足夠的記憶體時會回
02/26 11:45, 1F

02/26 11:45, , 2F
傳NULL, 所以說在執行malloc的當下會去檢查是否有足
02/26 11:45, 2F

02/26 11:46, , 3F
夠的記憶體可使用, 但真正給的時候是在"指定"的時候
02/26 11:46, 3F

02/26 11:47, , 4F
這樣是否表示在配置後,指定前,這塊記憶體都不能動?
02/26 11:47, 4F
這就牽扯到「virtual memory」的觀念了 malloc 得到的記憶體位置,其實是一個 virtual memory address 它並不是主機板插的那個記憶體的真實位置 (physical memory address) 也就是說,如果呼叫 malloc(500) 回傳了 10000 它並不是真的把實體記憶體上面 10000 至 10499 這塊記憶體給程式用 而你拿到的這個 10000 到底對映到實體記憶體的哪裡,就是作業系統的責任了 強烈建議閱讀「作業系統恐龍書」關於記憶體管理的章節 :) ※ 編輯: james732 來自: 140.117.171.46 (02/26 11:53)

02/26 11:52, , 5F
感謝james7322大的回答...
02/26 11:52, 5F

02/26 11:54, , 6F
所以說可降低同一時間最大記憶體的使用量(無誤?)
02/26 11:54, 6F

02/26 19:49, , 7F
就跟sparse file一樣道理啦
02/26 19:49, 7F

02/26 19:50, , 8F
也不會降低使用量 端看你到底用到多少
02/26 19:50, 8F

02/26 19:52, , 9F
虛擬記憶體的進一步用法就是paging
02/26 19:52, 9F

02/26 19:53, , 10F
把比較少用到的實體記憶體內容搬去硬碟
02/26 19:53, 10F

02/26 19:53, , 11F
下次page fault的時候再搬回來用
02/26 19:53, 11F

02/26 19:54, , 12F
至於他怎麼判斷該不該產生page fault 在我前面推文說的
02/26 19:54, 12F

02/26 19:54, , 13F
那個struct裡面會有個紀錄resident/non-resident的東西
02/26 19:54, 13F

02/26 19:55, , 14F
表示他對應的東西有沒有在實體記憶體裡
02/26 19:55, 14F
文章代碼(AID): #1BXqAZdq (C_and_CPP)