Why can I allocate only 2 GB on my computer with 16 GB of RAM?

Possible duplicate:
Can you allocate a very large single memory block (> 4 GB) in c or C ++?

I run the following program on my computer:

#include <stdio.h> #include <stdlib.h> #define ONE_GIGABYTE 1024*1024*1024 int main(void) { int ctr=0; for (;;) { char *ptr = (char*)malloc(ONE_GIGABYTE*sizeof(char)); if (ptr == 0) return -1; ctr++; printf("%d\n", ctr); } } flyrev@stargazer :~/weirdstuff$ ulimit -a core file size (blocks, -c) 0 data seg size (kbytes, -d) unlimited scheduling priority (-e) 0 file size (blocks, -f) unlimited pending signals (-i) 128957 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 1024 pipe size (512 bytes, -p) 8 POSIX message queues (bytes, -q) 819200 real-time priority (-r) 0 stack size (kbytes, -s) 8192 cpu time (seconds, -t) unlimited max user processes (-u) 128957 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited flyrev@stargazer :~/weirdstuff$ free -g total used free shared buffers cached Mem: 15 6 8 0 0 4 -/+ buffers/cache: 2 13 Swap: 9 0 9 flyrev@stargazer :~/weirdstuff$ clang malloc-program.c flyrev@stargazer :~/weirdstuff$ ./a.out 1 2 flyrev@stargazer :~/weirdstuff$ 

What's going on here?

+4
source share
2 answers

You do not have enough memory, you work on a 32-bit system and, thus, run out of address space, you can reasonably expect that you can allocate 4Gb on the 32nd system, because:

2^32 = 4Gb

However, on most operating systems, at least 50% of the available address space is actually reserved for use by the kernel, so you can only have half.

On Linux, you can use significantly more than 4 GB in 32-bit mode, switching to using the PAE kernel . Many Linux distributions provide the PAE kernel as a package if you need it.

EDIT : as Dietrich notes: PAE allows you to use more memory, but it only gives you 4 GB of address space. Thus, with 16 gigabytes you can have 8 programs with 2 gigabytes each, but you still cannot have one program with more than 2 ish bends

+4
source

@Benj gave a good answer to this question. However, I would like to add that even if you use a 64-bit system, it will still be able to use only 2 GB of memory if the program is compiled with a compiler that targets a 32-bit system.

A 64-bit system typically supports 32-bit programs. But a 32-bit system cannot run 64-bit. Therefore, programs that did not expect to capture 2 GB of memory can be compiled for the target 32-bit system if the author decided. In addition, a 32-bit target is usually standard, even on 64-bit systems.

+1
source

Source: https://habr.com/ru/post/1440968/


All Articles