linux 共享内存 地址是唯一的吗

 我来答
匿名用户
2016-02-26
展开全部
所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用IPC形式。是针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。其他进程能把同一段共享内存段“连接到”他们自己的地址空间里去。所有进程都能访问共享内存中的地址。如果一个进程向这段共享内存写了数据,所做的改动会即时被有访问同一段共享内存的其他进程看到。共享内存的使用大大降低了在大规模数据处理过程中内存的消耗,但是共享内存的使用中有很多的陷阱,一不注意就很容易导致程序崩溃。

超过共享内存的大小限制?

在一个linux服务器上,共享内存的总体大小是有限制的,这个大小通过SHMMAX参数来定义(以字节为单位),您可以通过执行以下命令来确定 SHMMAX 的值:
# cat /proc/sys/kernel/shmmax
如果机器上创建的共享内存的总共大小超出了这个限制,在程序中使用标准错误perror可能会出现以下的信息:
unable to attach to shared memory
解决方法:
1、设置 SHMMAX
SHMMAX 的默认值是 32MB 。一般使用下列方法之一种将 SHMMAX 参数设为 2GB :
通过直接更改 /proc 文件系统,你不需重新启动机器就可以改变 SHMMAX 的默认设置。我使用的方法是将以下命令放入 />etc/rc.local 启动文件中:
# echo "2147483648" > /proc/sys/kernel/shmmax
您还可以使用 sysctl 命令来更改 SHMMAX 的值:
# sysctl -w kernel.shmmax=2147483648
最后,通过将该内核参数插入到 /etc/sysctl.conf 启动文件中,您可以使这种更改永久有效:
# echo "kernel.shmmax=2147483648" >> /etc/sysctl.conf
2、设置 SHMMNI
我们现在来看 SHMMNI 参数。这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096 。这一数值已经足够,通常不需要更改。
您可以通过执行以下命令来确定 SHMMNI 的值:
# cat /proc/sys/kernel/shmmni
4096
3、设置 SHMALL
最后,我们来看 SHMALL 共享内存内核参数。该参数控制着系统一次可以使用的共享内存总量(以页为单位)。简言之,该参数的值始终应该至少为:
ceil(SHMMAX/PAGE_SIZE)
SHMALL 的默认大小为 2097152 ,可以使用以下命令进行查询:
# cat /proc/sys/kernel/shmall

2097152
SHMALL 的默认设置对于我们来说应该足够使用。
注意: 在 i386 平台上 Red Hat Linux 的 页面大小 为 4096 字节。但是,您可以使用 bigpages ,它支持配置更大的内存页面尺寸。
今至电子科技有限公司
2024-08-13 广告
服务器虚拟化是一种将物理服务器资源(如CPU、内存、存储)抽象并分割成多个独立虚拟服务器的技术。通过虚拟化软件,如VMware、Hyper-V等,可以在单一物理服务器上创建多个虚拟机,每个虚拟机都能运行独立的操作系统和应用程序,从而提高资源... 点击进入详情页
本回答由今至电子科技有限公司提供
匿名用户
2016-02-26
展开全部
虚拟地址基本不同的,几乎任意的。而共享的物理地址是一样的。

linux内存地址分为虚拟地址和物理地址,用户层程序看到只是虚拟地址,每个进程都有自己的虚拟地址空间,一般linux下为0~3GB,不同的应用程序看到的都是一样,而且看不到其它的应用程序,好像系统就是自己一样,当时只是内核知道。内核通过页表联系虚拟地址和物理地址。两个程序可能虚拟地址不一样,但是对应的是同一个真实物理地址。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
year医海无边
2017-01-10 · TA获得超过1.5万个赞
知道小有建树答主
回答量:9169
采纳率:66%
帮助的人:1124万
展开全部
要让一个进程获取对一块共享内存的访问,这个进程必须先调用 shmat(SHared Memory Attach,绑定到共享内存)。
将 shmget 返回的共享内存标识符 SHMID 传递给这个函数作为第一个参数。
该函数的第二个参数是一个指针,指向希望用于映射该共享内存块的进程内存地址;
如果指定NULL则Linux会自动选择一个合适的地址用于映射。
第三个参数是一个标志位,包含了以下选项:
SHM_RND表示第二个参数指定的地址应被向下靠拢到内存页面大小的整数倍。
如果不指定这个标志,将不得不在调用shmat的时候手工将共享内存块的大小按页面大小对齐。
SHM_RDONLY表示这个内存块将仅允许读取操作而禁止写入。
如果这个函数调用成功则会返回绑定的共享内存块对应的地址。
通过 fork 函数创建的子进程同时继承这些共享内存块;
如果需要,它们可以主动脱离这些共享内存块。
当一个进程不再使用一个共享内存块的时候应通过调用 shmdt(Shared Memory Detach,脱离共享内存块)函数与该共享内存块脱离。
将由 shmat 函数返回的地址传递给这个函数。
如果当释放这个内存块的进程是最后一个使用该内存块的进程,则这个内存块将被删除。
对 exit 或任何exec族函数的调用都会自动使进程脱离共享内存块。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式