메모리 구조를 간단하게 정리해보자

Yang Si Yeon·2021년 6월 14일
0

학부생 때 공부했던 내용을 다 까먹었다... 다시 잘 정리하고 머리 속에 집어 넣어보자.

0. RAM과 ROM

RAM (Random access memory)

  • 자유롭게 내용을 읽고 쓰고 지울 수 있는 기억 장치
  • 현재 사용 중인 프로그램이나 데이터가 저장되어 있음
  • 전원이 차단되면 내용이 지워지는 휘발성 기억 장치
  • 일반적으로 주기억장치 또는 메모리 라고 불림 (해당 글에서 설명하는 메모리는 RAM을 가리킴)

ROM (Read-only Memory)

  • 첫 내용 작성에 특수 기기가 필요하고, 삭제나 수정이 불가능한 기억 장치
  • 전원이 차단되어도 내용이 지워지지 않는 비휘발성 기억 장치
  • ROM은 주기억장치보다는 변경 가능성이 없는 시스템 소프트웨어를 기억시키는데 이용.
    ex) 기본 입출력 시스템, 자가 진단 시스템

1. 메모리 구조

프로그램이 실행되는 과정은 다음과 같다.

  1. 사용자가 프로그램 실행을 요청
  2. 프로그램의 정보를 읽어 메모리에 로드(load)
  3. 프로그램이 실행되면 운영체제는 메모리(RAM)에 공간을 할당
  4. cpu가 기계어 코드를 실행

위 3번 과정에서 프로그램이 운영체제로부터 할당 받는 메모리는 다음과 같이 4가지로 나뉘어져 있다.

1. Code

  • 개발자가 작성한 소스 코드가 기계어 형태로 저장되는 공간
    즉, 실행할 프로그램의 코드가 Code 영역에 저장된다.

  • CPU는 코드 영역에 저장된 명령어를 하나씩 가져가서 처리한다.

  • Text 공간이라고도 불린다.

2. Data

  • 초기화된 전역 변수와 정적(static) 변수가 저장되는 공간

  • 프로그램 시작과 동시에 할당되고, 프로그램이 종료되면 해제된다.

3. Heap

  • 개발자가 직접 할당/해제 하는 공간
    malloc, new 등을 통해 동적으로 할당되는 변수들이 여기에 저장된다.

  • 사용하고 난 뒤 꼭 메모리를 해제 시켜줘야 한다.
    사용하지 않는 메모리를 해제 시켜주지 않으면 memory leak이 발생

  • 낮은 주소에서 높은 주소의 방향으로 할당된다.

  • Stack의 영역을 침범하면, Heap overflow 발생

Swift에서 클래스 인스턴스, 클로저 같은 참조 타입 들은 Heap에 자동으로 할당된다. 그리고 ARC를 통해 힙에 할당된 메모리가 더이상 참조되지 않으면 자동으로 해제해준다. (ARC가 뭔지 공부 필요 !)

참조 타입이란?
객체의 주소를 메모리에 저장해서 사용할 때 그 주소를 참조 하는 타입

4. Stack

  • 함수 호출과 관련있는 지역 변수, 매개 변수, 리턴 값 등이 저장되는 공간
    함수 호출이 완료되면 메모리도 해제된다.

  • 컴파일 타임에 결정되기 때문에 무한히 할당할 수 없다.

  • Heap과 반대로 높은 주소에서 낮은 주소의 방향으로 할당된다.

  • 함수를 재귀 호출 할 때 Stack 영역에 해당 함수의 지역 변수, 매개 변수들이 계속 할당되다보면 Stack 영역을 넘어버려서 Stack overflow가 발생한다.


참고

https://babbab2.tistory.com/25
http://www.tcpschool.com/c/c_memory_structure

profile
가장 젊은 지금, 내가 성장하는 데에 쓰자

0개의 댓글