C RHEL6中线程的最大虚拟内存分配

C RHEL6中线程的最大虚拟内存分配,c,multithreading,memory,rhel6,C,Multithreading,Memory,Rhel6,由于RHEL6引入了一种新的arena分配器设计,因为对于单个线程,arena的数量增加了,这会导致更多的虚拟内存使用。 RHEL6为每个线程分配单独的内存块。根据我对32/64位系统的理解,每个线程的竞技场数量计算如下: On 32 Bit system : Number of Arena = 2 * Number of cores . On 64 Bit system : Number of Arena = 8 * Number of cores . 请验证我的理解是否有差距 我的机

由于RHEL6引入了一种新的arena分配器设计,因为对于单个线程,arena的数量增加了,这会导致更多的虚拟内存使用。 RHEL6为每个线程分配单独的内存块。根据我对32/64位系统的理解,每个线程的竞技场数量计算如下:

On 32 Bit system  : 
Number of Arena = 2 * Number of cores .
On 64 Bit system :
Number of Arena = 8 * Number of cores . 
请验证我的理解是否有差距

我的机器有4个内核和64位系统

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 69
Stepping:              1
CPU MHz:               759.000
BogoMIPS:              4589.41
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K
NUMA node0 CPU(s):     0-3
$ uname -a
Linux admin 3.13.0-71-generic #114-Ubuntu SMP Tue Dec 1 02:34:22 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
因此,每个线程有4*8=32个竞技场。每个竞技场的最大容量为64MB;pet线程虚拟内存可以达到32*64=2GB(每个线程)。 请让我知道我的理解是否正确

我创建了一个示例程序。它被分配了1.5 GB的堆内存

#include <pthread.h>
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <malloc.h>
#include <unistd.h>

static void *thread(void *arg)
{
  int i=0;
  char *x[1024];
  unsigned int pid;
  char str[15];
  char cmd[30]="cat /proc/";
  pid = getpid();
  sprintf(str, "%d", pid);
  strcat(cmd,str);
  strcat(cmd,"/status");
  system(cmd);
  for(i=0;i<1536;i++)
  {
    x[i] = malloc(1*1024*1024);
    printf("Memory Allocated %d:\n ",i);
    system(cmd);
  }
  for(i=0;i<1536;i++)
  {
    *x[i] = 5;
    free(x[i]);
  }
  return NULL;
}

int main(void)
{
   unsigned i;
   pthread_t t;
   pthread_create(&t, NULL, thread, NULL);
   pthread_join(t, NULL);
  return 0;
}
为什么会生成coredump?我上面的理解是不是计算线程最大虚拟内存不正确

另外,如果达到虚拟内存最大限制,会产生什么后果 请注意,我已将ulimit设置为无限

$ ulimit
unlimited

内存分配通常不特定于任何分发。通常,分配器就是实现。然而,线程可以分配的内存量应该是内核的函数,而不是分配器的函数。无法分配内存的一些原因可能包括耗尽物理内存、耗尽交换内存、ulimit、cgroup等

如果仍然怀疑分配器,可以尝试使用直接将内存映射到进程中

为什么会生成coredump

你有

  char *x[1024];
  …
  for(i=0;i<1536;i++)
  {
    x[i] = malloc(1*1024*1024);
char*x[1024];
…

对于(i=0;iHi Jason)谢谢您的回答。请仔细阅读Jason,我认为VM不依赖于分配器的设计是不正确的。通常,块内存分配是使用“分区池”执行的,它是静态或动态定义的,并配置为包含指定数量的具有指定固定大小的块。@SACHINGOYAL您不正确。即使使用线程Arena,当请求的块大小高于某个阈值时,分配器通常也会直接调用操作系统。此外,分配器将ot提出一个
SIGSEGV
信号。杰森,我说了关于SIGSEGV信号的什么吗?而且,我说的对你来说可能不是真的,但就分配器而言,它是真的。以上信息的来源就是这个链接。你有任何链接或证明你的理论吗?@SACHIN你的文章实际上已经足够好了。因为如果你仔细阅读它,你会发现它处理的是RT操作系统中的确定分配。不太适用于标准Linux。实时与普通应用程序的要求非常不同,你很少能从一个映射到另一个。
  char *x[1024];
  …
  for(i=0;i<1536;i++)
  {
    x[i] = malloc(1*1024*1024);