linux會有兩種方式可以使用共享內存.
分別是shm_XX函數和mmap,這兩種共享內存的是內核實現方式大同小異,但是還是有區別的.
二者的區別如下:
- POSIX標準的是mmap,具有簡單易用的特點.
- system V標準的是shm_xx函數組(shm_get,shm_at,shm_dt,shm_ctl).
- shm_xx函數的共享內存需要自己釋放,即進程的結束不會導致共享內存的釋放,他會一直保存直到手動釋放或者關機.而mmap則相反,如果是非映射到文件,那麼會在進程結束就結束了.
- 當調用shm_get時,會創建一個文件並返回這個文件描述符,這個文件是內核創建的特殊的文件,它屬於shm文件系統中,也就是說它的實現方式和mmap的大同小異,只是映射的文件是內核中特殊的文件系統中的文件,任何進程都可以共享.這個特殊的文件,會對應開闢的共享內存.當調用shm_at時會將該空間映射進進程的地址空間中.
- shm_xx的特殊文件系統掛在點在/dev/shm中,也就是內存/交換分區中,所以會在系統重啓後消失,裏面的東西也就沒了,而mmap可以映射到文件中.
參考資料:
-兩種linux共享內存參考資料鏈接
-linux進程間通訊共享內存
-要查看task_struct 和 mm_struct以及圖片中的struct vm_area_struct 結構體間的關係,點這裏