메모리 구조

yim2627·2021년 11월 27일
0

RAM

메모리(RAM)에 관해 설명하기 전에..

컴퓨터 관점에서 저 RAM의 역할에 대해 알아보자

이것이 램이다 컴퓨터 조립해봤음 알겠지만.. 소켓 열고 딸깍 소리날 때까지 눌러껴야되는.. 손 드럽게 아픈 그 램

전에 데스크탑 맞출 때 사고싶었었는데 안사길 잘한 듯

아 근데 진짜 드럽게 비싸네

RAM은 (Ramdom Access Memory)의 약자인데, RAM은 주기억 장치중 하나이다.

다른 주기억 장치인 ROM과 달리 읽고 쓰기가 가능하며, 휘발성 메모리이다.

휘발성 메모리란 램에 입력되는 전원이 끊어지면 내부 데이터가 전부 날아가는 메모리를 말한다.

램은 응용 프로그램, 운영체제 등을 불러와 CPU가 작업을 할 수 있도록 하는 기억장치이다.

이외에 CPU와 주기억장치 사이의 속도 차이를 완화시키기 위해 버퍼(Buffer)가 존재하는데 이를 캐시 메모리라고 한다.

보조기억장치.. HDD,SDD....여튼.. RAM의 관한 설명은 이까지..

메모리 구조

프로그램이 실행되면 위에서 말했듯이 운영체제가 메모리(RAM)에 해당 프로그램을 위한 공간을 할당한다.

즉, 자리를 만들어 놓는다.

그 공간, 자리엔 Code, Data, Heap, Stack 이렇게 네가지의 영역으로 나뉜다.

위부터 아래 순서로 알아보자

Code 영역

코드 영역은 우리(사용자)가 적은 소스코드가 할당되는 영역이다.

그렇다고 소스코드를 우리가 쓴 그대로 예를 들어 print("So Hungry") 이게 고대로 올라간다는게 아니고 Low level 언어인 기계어로 변환되어 컴파일 시점에 저장된다.

기계어란 CPU가 컴파일없이 바로 읽을 수 있는 언어를 말한다.
비트 단위로 표현하기 떄문에 0과 1로만 표현된다. (Binary)

핵심적인 부분은 중간에 코드가 변경되지 않도록 Read Only 형태로 저장된다는 것이다.

Data 영역

전역 변수와 Static 변수 (정적 변수)를 저장한다.

전역 변수와 Static변수는.. 설명 스킵하겠다

프로그램이 실행될 시점에 저장되며, 할당 해제되는 시점은 프로그램이 종료될 시점에 메모리(Data 영역)에서 내려온다(할당 해제).

그리고 전역 변수와 정적 변수는 프로그램 실행중에 변수에 할당된 값을 변경할 수 있으므로 위의 Code 영역과 달리 Read - Write가 둘다 가능하도록 지정된다.

변수라고 다 여기에 저장되는 것 아니다. 착각하지말자.

Heap 영역

힙 영역은 사용자(프로그래머)가 직접 관리할 수 있는 메모리 영역이다.

사용자에 의해 메모리 공간이 동적으로 할당되거나, 해제된다.

만일 사용자가 힙 영역에 어떠한 것을 할당하였다면, 프로그램이 종료될 때나, 그 어떠한 것이 더 이상 필요없을 땐 반드시 할당 해제해줘야 한다.

그렇지 않다면 필요없는 것이 메모리를 쓰잘데기 없이 잡아먹고 있는 상황이 발생하게 된다. 이를 Memory Leak, 메모리 누수라고 한다.

Swift에선 참조타입의 값이 힙 영역에 할당되고, ARC가 알아서 메모리 관리를 해주지만, 다른 언어.. C같은 경우엔 수동으로 할당, 해제를 구현해야한다.

위 그림의 네가지 영역중 유일하게 런타임 시점에 결정되기 때문에 할당할 데이터의 크기가 확실치 않을 때 사용한다.

이는 아래에서 한번 더 설명하겠다.

Stack 영역

스택영역은 함수의 지역변수와 매개변수가 저장되는 영역이다.

함수가 호출되는 순간 스택에 지역변수와 매개변수, 리턴값등이 할당되고, 함수 종료와 동시에 할당 해제된다.

힙 영역과 달리 컴파일 시점에 결정된다.

스택 영역은 자료구조의 스택과 동일하게 LIFO로 이루어져 있다.

LIFO: Last In First Out

또한 CPU에 의해 관리, 최적화되기 떄문에 다른 영역보다 속도가 더 빠르고, 사용자가 메모리를 관리, 즉 해제를 해주지 않아도 된다.

Heap? Stack?

아까 힙에서 설명한다했던 걸 까먹었었다.

데이터의 크기가 확실치 않을 때 힙에 저장한다고 했는데, 그 이유는 스택 영역의 메모리가 한정되어 있기때문이다.

위의 그림을 예로 들면 크기가 100으로 제한되어 있는 스택영역에 크기가 50일지, 150일지 모르는 데이터를 넣는다고 생각해보자.

"이 데이터를 넣어도 안전해" 라는 확실성이 없어지는 것이다.

데이터의 크기가 50이면 상관없지만, 만약 150이면? 스택오버플로우가 발생한다.

그렇기 때문에 데이터의 크기가 확실치 않을 시엔 메모리가 한정된 스택 영역이 아닌 힙 영역에 할당한다.

"그럼 힙 영역엔 제한이 없는거임??"

아니다. 제한있다... 힙 메모리가 제한이 없다는 글도 많길래 생각을 좀 해봤다.

힙 영역이 무제한 영역이면.. 스택이든 뭐든 다른 메모리를 뭐더러 쓰나? 생각이 들어서.. 아래가 이유가 된다.

Stack, Heap 영역은 가변적이다. 서로 같은 메모리 영역을 공유한다.

가뜩이나 일직선도 그리기 힘든데 그림을 저래 파도처럼 그린 이유도 이때문이다.

스택이나 힙 영역이 거대해져 서로의 영역을 침범할 수 있다.

서로 같은 메모리 영역을 공유하기 때문에 스택 영역이 커지면 힙 영역은 줄어들고, 힙 영역이 커지면 스택 영역이 커지는 관계를 갖고있다.

근데 너무 과하게 혼자 크면? 이 때 스택이 힙을 침범하는 것을 스택 오버플로우(Stack Overflow), 반대의 경우를 힙 오버플로우(Heap Overflow)라고 한다.

힙 영역이 무제한이면 힙 오버플로우가 발생할까?

스택 영역 메모리보다 힙 영역 메모리가 더 크기때문에 데이터의 크기가 확실치 않을 때 힙에 저장하는 것이다.

HeapStack
- 메모리를 직접 관리해야 함
- 사용완료한 것을 해제해주지 않으면 메모리 누수 발생
- 속도가 느림
- 스택보다 메모리 영역이 큼
- CPU가 스택 메모리를 알아서 효율적으로 구성하기 때문에 속도가 매우 빠름
- 메모리 직접 해제 안해도 됨
- 유연하지 않음
- 힙보다 메모리 영역이 한정되어 있음

근데 요즘 메모리가 너무 잘 나와서.. 오버플로우 빈도가 많이 줄었다는 것을 어디서 들은 것 같다.

맞는 말씀 같다.










아 그 램 사진 광고 아닙니다.

profile
여러 사람들과 함께 많은 것을 배우고 나누리

0개의 댓글