我有一个Linux System V IPC共享内存段,由一个进程填充并被许多其他进程读取。所有进程都以类的形式使用接口到共享内存段,该类负责查找,附加和分离段作为其构造函数/析构函数方法的一部分。
这里的问题是我不时会看到该段已“分裂”。我在这里的意思是,在“ipcs -m -s”输出中,我看到我列出了两个段:一个已被标记为销毁,但仍然附加了一些进程,另一个看起来像获取附加到细分受众群的所有新尝试。但是,我实际上从未要求内核销毁该段。这里发生了什么?!
另外需要注意的一点是,遗憾的是,正在运行的系统在内存部门严重过度。有1 GB的物理内存,没有交换,/ proc / meminfo中的Committed_AS报告大约2.5GB的提交内存。幸运的是,系统进程实际上并没有使用这么多内存......他们只是要求它(我仍然有vmstat报告的大约660MB“免费”内存)。虽然我知道这远非理想,但目前我无法对过度使用的内存做些什么。但是,在浏览内核/ libc源代码时,我没有看到任何内容会因为除用户请求之外的任何原因而标记共享内存段以进行删除(但也许我错过了它隐藏在某处)。
这里的参考是共享内存接口类'constructor:
const char* shm_ftok_pathname = "/usr/bin";
int shm_ftok_proj_id = 21;
// creates a key from a file path so different processes will get same key
key_t m_shm_key = ftok(shm_ftok_pathname, shm_ftok_proj_id);
if ( m_shm_key == -1 )
{
fprintf(stderr,"Couldn't get the key for the shared memory\n%s\n",strerror(errno));
exit ( status );
}
m_shm_id = shmget(m_shm_key, sizeof(shm_data_s), (IPC_CREAT | 0666));
if (m_shm_id < 0)
{
fprintf(stderr,"Couldn't get the shared memory ID\nerrno = %s \n",strerror(errno));
exit ( status );
}
// get a ptr to shared memory, which is a shared mem struct
// second arg of 0 says let OS choose shm address
m_shm_data_ptr = (shm_data_s *)shmat(m_shm_id, 0, 0);
if ( (int)m_shm_data_ptr == -1 )
{
fprintf(stderr,"Couldn't get the shared memory pointer\n");
exit ( status );
}
这是我的uname输出: Linux 2.6.18-5-686#1 SMP Fri Jun 1 00:47:00 UTC 2007 i686 GNU / Linux
答案 0 :(得分:1)
我的第一个猜测是你可能正在某处调用shmctl(..., IPC_RMID, ...)
。
你能展示共享内存接口类'析构函数吗?
答案 1 :(得分:0)
内核将段标记为删除的唯一原因是显式用户调用。可以尝试strace / truss(在solaris中)以查明是否有用户调用所述函数,提到在上面的1中。
Raman Chalotra