gpt4 book ai didi

x86_64 上的 Linux 共享内存分配

转载 作者:IT王子 更新时间:2023-10-29 00:58:13 25 4
gpt4 key购买 nike

我有 64 位 REHL linux,
Linux ipms-sol1 2.6.32-71.el6.x86_64 #1 SMP x86_64 x86_64 x86_64 GNU/Linux

RAM 大小 = ~38GB

我在/etc/sysctl.conf 中更改了默认共享内存限制,并将更改后的文件加载到内存中作为 sysctl -p

kernel.shmmni=81474836
kernel.shmmax=32212254720
kernel.shmall=7864320

仅出于实验基础,我已将 shmmax 大小更改为 32GB,并尝试使用 shmget() 在代码中分配 10GB,如下所示,但单次无法获得 10GB 的共享内存,但是当我将对共享空间的需求减少到8GB 它成功了关于我可能哪里出错的任何线索?

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>

#define SHMSZ 10737418240

main()
{
char c;
int shmspaceid;
key_t key;
char *shm, *s;
struct shmid_ds shmid;

key = 5678;
fprintf(stderr,"Changed code\n");

if ((shmspaceid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
fprintf(stderr,"ERROR memory allocation failed\n");
return 1;
}


shmctl(shmspaceid, IPC_RMID, &shmid);
return 0;
}

问候喜满树

最佳答案

我不确定这个解决方案是否也适用于共享内存,但我从正常的 malloc() 调用中知道这种现象。

当您在这里尝试分配非常大的内存块时,这是很常见的。函数调用的意思是“给我分配一 block 10737418240字节的连续内存”。通常,即使总系统内存在理论上可以满足此需求,隐含的“连续内存块”也会迫使可分配内存的限制低得多。

内存中的程序结构、加载的程序数量都可能导致阻塞某些内存区域,并且不允许连续 10 GB 的内存可分配。

我经常发现重启会改变这一点(因为程序被加载到堆上的不同位置)。你可以用这样的东西来尝试你的最大可分配 block 大小:

int i=1024;
int error=0;
while(!error) {
char *a=(char*)malloc(i);
error=(a==null);
if(!error)
printf("Successfully allocated %i.\n", i);
i*=2;
}

希望这有助于或适用于此。我在检查为什么无法为 JVM 分配接近最大系统内存时发现了这一点。

关于x86_64 上的 Linux 共享内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7793800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com