低压集抄系统中Linux共享内存使用分析


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内核源代码情景分析》下载见 ,POSIX共享内存会由系统不定时将共享内存中的内容刷新到普通文件中。基于此,当初设计时采用ramfs也不是没有道理的。

3.   低压集抄嵌软中共享内存改进建议

由于目前装置生产中成本控制较严,内存容量较小,而低压集抄系统须共享的数据较多,如在北京集抄嵌软中系统共享数据达到10M,通过POSIX共享内存映射机制实现进程信息共享后,将内存耗去20M。基于此,建议共享内存采用SYSTEM V版本提供的方法来实现。由于SYSTEM V共享内存不需要通过普通文件映射来实现,所以不需要刷新到普通文件中。在实际使用中可以比POSIX省近一半内存,非常可观。

要验证以上设想,还需要做两点工作:

1、确认目前所用的Linux系统支持SYSTEM V共享内存及shm特殊文件系统。

2、实现一个原型,证明以上设想是实际可行的。

相关内容