출처 메모리 구조 (heap 영역과 stack 영역) (tistory.com)
메모리 구조 (heap 영역과 stack 영역)
프로그램이 실행되기 위해서는 먼저 프로그램이 메모리에 로드(load)되어야 합니다. 또한, 프로그램에서 사용되는 변수들을 저장할 메모리도 필요합니다. 따라서 컴퓨터의 운영체제는 프로그램
pro-jy.tistory.com
코드영역(텍스트영역)
프로그램의 코드가 저장된다
컴파일된 기계어가 들어간다.
CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리
프로그램이 시작하고 끝날떄 까지 메모리에 계속 남아있는다.(당연히 코드가 중간에 사라지면 실행을 못하겠죵)
데이터 영역
프로그램의 전역변수, 정적변수, 문자열 상수가 저장되는 영역
프로그램 시작과 함께 할당 종료되면 소멸(정적변수와 전역변수는 중간에 사라지면 안됨 프로그램 어느 부분에서든지 접근 할 수 있기 때문)
스택영역
함수의 호출과 관계되는 지역 변수와 매개변수가 저장
스택 영역의 크기는 컴파일 시에 결정(visual studio에서도 설정 가능)
스택 영역은 함수의 호출과 함께 할당되며, 함수의 호출이 완료되면 소멸
{함수가 가장 최근에 호출된 곳으로 다시 돌아가야하기때문에 LIFO임}
이렇게 스택 영역에 저장되는 함수의 호출 정보를 스택 프레임 이라고 함 ( [자료구조] 스택 프레임(Stack Frame) (velog.io)) 대충 함수의 총 크기라고 보면 되지 않을까...
스택 영역은 메모리의 높은 주소에서 낮은 주소의 방향으로 할당되는 특징
{처음에 이 크기가 컴파일 타임에 정해진다는걸 오해해서 정확한 크기를 그때 알 수가 있나? 라는 생각을 했었다 당연히 불가능 하다. 컴파일시간에 정해지는것은 스택의 최대 크기였다.}
장점
데이터의 액세스가 빠른 편
변수를 직접 할당 해제 할 필요가 없음
하나의 명령으로 메모리, 어드레스 조작이 가능
단점
스택의 크기에 제한이 있음 한계를 초과할 수 없음 (컴파일 전에 수정 가능)
변수의 크기를 조정 못함{순서대로 저장되기때문에 중간에 크기를 바꾸면 다른 변수의 영역을 침범하지 않을까?}
힙 영역
사용자가 직접 할당과 해제를 함
포인터에 주소를 넣어 사용
메모리의 낮은 주소에서 높은 주소로 할당
장점
프로그램에 필요한 개체의 개수나 크기를 미리 알 수 없는 경우에 사용
크기가 매우 큰곳에도 사용
단점
데이터 액세스가 상대적으로 느린 편이면 메모리를 관리해야함
할당 해제 작업으로 속도저하가 발생
힙 손상으로 인한 속도 저하 발생
(이중 해제, 해제 후 블록 사용, 블록 경계를 벗어나 덮어쓰기 등)
- 힙 경합으로 인해 속도 저하 발생
(두 개 이상의 쓰레드에서 동시에 데이터에 액세스 하려 하면 한쪽의 작업이 온료 되어야 접근이 가능함){이건 전역변수나 정적 변수에도 해당하지 않나?}
오버플로우
stack의 지역변수는 사용되고 소멸되기 때문에 데이터 용량의 불확실성을 가짐 하지만 힙은 위부터 할당되기 때문에 주소가 겹치게 되면 오버플로우가 발생 할 수 있다.
{근데 스택 영역은 맨 위부터 써지는게 맞을거 같은데 힙영역은 맨 아래부터 할당하는게 어려워 보임 지금은 메모리 크기가 커서 발생하는 경우가 매우 적을것 같음}
[C] Q: 스택의 사이즈는 왜이렇게 작나요?
https://stackoverflow.com/questions/10482974/why-is-stack-memory-size-so-limited Q: When you allocate memory on the heap, the only limit is free RAM (or virtual memory). 힙에 메모리를 할당할 때는 램이나 가상메모리의 크기 내에서는
insalat.tistory.com
이건 힙버퍼오버플로우 또 다름
Heap Overflow
[정의] 힙 데이터 영역에서 발생하는 버퍼 오버플로의 한 종류로, 동적 메모리 할당 연결(malloc 메타 데이터 같은)을 겹쳐쓰고 프로그램 함수 포인터를 겹쳐쓰기 위해 결과로 나온 포인터를 교환
tino1999.naansdream.com