메모리에 관하여...
https://velog.io/@hidaehyunlee/메모리-구조를-알아보자
https://blog.naver.com/wjdwoaud159/221449593833
메모리는 (저영역) 코드 -> 데이터 -> 힙 -> <- 스택 (고영역) 순이다.
코드 : 코드. 프로그램이 시작하고 끝날 때까지 메모리에 계속 남아있는다.
데이터 : 전역 변수, 정적 변수, 문자열 상수. 프로그램이 시작하고 끝날 때까지 메모리에 계속 남아있는다.
힙 : 동적할당을 이용해 사용자가 직접 할당하는 영역. 메모리의 낮은 주소에서 높은 주소의 방향으로 할당된다. 속도가 느리다.
스택 : 지역변수, 매개변수. 함수의 호출과 함께 할당되며 함수의 호출이 완료되면 소멸한다. 메모리의 높은 주소에서 낮은 주소의 방향으로 할당된다.
스택의 지역변수는 모두 뭉쳐져서 할당된다. 그러므로 가장 첫 포인터와 가장 마지막 포인터만 안다면 접근할 수 있다.
Stack 영역이 클 수록 Heap 영역이 작아지고 Heap 영역이 클 수록 Stack 영역이 작아진다.
스택은 이미 할당 되어있는 공간을 사용하는 것이고 힙은 사용자가 따로 할당해서 사용하는 공간이다. 다만 스택은 공간이 매우 적기 때문에 모든 응용에서 스택을 사용할 수 는 없다.
스택에서 할당의 의미는 이미 생성되어 있는 스택에 대해 포인터의 위치만 바꿔주는 단순한 CPU Instruction(덧셈과 뺄셈 연산, 일반적으로 단일 Instruction)이다.
반면 힙에서의 할당은 요청된 chunk의 크기, 현재 메모리의 fragmentation 상황 등 다양한 요소를 고려하기 때무에 더 많은 CPU Instruction이 필요하다.
Heap overflow
Heap이 위에서부터 주소값을 채워져 내려오다가 Stack영역을 침범하는 경우.
Stack overflow
Stack영역이 Heap을 침범하는 경우.
'기타 개발 공부' 카테고리의 다른 글
[UNIX, C] 미니 쉘 만들기 (1) - 세미콜론 처리 구현하기 (연결리스트 사용) (0) | 2020.10.21 |
---|