C RHEL6中线程的最大虚拟内存分配
由于RHEL6引入了一种新的arena分配器设计,因为对于单个线程,arena的数量增加了,这会导致更多的虚拟内存使用。 RHEL6为每个线程分配单独的内存块。根据我对32/64位系统的理解,每个线程的竞技场数量计算如下: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 . 请验证我的理解是否有差距 我的机
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);