2012-11-13 2 views
5

저는 현재 메모리를 포함하여 저급 arduino에 대해 배우고 있습니다. 내 질문은 메모리의 반대편에서 힙과 스택이 커지기 때문에 메모리가 부족하다는 것입니다. 둘 다 어딘가에 있든간에 중 하나를 만나거나 중간에 한쪽이 맞을 때 발생합니다.Out of Memory 개념

+7

다른 방향으로 커지는 이유는 그것이 실제로 충돌 할 때까지는 괜찮습니다. –

답변

3
  • 의 아무 개념이 없다 "중간"
  • 가에 따라 방법을 기본 운영 체제와 같은 것은 플랫폼에있는 경우 (모든 전혀! 경우) (프로세스를 관리 !), 스택은 제한된 크기를 가질 수 있습니다. 기본 운영체제 (있는 경우)가 가상 메모리 공간을 관리하는 방식에 따라 "전체 메모리의 나머지 부분"보다 훨씬 작습니다 (
  • ) 플랫폼!), 힙은 제한된 크기, 훨씬 더 작은 t를 가질 수 있습니다. 한 "전체 메모리의 나머지 부분"

이러한 제한이있는 경우, 서로 만나는 영역이 매우 작습니다. 실제로, 아마도 그들은 아마도 단순히 공간이 부족할 것이고, 보호 메커니즘은 소프트웨어 예외의 관련 하드웨어를 발생시킬 것입니다.

이것은 '메모리 부족'이벤트가 한 가지가 아니라는 것을 의미합니다. 스택에는 OOM이 있고 힙에는 OOM이 있습니다. 내 세계에서 전통적으로 스택과 관련된 것은 StackOverflow라고하고, 힙과 관련된 것은 OutOf [Heap] Memory입니다.

플랫폼에 가상 메모리 개념이 있다면 스택은 여전히 ​​단 하나의 공백 블록이지만 힙은 아마도 드문 드문 구조 일 것이며 여러 흩어져있는 공간 블록으로 구성됩니다. 필연적으로 물리적으로 오름차순 또는 내림차순으로 정렬됩니다. 그런 경우 무엇이든 만나는 것에 관해 이야기하기가 어렵습니다. StackOverflow는 스택이 크기 제한에 도달하면 발생하고 메모리 관리자가 메모리 공간에서 적절한 여유 구멍을 찾을 수없는 경우 OutOfMemory가 발생합니다.

가상 메모리를 무시하고 '원시 하드웨어'에 대해서만 이야기하는 경우 스택이 실제로 어디에 있는지에 따라 다릅니다. IIRC (!), 일부 (실제로는 오래된) 플랫폼에서 스택은 실제 메모리의 시작 부분에 위치한 사전 정의 된 공간에 사전 할당되어 처음 10 페이지를 말하며 '맨 아래'로 성장했습니다. 그런 다음 몇 페이지의 하드웨어 매핑 테이블과 포트 상태 이미지가 있었고 나머지 테일은 힙이었습니다. 이러한 설정을 사용하면 스택 포인터가 ,에 도달하면 StackOverflow가 상승합니다. 프로세서의 상태 플래그로 제로를 검출하기가 쉽기 때문에 상당히 똑똑했습니다. 또한 오래된 프로세서의 경우 더 높은 주소보다 낮은 주소에 도달하는 것이 훨씬 쉬워서 자주 액세스하는 스택을 낮은 주소에 넣는 것이 큰 이점이었습니다 .

IIRC (!), 새로운 플랫폼은 이러한 문제 (일반적으로 NUMA와 비슷한 것을 무시하자)와 공간의 시작 부분에 특별한 영역 (테이블, 포트 맵 등)을 두는 기존의 '원시 하드웨어'설정, 그리고 Heap, free area ', 그리고 Stack, 그리고 StackOverflow는 free area가 없어 졌을 때, 즉 스택이 이미 heap에 의해 블록을 만날 때 발생합니다. StackOverflow는 여전히 OutOfMemory를 의미하지 않습니다. 스택이 오버플로되었을 수 있지만 힙에 간격이있을 수 있으며 여전히 많은 여유 공간이있을 수 있습니다.

'IIRC'는 중요합니다. 나는 Arduino와 현재의 프로세서 아키텍쳐에 대한 전문가가 아니며, 또한 '역사적인'blargh는 새로운 것/더 오래된 것의 관점에서 상당히 떨어져있을 수 있습니다. 나는 그것이 사실 일 확률이 80 %이다.

+0

은 실제적인 빛을 발산합니다. 감사 –

1

스택에는 특정 할당 크기가 있으며,이 크기를 초과하면 스택 버퍼 오버플로가 발생합니다.

소프트웨어에서 호출 스택에 에서 너무 많은 메모리를 사용하면 스택 오버플로가 발생합니다. 호출 스택에는 제한된 양의 메모리가 들어 있으며, 프로그램 시작시 종종 결정되는 입니다.

소스 Wikipedia