可用下面代码测试系统能给单进程分配多少用户态内存:

1 #include
2 #include
3
4 int main(){
5   int MB = 0;
6   while(malloc(1 << 20)) ++MB;
7   printf("Allocated %d MB total.n", MB);
8 }

  这段代码在32位系统上执行,返回3066M;在64位系统上执行,系统最后会变得负载很高,然后内核就把进程kill了。这说明32位系统上单进程是有内存分配限制的,而64位则没有。

  编译32位linux内核时,打开linux内核的PAE寻址支持,最大支持的内存可以从32位提高到36位(4G->64G),而单进程能分配的内存却仍然有4G限制。即:对于每个进程,用户态最多分配3G内存,核心态最多分配1G内存。

  那么能不能通过调整内核参数的办法动态调整,使得32位linux内核支持单进程分配大于4G内存呢?这是个有现实意义的问题。Squid,Mysql,Java等都是单进程应用。而现在的主流服务器,很多都可以可以配置非常高的内存。例如Dell 6850,HP580都能插16G内存,我见过的一款Sun的服务器甚至支持48G内存。这些大内存机器如果跑单进程应用,那么内存就全浪费了。

  我查了一些资料,结论是,32位BSD可以动态调整内核参数以支持单进程分配大内存,

  32位linux系统是无法解决单进程4G内存限制的。

  下面是摘自High Memory in the Linux Kernel里面的一段话:

  This is enabled via the PAE (Physical Address Extension) extension of the PentiumPro processors. PAE addresses the 4 GB physical memory limitation and is seen as Intel's answer to AMD 64-bit and AMD x86-64. PAE allows processors to access physical memory up to 64 GB (36 bits of address bus). However, since the virtual address space is just 32 bits wide, each process can't grow beyond 4 GB.