2021-10-03-[CS 메모리]-힙 vs 스택 메모리

CS ??

한동한 세상 돌아가는 일에서 멀어진거 같다는 생각이 들었다. CS CS 뭐 이러길래 CS가 뭐냐고 물었더니
CS (Computer Science)라고 한다고 한다. 그래서 검색을 해봤더니 컴공에서 배우는 커리큘럼이라고 한다는데.. 다들 그렇게 쓰는데, 나만 모른다면 안되자나.

암튼 프로그래머스로 뭔가 검증을 받을 일이 있었는데, 현타가 왔다. 툴에대한 이질감도 좀 들었고, 검색제한과 어시스턴스의 기능이 빠진곳에서의 현실자각이라고 할까...
앞으로 열흘간 기본부터 다시 한번 다지는 시간을 가져보려고 한다.

스택 VS 힙

운영체제로부터 할당받는 메모리 공간

  1. 코드영역
  2. 데이터 영역
  3. 힙 영역
  4. 스택 영역

메모리

주소 메모리
~ 스택 영역 컴파일타임 - 함수 호출과 관계되는 지역변수와 매개변수가 저장. 함수의 호출시 할당. 완료시 소멸
힙 영역 런타임 - 동적 할당(malloc)
데이터 영역 전역/정적 변수, 문자열 상수 저장
0 코드 실행할 프로그램 코드(어셈블리)

스택

스택 영역은 메모리의 높은 주소에서 낮은 주소로 할당됨.
스택영역에 저장되는 함수의 호출 정보를 스택 프레임(stack frame)이라고 함

장점

  1. 데이터 액세스가 빠른편이고, 변수를 명시적으로 할당/해제할 필요가 없다.
  2. 하나의 명령으로 메모리 조작/주소 조작이 가능하다.

    단점

  3. OS에 따라 스택 크기 제한이 있다.
  4. 변수의 크기를 조정할 수 없다.

힙 영역은 메모리의 낮은 주소에서 높은 주소로 할당됨.
사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다.

장점

  1. 메모리 크기에 제한이 없다.
  2. 필요한 크기를 미리 알 수 없는 경우에 사용이 가능하다.

단점

  1. 데이터 액세스가 느린편이고, 메모리 관리를 해야 한다.
  2. 힙 손상 가능성
    • 이중 해제, 해제 후 사용 등
  3. 힙 경합으로 인한 속도 저하
    • 두 개 이상의 쓰레드에서 동시에 데이터 액세스 경합이 발생할 경우

스택 오버플로우

스택은 지역변수를 사용하고 소멸하기 때문에, 스택과 힙이 충돌하는 오버플로우 발생 가능성