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、实现一个原型,证明以上设想是实际可行的。