brunch

You can make anything
by writing

C.S.Lewis

by 내가 사는 세상 Dec 02. 2023

컴퓨터 구조 - 메모리 - RAM

#스택 #힙 #가비지 콜랙터(GC) #reference count

컴퓨터는 CPU(계산장치)와 메모리(저장장치)로 구분된다. 그중 메모리는 RAM(주기억장치)과 SSD(보조기억장치)로 나눠볼 수 있다. RAM은 컴퓨터가 꺼지면 다 사라지고, SSD에 남은 정보는 계속 남아있는다.



cf) CPU 속에도 아주 적은 부분을 떼어내서 저장기능을 하는 부분이 있는데, 이를 레지스터라고 부른다. RAM과 SSD를 각각 수첩, 공책 정도로 생각하다면, 레지스터는 포스트잍 정도가 된다. 이제 이 글의 주제인 RAM을 살펴보자.



RAM은 4가지 영역으로 구성되어 있다.

1. 스택(stack) : 지역변수, 매개변수

2. 힙(heap) : 개발자의 동적할당

3. 코드(code) : 실행할 프로그램의 코드

4. 데이터(data) : 전역변수, 정적변수(static) : 할당 후 main 함수 실행

 



이들 중 코드와 데이터 영역은 개발자가 건드릴 수 있는 부분이 적다. 그래서 스택과 힙이 코딩을 함에 있어선 더 중요하다. 스택과 힙은 물리적으론 똑같은 형태의 메모리이다. 다만 기능에 따라 구분한 것이다.


1. 스택(stack) #정적 메모리

함수 내 지역변수, 매개변수 저장

컴파일 시 크기 결정

힙에 비해 메모리 크기가 작음

힙에 비해 빠름(bcz 벽돌 쌓듯 깔끔한 스택 구조)


 프로그램의 쓰레드(thread)마다 특정 용도(ex. 함수실행)로 쓰라고 RAM이 나눠준 메모리 부분이다. 함수를 사용할 때 그 속의 지역변수, 매개변수는 스택에 저장된다. 이때 값이 복사 되면서(call-by-value) 할당된다.


 구체적으로 main함수가 실행되면, 그 속에 있는 지역변수가 스택에 할당된다. 그리고 그 과정 속에서 함수가 실행되면, 해당 함수의 매개변수가 스택에 할당된다. 함수가 끝나면 해당 스택 메모리 속 데이터는 곧바로 사라진다.



2. 힙(heap) #동적 메모리

일반적, 범용적인 메모리

개발자가 임의로 할당 가능(at C언어), 메모리 수명 제어 가능 #메모리 누수의 원인

런타임 시 크기 결정

스택에 비해 메모리 크기가 큼

스택에 비해 느림(bcz 빈 공간을 일일이 찾아봐아해서, 메모리간 구멍발생(파편화))


 heap은 무언가를 쌓아놓은 더미를 뜻한다. 메모리를 모아서 쌓아둔 것이다. 개발자는 필요할 때마다 힙에 방문해서 원하는 만큼 메모리를 가져가면 된다. C언어에선 개발자가 임의로 메모리를 가져오(할당받)거나, 반납(해제)하는게 가능하다. 그래서 메모리를 컴퓨터가 해주지 않는다고 해서 unmanaged 언어라고 부른다. C언어를 사용해서 힙 메모리에 동적할당하는 간단한 예제를 살펴보자.


#include <stdio.h>

#include <stdlib.h>


int main() {

    int* num = (int *)malloc(sizeof(int));     // 동적으로 정수형 변수에 메모리 할당

    *num = 123;  // 동적으로 할당된 메모리에 값 저장

    printf("할당된 메모리의 값: %d\n", *num); // 할당된 메모리의 값 출력

    free(num);  // 동적 메모리 해제

    return 0;

}




 반면 Java와 Python와 같은 경우는 힙 메모리 할당 해제를 컴퓨터가 알아서 해줘서 managed 언어라고 부른다. 해당 언어에선 GC(Garbage Collector)가 알아서 그 역할을 하는 것이다. python에서의 가비지 컬렉션 과정을 간단히 살펴보자.


Garbage Collector 원리 : 참조(reference) count


 python의 GC에서는 참조(reference) count라는 개념이 있다. 힙 메모리에 할당된 개체는 어떤 변수가 자신을 가리키고(참조 : reference) 있는지 그 횟수를 저장한다. 개발자가 변수를 지정, 해제함으로서 힙 메모리의 해당 개체를 가르키거나 가르키지 않게 할 수 있다.


  그 횟수가 0이 되면 아무도 그 개체를 사용하지 않는 상태이다. 아무한테도 관심을 받지 못하니 안타깝게도 소멸대상으로 등록된다. 그렇게 등록된 것들은 머지않아 무시무시한 파이썬 가상머신(PVM : Python Virtual Machine : C언어로 구현된 CPython이 대표적) 속 GC(Garbage Collector)한테 청소당한다. 그렇게 힙 메모리는 깨끗해진다.



import sys


x = {"이름": "홍길동", "나이": 30 }    참조(reference) 횟수 : 1

y = x    # 참조(reference) 횟수 : 2

del x    참조(reference) 횟수 : 1

del y    참조(reference) 횟수 : 0




참고자료


윤성우 : 윤성우의 열혈 파이썬 중급편


매거진의 이전글 운영체제 - 하는 일
브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari