inux內存映射和共享內存理解和區別


可以看到內存映射中需要的一個參數是int fd(文件的標識符),可見函數是通過fd將文件內容映射到一個內存空間,
我需要創建另一個映射來得到文件內容並統計或修改,這時我創建這另一個映射用的仍是mmap函數,
它仍需要用到fd這個文件標識,那我不等於又重新打開文件讀取文件里的數據
1.既然這樣那同對文件的直接操作有什么區別呢? 
2.映射到內存后通過映射的指針addr來修改內容的話是修改共享內存里的內容還是文件的內容呢?
3.解決上面2個問題,我還是想確切知道共享內存有什么用???
一種回答|1、訪問共享內存的執行速度比直接訪問文件的快N倍(N》10),這對於要求快速輸入輸出的場合非常有效。
2、通過addr修改的內容是修改的是共享內容中的內容。至於是否修改了文件中的內容,要看文件的類型。
   對於顯示設備等文件來說,修改的也是文件的內容,因為他直接寫到了顯存中。對於普通文件,
   在close文件時,kernel會將數據更新到硬盤等存儲設備中。
3、共享內存主要是為了提高程序的執行速度,方便多個進程進行快速的大數據量的交換。
第二種回答:
對於是修改文件內容的內存映射:
1、你的這個說法不確切。舉個例子來說:對顯示設備文件(顯卡)進行內存的映射,並不會在內存中新分配一塊內存,
   而是直接將顯存地址通過addr參數傳給應用程序。這樣應用程序通過內存映射修改文件時,
   其實就是直接修改顯存中的內容(也就是改變顯示內容)。
2、感覺你把內存映射和共享內存搞混了。內存映射是用來加快對文件/設備的訪問。
 (如果是大文件,而且還想提高讀寫速度的話,建議使用內存映射。)
  共享內存是用來在多個進程間進行快速的大數據量的交換。
3、fd是文件描述符。它和內存映射沒有直接的關系。只有做過內存映射后,它和映射到的內存才存在對應關系。
對於不修改文件內容的內存映射
1、不一定,可以在程序中指定要將文件內容映射到哪塊內存。對於多個進程打開同一個文件,
   不同的內存映射可以開辟多塊內存區域。更新文件內容的順序依照關閉文件的進程的順序執行,因此,存在臟讀的問題。
2、:-),一定要記住,內存映射是為了加快對文件/設備的訪問速度,不是用來進行數據通信的。
轉載自:http://bbs.csdn.net/topics/340203684
我對內存映射的理解就是通過操作內存來實現對文件的操作,這樣可以加快執行速度,因為操作內存比操作文件的速度快多了! 
共享內存,顧名思義,就是預留出的內存區域,它允許一組進程對其訪問。
共享內存是system vIPC中三種通信機制最快的一種,也是最簡單的一種。對於進程來說,
獲得共享內存后,他對內存的使用和其他的內存是一樣的。由一個進程對共享內存所進行的
操作對其他進程來說都是立即可見的,因為每個進程只需要通過一個指向共享內存空間的指針就可以來讀取
共享內存中的內容(說白了就好比申請了一塊內存,每個需要的進程都有一個指針指向這個內存)
就可以輕松獲得結果。使用共享內存要注意的問題:共享內存不能確保對內存操作的互斥性。
一個進程可以向共享內存中的給定地址寫入,而同時另一個進程從相同的地址讀出,這將會導致不一致的數據。
因此使用共享內存的進程必須自己保證讀操作和寫操作的的嚴格互斥。
可使用鎖和原子操作解決這一問題。也可使用信號量保證互斥訪問共享內存區域。
共享內存在一些情況下可以代替消息隊列,而且共享內存的讀/寫比使用消息隊列要快!

                                                                               
 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM