調用系統函數mmap()的進程,會在其虛擬地址空間中創建一個新的內存映射。
映射分為兩類:
文件映射:將文件的部分區域映射入調用進程的虛擬內存。映射一旦完成,對文件映射內容的訪問則轉化為對相應內存區域的字節操作。映射頁面會按需自動從文件中加載。
相映成趣的是並無文件與之相對應的匿名映射,其映射頁面的內容會被初始化為0.
由某一進程所映射的內存可以與其他進程的映射共享。達成共享的方式有兩種:一是兩處進程都針對某一文件的相同部分加以映射,二是由fork()創建的子進程自父進程處繼承映射。當兩個或多個進程共計享的頁面相同時,進程之一對頁面內容的改動是否為其他進程所見呢?這取決於創建映射時所傳入的標志參數。若傳入標志為私有,則某進程對映射內容的修改對於其他進程是不可見的,而且這些改動也不會真實地落實到文件上;若傳入標志為共享,對映射內容的修改就會為其它進程所見,並且這些修改也會造成對文件的改動。內存映射用途很多,其中包括:以可執行文件的相應段來初始化進程的文本段、內存(內容填充為0)分配、文件IO(即映射內存I/O)以及進程間通信(通過共享映射)。