1. 概述
Linux由於歷史原因,其IPC分為SYSTEM V版本和POSIX版本。本文主要討論在共享內存方面這兩個版本之間的區別。
各共享內存IPC的函數對照表:
IPC
POSIX
SYSTEM V
頭文件
<sys/mman.h>
<sys/shm.h>
IPC創建和刪除
shm_open
shm_unlink
shmget
IPC控制
ftruncate
fstat
shmctl
IPC操作
mmap
munmap
msync
shmat
shmdt
在實現機制方面,POSIX共享內存是采用IO映射的方式來實現的,即通過系統調用mmap()映射一個普通文件實現共享內存。SYSTEM V共享內存則是通過對特殊文件系統shm中的文件來映射實現的,也就是說,每個共���內存區域對應特殊文件系統shm中的一個文件。它們之間的關鍵區別是POSIX共享內存把一個普通文件映射到系統內存中實現,而SYSTEM V共享內存則是直接在shm特殊文件系統上實現。
2. 低壓集抄嵌軟中共享內存使用分析
目前低壓集抄嵌軟采用POSIX共享內存實現進程間通信和系統級數據的內存共享。而POSIX共享內存需要通過一個普通文件來映射實現共享內存,於是系統在啟動時創建ramfs文件系統,再在其上建立共享內存文件。ramfs是內存文件系統,它直接建立在內存上,占用相當多的內存空間。同時由於低壓集抄系統采用的ucLinux不支持虛擬內存,這樣在映射時又占用一大部分內存空間,直接導致了共享內存對雙份內存空間的占用。
那為什麼不能將普通文件建立在flash文件系統上呢?由於NAND FLASH存儲器件的寫操作的特殊性,決定了嵌軟的寫數據操作不能太頻繁,否則有可能影響NAND FLASH器件的壽命。據《Linux內核源代碼情景分析》下載見 http://www.linuxidc.com/Linux/2011-05/36202.htm,POSIX共享內存會由系統不定時將共享內存中的內容刷新到普通文件中。基於此,當初設計時采用ramfs也不是沒有道理的。
3. 低壓集抄嵌軟中共享內存改進建議
由於目前裝置生產中成本控制較嚴,內存容量較小,而低壓集抄系統須共享的數據較多,如在北京集抄嵌軟中系統共享數據達到10M,通過POSIX共享內存映射機制實現進程信息共享後,將內存耗去20M。基於此,建議共享內存采用SYSTEM V版本提供的方法來實現。由於SYSTEM V共享內存不需要通過普通文件映射來實現,所以不需要刷新到普通文件中。在實際使用中可以比POSIX省近一半內存,非常可觀。
要驗證以上設想,還需要做兩點工作:
1、確認目前所用的Linux系統支持SYSTEM V共享內存及shm特殊文件系統。
2、實現一個原型,證明以上設想是實際可行的。