스택 스레드가 생성 될 때마다 나사 고정 스택을 가지며, 일반적
크기. ulimit -a
을 실행하여 시스템의 기본 스택 크기를 확인하십시오. 내 시스템에서는 8 MiB입니다. 새 스레드를 만들 때 더 작거나 큰 스택을 제공 할 수 있습니다 (pthread_attr_setstacksize
참조).
스택이 8 MiB 이상으로 커지면 프로그램은 잘못된 메모리 위치에 쓰고 충돌합니다. 커널은 스택 옆의 메모리 위치가 모두 유효하지 않도록하여 스택 오버플로시 프로그램이 중단되도록합니다.
당신은 고정 된 크기가 낭비라고 생각 할 수 있지만, 8 MIB는 가상 메모리하지 물리적 메모리입니다. 차이점은 중요합니다 (아래 참조). UNIX 시스템
MALLOC
는 메모리 할당은 두 개의 층을 갖는다. 사용자 공간 계층은 malloc
(및 calloc
, realloc
, free
)입니다.이것은 C 라이브러리의 일부이며, 여러분의 코드로 대체 될 수 있습니다 - Firefox는 이것을 수행하며, 많은 프로그래밍 언어는 malloc
이 아닌 자신의 할당 체계를 사용합니다. 다양한 malloc
구현은 크로스 플랫폼입니다.
하위 계층은 mmap
(및 sbrk
)입니다. mmap
함수는 프로그램의 주소 공간을 변경하는 시스템 호출입니다. 그것이 할 수있는 일 중 하나는 프로그램의 메모리에 새로운 익명의 개인 페이지를 추가하는 것입니다.
malloc
의 목적은 mmap
(또는 sbrk
)을 사용하여 커널에서 많은 양의 가상 메모리를 가져 와서 효율적으로 프로그램에 맞게 나누는 것입니다. mmap
시스템 호출은 4 KiB (대부분의 시스템에서)의 배수에서만 작동합니다.
메모리 : 실제
대 가상은 mmap
에 의해 반환 된 메모리의 스택과 모든 단지 가상 메모리, 물리적 인 RAM 것을 기억하십시오. 커널은 실제 RAM을 사용할 때까지 실제 RAM을 프로세스에 할당하지 않습니다.
커널에서 익명 메모리를 얻으면 힙이나 스택에서 0으로 채워집니다. 그러나 수십 페이지의 물리적 RAM을 사전에 0으로 채우지 않고 커널은 모든 가상 메모리를 물리적 RAM의 단일 페이지로 공유합니다. 가상 메모리는 읽기 전용으로 표시됩니다. 쓰기 만하면 CPU가 예외를 던지고 커널에 제어권을 넘겨주고 커널은 프로그램에 대해 쓰기 쉽고 0 인 새로운 페이지를 할당합니다.
이는 이유를 설명 :
calloc
보다 빠른 malloc
+ memset
(calloc
는 mmap
'D 페이지를 미리 제로화 것을 알고 있으며, memset
물리적 RAM의 할당 강제 때문에)
- 당신은 할 수 있습니다 RAM + 스왑 결합보다 훨씬 많은 메모리를 할당하십시오. (쓰기 전까지는 사용되지 않기 때문에)
답장을 보내 주셔서 대단히 감사합니다. 또한 malloc이 스왑 공간에 공간을 할당한다고 말하는 OS 책을 읽으므로 다른 방식으로 질문을했습니다. – mousey
"malloc"은 물리적 메모리를 프로세스에 매핑하지 않고 malloc이 반환 한 메모리에 커널이 쓰기 만하면 커널이 처리합니다. 직접 실험 해 볼 수 있습니다. 수백 메가의 malloc을 사용하더라도 실제 RAM의 사용량은 증가하지 않습니다. –
@Dietrich 그래서 내 가상 주소로 매핑해야합니까? 다른 현명한 프로그램은 효과가 없습니다! – mousey