본문 바로가기
TIL (Today I Learned)

[CS] 메모리 구조

by Bokoo14 2024. 2. 10.

[참고]

📝 컴퓨터 저장 공간의 계층 구조와 성능 특징

"레지스터 → CPU 캐시 메모리 → 메인 메모리 → 보조기억장치 → 외부기억장치" 순으로 CPU와 멀어진다.
CPU로부터 멀어질수록 데이터를 저장하는 용량이 커지고 접근 속도는 느려진다.

 

 

📝 1) 코드(Code) 영역

  • 실행할 프로그램의 코드
    • 컴파일 된 후 기계어 형태로 저장
    • 컴퓨터에게 일을 시키는 실행 코드를 Instruction이라 함
  • 텍스트 영역으로도 부름
  • CPU는 코드 영역에 저장된 명령어를 하나씩 가져가 처리
  • 읽기 전용 (ROM)

📝 2) 데이터(Data) 영역

  • 전역 변수, 정적 변수(static)가 저장됨
    • 프로그램 실행 시, 전역 변수와 static 변수는 메인 함수가 호출되기 전에 데이터 영역에 할당
  • 프로그램의 시작과 함께 할당, 프로그램 종료 시 소멸
  • Read-Write 형태 (실행 도중 값 변경될 수 있음)
  • 데이터 영역은 BSS 영역, Data 영역으로 나뉜다.
    • BSS(Block Stated Symbol) 영역
    • Data 영역
      • 초기화가 이루어진 변수들이 저장
      • 프로그램 실행 중 자유롭게 접근해서 수정, 변경이 가능
      • 사실 데이터 영역은 ROM에 위치하는데, 전역변수와 static 변수를 ROM에 저장하면 런타임 시 변경된 값이 적용되지 않고, 계속 초기값만을 가지고 있게 된다. (ROM은 read only니까) 그래서 데이터 영역을 RAM에 복사해서 런타임 시 변경되는 값을 저장할 수 있도록 한다
    • BSS와 Data 영역을 나누는 이유?
      • 초기화된 데이터는 ROM의 data 영역에 저장된다. 하지만 아직 초기화되지 않은 데이터들까지 ROM에 저장되면 큰 사이즈의 ROM이 필요하기 때문에 이 영역을 나눔

📝 3) 힙 영역

  • 객체의 참조값(Object Reference)이 저장됨 (Class와 그 Class객체들)
  • class, closure와 같은 참조 타입의 데이터가 저장
    • swift의 경우 ARC가 참조 타입의 할당, 해제 시점을 자동으로 관리
    • Java의 경우 가비지 콜렉터(GC)가 관리
    • C의 경우 사용자가 동적으로 할당, 해제 해줘야 함. (malloc, free)
  • 런타임 시(프로그램이 실행되는 도중)에 힙 영역의 크기가 결정
  • 동적 할당 및 해제
  • 사용자가 직접 관리해야 하는 영역
  • 메모리를 해제해주지 않으면 memory leak 발생 (동일 메모리 블록 중복 할당 방지 필요)
  • 메모리의 낮은 주소에서 높은 주소의 방향으로 할당
  • 주로 긴 생명주기를 가지는 데이터들이 저장 (대부분의 객체는 크기가 크고 서로 다른 코드블럭에서 공유되는 경우가 많다.)
  • 애플리케이션의 모든 메모리 중 stack에 있는 데이터를 제외한 부분이라고 보면 됨
  • 모든 Object 타입(Integer, String, ArrayList, ...)의 참조값은 데이터 타입과 함께 heap 영역에 생성된다.

📝 4) 스택 영역

  • 함수의 호출과 관계되는 지역 변수와 매개변수가 저장됨
    • struct, enum과 같은 값 타입의 데이터가 저장
    • 지역변수들은 scope에 따른 visibility를 가진다.
  • Heap영역에 생성된 Object타입의 데이터 참조값이 할당
  • 컴파일 시에 할당될 영역의 크기가 결정됨
  • 원시 타입의 테이터가 값과 함께 할당 (Heap에는 할당되지 않음)
    • 원시타입: byte, short, int, long, double, float, boolean, char
  • 각 Thread는 자신만의 stack을 가진다.
  • 함수의 호출과 함께 할당, 함수의 호출이 완료되면 소멸
  • 푸시(Push)로 데이터 저장, 팝(Pop)으로 데이터 인출
  • 가장 늦게 저장된 데이터가 가장 먼저 인출
  • 메모리의 높은 주소에서 낮은 주소의 방향으로 할당
  • 지역변수들은 scope에 따른 visibility를 가진다.

 

📝 메모리 관리를 해야 하는 이유?

1) 앱 성능 효율적 관리

2) 메모리 충돌 방지 및 해결

 

- 문자열은 주로 가변 길이로 heap 메모리에 저장

- 구조체, 클래스라고 무조건 힙, 스택 등 지정된 영역에서 동작하는 것은 아님

 (Int, Double 등 대체적으로 stack 영역에 저장되지만 아닌 경우도 있음) -> mutating, inout 키워드 사용 시

 

📝 iOS에서 메모리 관리하는 방법 - ARC

https://bokoo.tistory.com/entry/Swift-ARC-Automatic-Reference-Counting

'TIL (Today I Learned)' 카테고리의 다른 글

[CS] 객체지향 프로그래밍(OOP)이란?  (0) 2024.02.12
[Swift] Swift란?  (0) 2024.02.12
[Swift] Class vs Struct  (0) 2024.02.10
[Swift] 메모리 관리  (1) 2024.02.08
[SwiftUI] SwiftUI의 View란?  (0) 2024.01.30