개인적으로 공부하려고 정리한 메모리 구조, heap과 stack

1. 프로그램 실행 순서

  1. 유저가 프로그램 실행 요청
  2. 운영체제(OS)가 프로그램의 정보를 읽고 보조기억장치에 저장한다.
  3. 주기억장치(RAM)는 입력장치에서 입력받은 데이터 또는 보조기억장치에 저장된 프로그램을 읽어온다.
  4. 중앙처리장치(CPU)는 프로그램을 실행하기 위해 주기억장치(RAM)에 저장된 프로그램 명령어와 데이터를 읽어와서 처리하고, 결과를 다시 주기억장치에 저장한다.
  5. 주기억장치(RAM)는 처리 결과를 보조기억장치에 저장하거나 출력장치로 내보낸다.

2. 메모리 구조

  • 프로그램이 실행되기 위해서는 운영체제(OS)가 프로그램의 정보를 메모리에 로드 해야 한다. 또한 프로그램이 실행되는 동안 CPU가 코드를 처리하기 위해서는 메모리가 명령어와 데이터들을 저장해야 한다
    • 프로그램을 실행하면 운영체제는 해당 프로그램을 위해 메모리 공간을 할당해준다.
  • 메모리 구조는 크게 code, data, heap, stack 영역으로 나뉜다.
  • RAM(메인 메모리)에 할당되며, 프로그램 실행 시 필요한 메모리 공간을 지정하기 위해서 할당된다.

4. Code 영역

  • 실행할 프로그램의 코드가 저장되는 영역이다. (텍스트 영역이라고도 함)
  • 중앙처리장치(CPU)는 code 영역에 저장된 명령을 하나씩 가져가서 처리한다.
  • 프로그램이 시작하고 종료될 때 까지 메모리에 계속 남아있는다.

3. Data 영역

  • 프로그램의 전역 변수정적(static)변수가 저장되는 영역이다.
  • 프로그램 시작과 함께 할당되며, 프로그램이 종료되면 소멸한다.

4. Heap 영역

  • 사용자가 직접 공간을 할당, 해제하는 메모리 공간이다.

  • 사용자에 의해 메모리 공간이 동적으로 할당되고 해제된다. (동적 메모리 할당)
    - malloc(), new 메모리를 할당하고, free() 또는 delete 연산자를 통해 메모리를 해제한다.

  • 선입선출(FIFO, First-In First-Out) 방식
    : 가장 먼저 들어온 데이터가 가장 먼저 나간다.
    => 메모리의 낮은 주소에서 높은 주소의 방향으로 할당되기 때문이다.
    => 위(낮은 주소)에서 아래(높은 주소) 방향으로 데이터가 쌓인다.

  • 가비지 컬렉터를 이용해 사용하지 않는(=참조되지 않는) 메모리를 해제시킨다.
  • 장점
    • 메모리 크기에 제한이 없다.
    • 변수에 전역적으로 액세스 할 수 있다.
  • 단점
    • 액세스(할당,해제)가 상대적으로 느리다.
    • 메모리를 관리해야 한다.
      => 사용자가 직접 공간을 할당하고 해제하는 메모리 공간이기 때문에 직접적인 책임이 있다.
      => 메모리 공간을 효율적으로 관리하지 못하면 메모리 블럭이 할당된 후 시간이 지남에 따라 메모리가 조각화되어 해체 될 수 있다.
    • 운영체제마다 메모리 관리가 달라서 구현이 어렵다.

5. Stack 영역

  • 프로그램이 자동으로 사용하는 임시 메모리 영역.
  • 함수 호출 시 생성되는 지역변수매개변수가 저장되는 영역이다. (정적 메모리 할당)
    ※ stack에 저장되는 함수의 호출 정보를 stack frame 이라고 한다.
  • stack 영역은 함수의 호출과 동시에 할당되며, 함수의 호출이 완료되면(해당 객체가 정의된 블록을 벗어날 때) 소멸된다.
  • 데이터 관리
    • push - 데이터 저장
    • pop - 데이터 인출
  • 후입선출(LIFO, Last-In First-Out) 방식
    : 가장 나중에 들어온 데이터가 가장 먼저 나간다.
    => 메모리의 높은 주소에서 낮은 주소의 방향으로 할당되기 때문이다.
    => 아래(높은주소)에서 위(낮은주소) 방향으로 데이터가 쌓인다
  • 장점
    • 액세스(할당, 해제)가 매우 빠르다.
    • 변수를 명시적으로 할당, 해제 할 필요가 없다.
    • 운영체제별로 구현 난이도가 비슷하다.
    • 공간은 CPU에 의해 효율적으로 관리된다.
  • 단점
    • 메모리 크기에 제한이 있다. (운영체제별로 다름)
    • 지역 변수만 해당된다.
    • 변수의 크기를 조정할 수 없다.
profile
모든 과정을 기록하며 꾸준히 성장하고 실수를 반복하지 말자 !

0개의 댓글