永发信息网

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

答案:4  悬赏:30  手机版
解决时间 2021-02-05 09:09
linux 共享内存 地址是唯一的吗
最佳答案
要让一个进程获取对一块共享内存的访问,这个进程必须先调用 shmat(SHared Memory Attach,绑定到共享内存)。
将 shmget 返回的共享内存标识符 SHMID 传递给这个函数作为第一个参数。
该函数的第二个参数是一个指针,指向希望用于映射该共享内存块的进程内存地址;
如果指定NULL则Linux会自动选择一个合适的地址用于映射。
第三个参数是一个标志位,包含了以下选项:
SHM_RND表示第二个参数指定的地址应被向下靠拢到内存页面大小的整数倍。
如果不指定这个标志,将不得不在调用shmat的时候手工将共享内存块的大小按页面大小对齐。
SHM_RDONLY表示这个内存块将仅允许读取操作而禁止写入。
如果这个函数调用成功则会返回绑定的共享内存块对应的地址。
通过 fork 函数创建的子进程同时继承这些共享内存块;
如果需要,它们可以主动脱离这些共享内存块。
当一个进程不再使用一个共享内存块的时候应通过调用 shmdt(Shared Memory Detach,脱离共享内存块)函数与该共享内存块脱离。
将由 shmat 函数返回的地址传递给这个函数。
如果当释放这个内存块的进程是最后一个使用该内存块的进程,则这个内存块将被删除。
对 exit 或任何exec族函数的调用都会自动使进程脱离共享内存块。
全部回答
所谓共享内存就是使得多个进程可以访问同一块内存空间,是最快的可用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 ,它支持配置更大的内存页面尺寸。
是的,是共享内存
虚拟地址基本不同的,几乎任意的。而共享的物理地址是一样的。 linux内存地址分为虚拟地址和物理地址,用户层程序看到只是虚拟地址,每个进程都有自己的虚拟地址空间,一般linux下为0~3GB,不同的应用程序看到的都是一样,而且看不到其它的应用程序,好像系统就是自己一样,当时只是内核知道。内核通过页表联系虚拟地址和物理地址。两个程序可能虚拟地址不一样,但是对应的是同一个真实物理地址。
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
胡蝶美容美发怎么去啊,我要去那办事
苏州市昆山市玉峰实验学校地址在什么地方,想
南京市江浦实验小学地址有知道的么?有点事想
苏州市相城经济开发区澄阳小学怎么去啊,我要
金博尔家具怎么去啊,我要去那办事
丹尼斯美容美发设计中心地址好找么,我有些事
五华楼地址在什么地方,想过去办事
杨家大院地址有知道的么?有点事想过去
苏州市吴中实验小学地址好找么,我有些事要过
黄独的意思是什么啊?知道的请说下!
有闲着没事找事的人吗
广汽本田锦伦店信宜分店地址在哪,我要去那里
玉皇阁地址在什么地方,想过去办事
大理天龙八部影视城地址在什么地方,我要处理
苏州狮山实验小学地址在哪,我要去那里办事
推荐资讯
百世快运物流(迎宾大道与金山路交叉口西北150
我最近在淘宝说358买了一个ck的钱包 亲们帮我
三相四线电表30x40(100)a代表什么,电表
干豆腐皮怎么泡软
农四师七十一团中心幼儿园地址在什么地方,我
报刊亭(书院路与人民路十字南路西)怎么去啊,
有一个两位数,其十位上的数字比个位上的数字
今天手贱把手机的菜单键给删掉了、、怎么能恢
毛戈平学校毕业的学生一般都是从事什么了呢?
贵夫人婚纱摄影地址在什么地方,想过去办事
PLC PVD CVD coating分别指什么?
去俄罗斯办签证需要提供行程单么
正方形一边上任一点到这个正方形两条对角线的
阴历怎么看 ?