2013-03-03 59 views
1

我一直在尋求獲得malloc和mmap系統調用之間的區別。這兩者之間的確切區別是什麼?建議哪個?瞭解mmap

回答

2

mmap()實際上並未將文件加載到內存中(不使用任何內存,但它佔用地址空間),但malloc()分配內存形式堆。

我的建議是使用malloc()用於小物體,mmap()用於大物體。

+1

這個信息是不準確的。 mmap確實將文件加載到內存中 - 它將內核頁面映射到用戶空間。關於堆棧溢出的答案很多,詳細介紹了它的工作原理。或者閱讀Stevens的「高級Unix編程」。 – resigned 2013-11-01 00:09:06

1

他們有很大的不同:

  1. malloc()從分配堆內存;
  2. mmap()是一個用於memory-mapped files的API。

在大多數情況下,它們不是互相替代的,所以關於哪一個更好的問題並沒有真正的意義。

5

mmap()是映射磁盤上文件數據的系統級地址。使用mmap(),你可以引用磁盤上的任何文件,就好像它是一個簡單的byte []數組。它可以用於以下任何應用中。

  • 無論何時從磁盤上的文件請求數據,它都會加載到RAM中。 如果您有兩個單獨的程序需要來自同一文件的數據,您可以使用mmap()直接從磁盤訪問該文件,從而減少了冗餘RAM使用量。

  • 當你正在處理的數據如此之大,它不能在 主內存(RAM),你可能會使用mmap()中的數據文件的 其中的物理存儲上的訪問部分適合您磁盤,從而再次減少RAM使用量並有效處理大於RAM數據。

請注意,在64位系統中,mmap()可以處理磁盤上的任何位置,但不能處理32位系統中的任何位置!因爲在32位系統中,最大可尋址空間限制爲2^32 - 1(4GB),但在64位系統上可以尋址PB級的位置。

malloc()爲您提供了一個指針,指向堆(RAM)中的某個空間來存儲臨時對象。

mmap()和malloc()之間唯一的相似之處是它們都返回指針。但是mmap()指向磁盤上的內存,malloc()指向堆上的內存。