嵌入式Linux中tmpfs占用共享内存的原因及共享进程分析
环境信息
root@mcu-v1:~# df -h Filesystem Size Used Available Use% Mounted on /dev/root 160.0M 116.7M 43.3M 73% / devtmpfs 61.0M 0 61.0M 0% /dev tmpfs 61.0M 80.0K 61.0M 0% /run tmpfs 61.0M 9.1M 52.0M 15% /var/volatile /dev/mtdblock2 96.0M 3.0M 93.0M 3% /mnt/app
tmpfs占用共享内存的原因及内存共享范围
1. 为何tmpfs会被统计到共享内存中?
tmpfs是完全基于系统RAM(或交换分区)实现的文件系统,所有数据(文件内容、元数据)都存储在内存的页缓存中。
free命令的"shared"字段统计的是可被多个进程共享的内存页,而tmpfs的页缓存恰好符合这个特性:这些页不属于某个进程的私有内存,而是由内核管理的公共缓存,任何有权限访问tmpfs文件的进程都可以复用这些页。当你往/var/volatile(tmpfs挂载点)写入文件时,内核会分配内存页存储文件内容,并将这些页归类到共享内存统计范畴,导致free的shared数值增长。
嵌入式系统的free工具通常会直接将tmpfs使用的内存计入shared,这是因为tmpfs本质就是内核提供的共享内存型文件系统,和桌面Linux的统计逻辑一致。
2. 这些内存会在哪些进程间共享?
- 访问同一tmpfs文件的进程:如果多个进程读写
/var/volatile下的同一个日志文件,它们会共享该文件对应的页缓存,无需各自复制内存页。 - 所有进程与内核:tmpfs的元数据(目录项、inode结构等)由内核维护,这些内核空间的内存对所有用户进程可见,属于全局共享范畴。
- 通过mmap映射同一tmpfs文件的进程:若进程用
mmap()系统调用将tmpfs文件映射到自身地址空间,映射后的内存页会在所有做了相同映射的进程间共享,减少内存冗余。
即便暂时只有单个进程操作tmpfs文件,内核仍会将这些页标记为可共享,所以free的shared数值依然会增长——这是内核为后续可能的共享访问提前做的优化。
内容的提问来源于stack exchange,提问作者Moh3N
相关产品推荐
相关产品推荐

