首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于x86_64的Linux共享内存分配

问基于x86_64的Linux共享内存分配
EN

Stack Overflow用户
提问于 2011-10-17 20:34:09
回答 3查看 6K关注 0票数 6

我有64位的REHL linux,

Linux ipms-sol1 2.6.32-71.el6.x86_64 #1 SMP x86_64 GNU/Linux

内存大小=约38 RAM

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

kernel.shmmni=81474836

kernel.shmmax=32212254720

kernel.shmall=7864320

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

代码语言:javascript
复制
#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;
}

问候喜满树

EN

回答 3

Stack Overflow用户

发布于 2011-10-17 21:31:01

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

在这里尝试时,通常不能分配非常大的内存块。函数调用的意思是“为我分配一个10737418240字节的连续内存块”。通常情况下,即使整个系统内存理论上可以满足这一需求,隐含的“一块连续内存”也会迫使可分配内存的限制大大降低。

内存中的程序结构,加载的程序的数量都会阻塞内存的某些区域,并且不允许有10 of的内存可分配。

我经常发现重启会改变这一点(当程序加载到堆上的不同位置时)。你可以尝试你的最大可分配块大小,如下所示:

代码语言:javascript
复制
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分配接近最大系统内存时发现了这一点。

票数 1
EN

Stack Overflow用户

发布于 2013-07-04 09:29:20

胡说八道:没有足够的交换空间。默认情况下,共享内存需要在交换空间中保留空间。您可以使用SHM_NORESERVE禁用此行为

http://linux.die.net/man/2/shmget

SHM_NORESERVE (从Linux2.6.15开始)此标志与mmap(2) MAP_NORESERVE标志的用途相同。不要为此网段保留交换空间。当交换空间被保留时,可以保证可以修改段。当交换空间未保留时,如果没有可用的物理内存,则可能会在写入时获得SIGSEGV。另请参阅proc(5)中对文件/proc/sys/vm/overcommit_memory的讨论。

票数 1
EN

Stack Overflow用户

发布于 2011-12-08 10:05:13

我只是在看这个,我建议打印出问题的确切errno值和描述,而不是仅仅指出它失败了。例如:

代码语言:javascript
复制
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <errno.h>
#include <string.h>

//#define SHMSZ 10737418240
#define SHMSZ 8589934592

int main()
{
    int shmspaceid;
    key_t key = 5678;
    struct shmid_ds shmid;

    if ((shmspaceid = shmget(key, SHMSZ, IPC_CREAT | 0666)) < 0) {
        fprintf(stderr,"ERROR with shmget (%d: %s)\n", (int)(errno), strerror(errno));
        return 1;
    }

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

我试图在我的16 GB系统上用8 GB的块和8 GB的smhmax和shmall重现你的问题,但我做不到。它工作得很好。我建议使用ipcs -m查找其他共享块,这些共享块可能会阻止您的10 GB分配得到遵守。并且一定要仔细查看shmget()通过errno返回的确切错误代码。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7793800

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档