檔案讀寫,共享記憶體和mmap記憶體對映

2021-09-16 12:47:02 字數 744 閱讀 8455

1傳統的檔案讀寫,需要將磁碟上的資料copy到檔案緩衝區(為了避免對磁碟的反覆讀寫),都在核心空間,然後找到檔案的inode,先去檔案緩衝區中找有沒有這個檔案,如果沒有的話,到磁碟再到檔案緩衝區。

2.共享記憶體是兩個程序同時開闢出一塊虛擬位址空間,對映到同一塊物理記憶體上

3.記憶體對映是虛擬位址上直接開闢出一塊空間對映到磁碟上的一塊空間。如果沒有資料的拷貝,那麼是如何通過虛擬位址空間的一部分記憶體操作磁碟上的檔案,通過mmap返回的是乙個函式指標,該函式指標指向虛擬位址空間分配出的一塊空間的首位址,通過mmu找到其實體地址,因為並沒有實現真正的資料拷貝,所以這時產生乙個缺頁中斷,然後才會去將資料從磁碟拷貝到一塊物理記憶體上去。

從**層面上看,從硬碟上將檔案讀入記憶體,都要經過檔案系統進行資料拷貝,並且資料拷貝操作是由檔案系統和硬體驅動實現的,理論上來說,拷貝資料的效率是一樣的。但是通過記憶體對映的方法訪問硬碟上的檔案,效率要比read和write系統呼叫高,這是為什麼呢?原因是read()是系統呼叫,其中進行了資料拷貝,它首先將檔案內容從硬碟拷貝到核心空間的乙個緩衝區,如圖2中過程1,然後再將這些資料拷貝到使用者空間,如圖2中過程2,在這個過程中,實際上完成了 兩次資料拷貝 ;而mmap()也是系統呼叫,如前所述,mmap()中沒有進行資料拷貝,真正的資料拷貝是在缺頁中斷處理時進行的,由於mmap()將檔案直接對映到使用者空間,所以中斷處理函式根據這個對映關係,直接將檔案從硬碟拷貝到使用者空間,只進行了 一次資料拷貝 。因此,記憶體對映的效率要比read/write效率高。

2和3都是只需要將資料copy一次。

共享記憶體 與 mmap

o 共享記憶體 可以說是最有用的程序間通訊方式,也是最快的ipc形式。兩個不同程序a b共享記憶體的意思是,同一塊物理記憶體被對映到程序a b各自的程序位址空間 程序a可以即時看到程序b對共享記憶體中資料的更新,反之亦然 由於多個程序共享同一塊記憶體區域,必然需要某種同步機制,互斥鎖和訊號量都可以 ...

mmap實現共享記憶體

mmap概念 mmap將乙個檔案或者其它物件對映進記憶體。檔案被對映到多個頁上,如果檔案的大小不是所有頁的大小之和,最後乙個頁不被使用的空間將會清零。mmap在使用者空間對映呼叫系統中作用很大。mmap操作提供了一種機制,讓使用者程式直接訪問裝置記憶體,這種機制,相比較在使用者空間和核心空間互相拷貝...

程序通訊 mmap記憶體共享

回頁首if fd 0 回頁首 include include include include typedef structpeople main int argc,char argv map a normal file as shared mem printf initialize over n s...