linux下共享内存允许的连接数有限制吗

linux下共享内存允许的连接数有限制吗,第1张

对于64位进程,同一进程可连接最多268435456个共享内存段;

对于32位进程,同一进程可连接最多11个共享内存段,除非使用扩展的shmat;

上述限制对于64位应用不会带来麻烦,因为可供连接的数量已经足够大了;但对于32位应用,却很容易带来意外的问题,因为最大的连接数量只有11个。

下面的例程test02.c演示了这个问题,为了精简代码,它反复连接的是同一个共享内存对象;实际上,无论所连接的共享内存对象是否相同,该限制制约的是连接次数:

#include <stdio.h>

#include <errno.h>

#include <sys/types.h>

#include <sys/ipc.h>

#include <sys/shm.h>

#define MAX_ATTACH_NUM 15

void main(int argc, char* argv[])

{

key_t mem_key

longmem_id

void* mem_addr[MAX_ATTACH_NUM]

int i

if ( ( mem_key = ftok("/tmp/mykeyfile", 1) ) == (key_t)(-1) ) {

printf("Failed to generate shared memory access key, ERRNO=%d\n",

errno)

goto MOD_EXIT

}

if ( ( mem_id = shmget(mem_key, 256, IPC_CREAT) ) == (-1) ) {

printf("Failed to obtain shared memory ID, ERRNO=%d\n", errno)

goto MOD_EXIT

}

for ( i=1i<=MAX_ATTACH_NUMi++ ) {

if ( ( mem_addr[i] = (void *)shmat(mem_id, 0, 0) ) == (void *)(-1) )

printf("Failed to attach shared memory, times [%02d], errno:%d\n", i,

errno)

else

printf("Successfully attached shared memory, times [%02d]\n", i)

}

MOD_EXIT:

shmctl(mem_id, IPC_RMID, NULL)

}

当然,Linux系统是有32位和64位之分的!它们之间有何不同:第一、设计初衷不同64位是为视频、绘画、高性能应用程序所设计开发的32位是为普通用户开发的。第二、配置要求不同 64位 *** 作系统只能安装在64位电脑上,32位 *** 作系统可以安装在64位电脑上。32位 *** 作系统安装在64位电脑上,其硬件恰似大车拉小车,这样64位硬件性能会大打折扣。第三、运算速度不同64位CPU的数据宽度为64位,64位指令集可以运行64位数据指令,也就是说处理器一次可提取64位数据。比32位提高了一倍,理论上性能会相应提升1倍。第四、寻址能力不同在Linux下32位系统不打开PAE的情况下,只能支持4G内存。32位系统最大只能支持3.2g左右内存,而64位系统支持高达128g的物理内存和多达16TB的虚拟内存。第五、软件普及不同64位软件相较32位软件少。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/8940936.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-23
下一篇 2023-04-23

发表评论

登录后才能评论

评论列表(0条)

保存