2012-04-25 145 views
5

在32位Linux系統上,進程最多可以訪問4 GB的虛擬地址空間;然而,在保留任何這些方面,程序在不同程度上似乎保守。因此,使用malloc的程序偶爾會通過系統調用sbrk/brk來擴展其數據段。即使這些網頁尚未在物理內存中聲明。我不完全明白的是,爲什麼我們需要首先解決問題,爲什麼不直接給我4 GB的地址空間來避免任何sbrk調用,直到我們接觸/聲明這些塊爲止,它本質上是一個免費的操作權?虛擬內存和sbrk

回答

5

如果你記憶映射一個文件(在Linux下做一件很常見的事)會發生什麼?它必須在地址空間的某個地方,所以必須有一些定義「使用」和「未使用」部分的方法。
共享內存(實際上只是映射文件而沒有實際文件)是相同的。它必須去某個地方,操作系統必須確保它可以放置它而不會覆蓋某些東西。

此外,由於明顯的(不太明顯的)效率原因,最好保持參考的局部性。如果你被允許在地址空間的任何位置寫信和讀取信息,你可以打賭有些人會這麼做。

+0

「共享內存(這其實只是一個映射文件,而無需實際的文件)是一樣的。它必須去某個地方,操作系統必須確保它可以放置它,而不會覆蓋某些東西。「我明白你說的(我認爲),因爲malloc調用mmap(匿名和私有),我相信並且可能或可能會不要調用sbrk,但是如果在程序中,init malloc已經完成了brk(4GB),它將系統調用刪除到sbrk等等。但是你不能再映射額外的內存映射文件或者用不同的標誌創建共享內存。我開始明白 – 2012-04-25 09:51:28

+0

「另外,爲了明顯(並且不太明顯)的效率原因,最好保持參考的位置。」但是如果我從1gb中取出一些內存到4gb塊中並將3.9gb放入4gb塊中,它可能會一旦新鮮的分配是seg故障(剛剛清零的權利),在物理記憶中關閉? – 2012-04-25 09:52:55

+0

它可能,它可能不會,你不知道。 – Damon 2012-04-25 10:30:01

4

有一對夫婦的浮現在腦海中的原因:

  • 你會不再得到段錯誤訪問映射的內存
  • Translation lookaside buffer(TLB)時將更大,可能需要更多的時間來進行設置高達
  • 你不得不如果你在一個新的共享庫或MMAP加載取消映射一些內存反正()的東西