스택과 히프가 충돌할 때 발생하는 동작
스택과 힙이 충돌하면 어떻게 되는지 궁금해요.이 상황을 경험한 사람이 있다면 시나리오를 설명해 주세요.
최신 OS에서 실행되는 최신 언어에서는 스택 오버플로(만세) 또는malloc()
또는sbrk()
또는mmap()
힙을 키우려고 하면 실패합니다.그러나 모든 소프트웨어가 최신인 것은 아니기 때문에 장애 모드를 살펴보겠습니다.
스택이 힙으로 성장하면 일반적으로 C 컴파일러는 힙의 데이터 구조를 덮어쓰기 시작합니다.최신 OS에서는 스택의 무한 확장을 막는 가상 메모리 가드 페이지가 1개 이상 존재합니다.가드 페이지의 메모리 용량이 적어도 증가 프로시저의 액티베이션레코드 크기만큼 큰 경우 OS는 세그먼트 폴트를 보증합니다.MMU가 없는 머신에서 DOS를 실행하고 있다면 아마 Hoose일 것입니다.
힙이 스택으로 확장되면 운영체제는 항상 상황을 인식하고 있어야 하며, 어떤 종류의 시스템콜이 실패합니다.의 실장
malloc()
실패와 복귀를 거의 확실히 깨닫다NULL
그 후의 일은 당신에게 달려 있습니다.
OS가 스택 오버플로를 방지하기 위해 가드 페이지를 배치하기를 바라는 컴파일러 라이터들의 의지에 항상 놀라고 있습니다.물론 이 수법은 수천 개의 스레드를 가지기 시작할 때까지 효과가 있습니다.각 스레드에는 스택이 있습니다.
메모리 부족 예외 또는 스택 예외는 운이 좋으면 발생합니다.운이 나쁘면, 프로그램은 무효 메모리로 이행해, 불량 메모리 예외를 발생시킵니다.만약 당신이 극도로 운이 나쁘다면, 그 프로그램은 계속 진행되어서는 안 될 것을 파괴하고, 당신은 당신의 프로그램이 왜 실패했는지 알 수 없다.
마지막으로 우주가 갈라질지도 모른다.
플랫폼에 의존합니다.많은 플랫폼에서는 실제로 이러한 현상이 전혀 발생하지 않습니다(히프와 스택은 서로 다른 페이지에 할당되어 있기 때문에 두 사람이 만날 필요가 없습니다).
힙은 위로, 스택은 아래로 각각 확장한다는 개념은 개념에 불과하다는 점에 유의하십시오.초소형 시스템(CP/M을 실행한 구형 8비트 마이크로 등) 및 일부 PIC 및 기타 플랫 메모리 모델 시스템(MMU 또는 기타 가상 메모리 또는 보호 메모리 지원이 없는 시스템)에서는 힙과 스택이 실제로 이와 같이 구현될 수 있습니다.이 경우 동작은 정의되어 있지 않습니다.다만, 코드가 파손된 스택의 상부에 있는 주소로 되돌아가거나, 히프의 한 부분에서 다른 부분으로 간접 포인터를 따라가려고 하면, 거의 즉시 크래시 됩니다.
어떤 경우에도 최신 범용 워크스테이션이나 서버에서는 볼 수 없습니다.자원 제한에 도달하여 malloc 장애가 발생하거나 가상 메모리가 부족하여 시스템이 "빨간색 스위치"로 흔들리는 더미로 변하게 됩니다.
스택 오버플로 오류가 발생합니다.그렇지 않으면 malloc()와 같은 새로운 힙 메모리 할당 함수가 실패합니다.
스택/히프 오버플로가 발생하면 분할 장애 또는 메모리 할당 오류가 발생합니다.다음은 예를 제시하겠습니다.
void recursiveFun ()
{
static int i;
// char *str= (char *)malloc (100);
printf ("%d\t", i++);
recursiveFun ();
// free (str);
}
위의 함수를 호출하면 스택이 부족해지고 프로그램이 크래시된다고 가정합니다.코멘트된 회선을 삭제하고 함수를 다시 호출하면 이전 버전보다 짧은 시간 내에 분할 장애가 발생하고 재귀가 적다는 것을 알 수 있습니다.[테스트 환경에서 스택 오버플로는 첫 번째 케이스에서는 5237765 재귀 후에 발생했지만 두 번째 시나리오에서는 2616325 재귀 후에 발생하였습니다.]
이런 때일수록 에곤 스펜글러 박사의 현명한 말을 들어야 할 때입니다.
- 에곤 스펜글러 박사:당신에게 말하는 것을 잊은 아주 중요한 것이 있어요.
- 피터 벤크만 박사:뭐라고?
- 에곤 스펜글러 박사:힙이 스택과 충돌하지 않도록 하십시오.
- 피터 벤크만 박사: 왜요?
- 에곤 스펜글러 박사:나쁠 것 같아.
- 피터 벤크만 박사:좋은 것과 나쁜 것에 대해 잘 모르겠어요."나쁘다"니 무슨 말이야?
- 에곤 스펜글러 박사:여러분이 알고 있는 모든 생명체가 순간적으로 멈추고 몸 안의 모든 분자가 빛의 속도로 폭발한다고 상상해 보세요.
- Ray Stantz 박사:완전 프로톤 반전!
- 피터 벤크만 박사:큰일 났다.좋아, 중요한 안전 요령이야고마워, 에곤
언급URL : https://stackoverflow.com/questions/1334055/what-happens-when-stack-and-heap-collide
'IT이야기' 카테고리의 다른 글
vue js의 img의 :src에 동적으로 바인드하는 방법 (0) | 2022.06.01 |
---|---|
Vuex 업데이트 후 하위 구성 요소에서 소품을 강제로 업데이트합니다. (0) | 2022.05.31 |
VeValidate(vue.js) 이미지 파일 크기 및 치수 검증 (0) | 2022.05.31 |
Vue.js - 도우미 기능을 단일 파일 컴포넌트로 글로벌하게 이용 가능 (0) | 2022.05.31 |
C에서 부울 데이터형을 사용하는 방법 (0) | 2022.05.31 |