对于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位软件少。欢迎分享,转载请注明来源:内存溢出
评论列表(0条)