Linux   发布时间:2022-04-01  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了Linux在x86_64上共享内存分配大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

概述

我有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和amp;中更改了默认共享内存限制,如下所示.在内存中加载已更改的文件为sysctl -p kernel.shmmni = 81474836 kerne
我有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和amp;中更改了认共享内存限制,如下所示.在内存中加载已更改的文件为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;
}

问候
人士Himanshu

解决方法

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

通常情况下,你不能在这里尝试分配非常大的内存块.函数调用的含义是“为我分配10737418240字节的连续内存块”.通常情况下,即使整个系统内存理论上可以满足这种需求,隐含的“连续内存块”也会强制可分配内存的限制要低得多.

内存中的程序结构,加载的程序数量都有助于阻止某些内存区域,并且不允许有10个连续的千兆字节内存可分配.

我经常发现重启会改变它(当程序加载到堆上的不同位置时).您可以使用以下内容尝试最大可分配块大小:

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时发现了这一点.

大佬总结

以上是大佬教程为你收集整理的Linux在x86_64上共享内存分配全部内容,希望文章能够帮你解决Linux在x86_64上共享内存分配所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。