[CS] 메모리(Memory)에 대하여 - (1)

조재훈·2024년 11월 4일
0

메모리(Memory)

컴퓨터를 사용해본 사람이라면 누구나 들어봤고 컴퓨터 공학을 전공한 사람이라면 전공 수업 중 누구나 공부해봤을 개념이다

메모리란?

메모리는 컴퓨터가 데이터를 저장하고 빠르게 접근하여 어떤 연산을 할 수 있게 해주는 운영체제에서 관리하는 리소스다

컴퓨터는 메모리에 데이터를 임시로 저장해 CPU 연산 시 빠르게 읽고 쓸 수 있게 해준다

메모리는 컴퓨터 시스템 성능에 매우 큰 영향을 미치는데 메모리가 충분히 빠르고 용량이 충분하다면 CPU는 더 많은 데이터를 더 빠르게 처리할 수 있어 게임 같은 경우 빠르게 돌릴 수 있지만 메모리가 부족하고 속도가 느리면 CPU는 데이터를 하드 디스크에서 직접 읽어와야 하므로 처리 속도가 매우 느려진다(보통 하드디스크에 게임 설치하면 로딩 속도가 굉장히 느림!)

종류

흔히 메모리라고 하면 RAM(주 기억 장치)을 떠올리는데 RAM은 CPU가 직접 접근해 데이터를 빠르게 읽고 쓰기 위한 공간이다. 반면 SSD나 HDD같은 경우(보조 기억 장치) 메모리라고 생각 안 할 수 있는데 이것도 메모리긴 하다. 단지 RAM과의 역할이 서로 다를 뿐

RAM은 HDD나 SSD에 비해 매우 빠른 속도로 CPU가 접근할 수 있어 처리 속도가 매우 빠르다. SSD는 HDD에 비해 훨씬 빠르긴 하지만 RAM에 비하면 느려 CPU가 접근하려면 컴퓨터 관점에선 굉장히 긴 시간이다

RAM은 알다시피 휘발성 메모리이다. 전원이 꺼지면 RAM에 있는 데이터들은 모두 날라가버려 RAM은 프로그램 실행동안 임시로 데이터를 저장하는 역할을 한다

반대로 SSD나 HDD는 비휘발성 메모리라 전원이 꺼져도 데이터는 영구히 유지된다. 프로그램, 파일, 운영체제 등이 저장된다

이 외에는 CPU와 RAM 사이에 위치해 자주 사용되는 데이터를 저장해 CPU가 매우 매우 빠르게 접근할 수 있는 고속 메모리인 캐시 메모리가 있고 시스템의 부팅이나 초기화 시 필요한 기본 정보를 저장하는 비휘발성 메모리인 ROM(Read-Only Memory)이 있다

그 외로 진짜인척 하는 가상 메모리가 있는데 따로 다뤄보겠다. 뒤에도 또 다른 것이 나올 수 있음

계층

여러 메모리를 살펴봤는데 이 메모리들에는 계층이 존재한다. 컴퓨터가 데이터를 처리하는 속도와 효율성을 높이기 위해 여러 메모리를 계층화해서 사용하는데 이 구조를 통해 컴퓨터는 속도와 비용을 최적화하면서 데이터를 관리할 수 있음

각 계층은 CPU와의 거리, 접근 속도, 용량에 따라 구분되며 빠르고 용량이 작을수록 계층이 높고 느리고 용량이 클수록 계층이 낮다

한 눈에 알아볼 수 있는 그림이 있다. 이 블로그에서 참고했다

레지스터

레지스터는 CPU에 위치한 고속 메모리로, CPU가 요청을 처리하는데 필요한 데이터를 임시로 저장한다. CPU에서 가장 빠르게 접근할 수 있다

캐시

위에서 언급했지만 CPU와 RAM 사이에 위치해있고 레지스터보단 느리지만 RAM보다는 접근 속도가 빠르다. 캐시도 또 CPU에 가까운 순으로 나뉜다

L1 캐시

CPU 코어에 직접 내장되어 있어 캐시 중 가장 빠른 접근이 가능하다. 데이터 사용/참조에 가장 먼저 사용된다

L2 캐시

L1 캐시와 비슷하지만 CPU 외부에 있어 상대적으로 속도가 느리지만 여전히 빠르다

L3 캐시

여러 코어가 공유하며 L2보단 느리지만 용량이 크다. 잘 사용되지는 않는다고 함

CPU는 L1 -> L2 -> L3 순으로 데이터를 찾고 없으면 RAM으로 접근한다. 캐시를 SRAM이라고도 함

RAM(Random Access Memory)

임의 접근이 가능한 메모리라는 뜻으로 원하는 데이터가 있으면 순차적으로 찾지 말고 바로 접근해 데이터를 읽고 쓸 수 있는 메모리다

보조 저장 장치

RAM 보다 매우 큰 저장 용량을 제공하지만 속도가 캐시, RAM에 비하면 달팽이다

필요할 때 데이터를 RAM으로 전송함

SSD

반도체를 이용해 데이터를 저장하는데 HDD에 비해선 읽기, 쓰기가 매우 빠르다. 최근 기술이 발전하면서 안정성과 가격도 정상화되고 있어서 최근에는 거의 다 이거 쓰는듯

가상 메모리

간단하게만 설명하면 실제 물리적 메모리(RAM)가 부족할 때 HDD나 SDD의 일부를 RAM처럼 사용하는 매커니즘

운영체제가 메모리가 부족할 때 가상 메모리를 할당함. 실제 메모리보단 성능이 떨어지긴 함

구조

메모리는 물리적으로 하나의 큰 공간이지만, 운영체제가 프로그램을 효율적이고 안전하게 실행하기 위해 논리적으로 여러 영역으로 나눈다. 이러한 영역은 커널이 사용하는 메모리 공간과 사용자 프로세스가 사용하는 공간이 포함된다

커널
운영체제의 소프트웨어 중 하나로 하드웨어의 자원을 필요한 곳에 분배하고 프로세스, 메모리를 제어하고 프로그램이 운영체제에 요구하는 시스템 콜 등을 수행하는 부분이며 중요한 소프트웨어임

프로그램이 실행되어 메모리에 프로그램이 로드되면 프로세스가 된다. 운영체제는 프로세스가 안전하고 독립적으로 실행되도록 프로세스마다 별도의 공간을 할당해 코드, 데이터, 스택, 힙의 영역으로 나뉘게 된다

현대 운영체제는 가상 메모리를 사용하여 각 프로세스가 자신만의 독립적인 메모리 공간을 사용하는 것처럼 보이게 한다. 이로 인해 프로세스마다 동일한 주소에서 코드, 데이터, 스택, 힙 영역을 사용할 수 있다. 실제 물리 메모리 상에서는 이 영역들이 물리적으로 다른 위치에 배치된다

할당

메모리를 할당하는 근본적인 이유는 우리가 프로그램을 개발할 때 데이터를 저장하고 처리할 공간이 필요하기 때문이다

메모리를 할당하는 방식은 프로그램이 메모리를 사용하는 방식에 따라 나뉘며 두 가지가 있다

정적 메모리 할당

프로그램이 컴파일될 때 운영체제가 알아서 메모리의 크기와 위치를 결정하는 방식이다

주요 특징

  • 변수나 데이터의 크기와 메모리 위치가 컴파일 시 결정
  • 실행중에 크기나 위치를 변경할 수 없다
  • 전역 변수, static 변수, 그리고 일부 지역 변수(static으로 지정된 지역 변수)들이 정적 메모리 할당을 사용

장점

  • 메모리 위치가 고정되어 있어 직접 접근할 수 있어 성능이 좋음
  • 할당과 해제 과정이 없기 때문에 프로그램이 실행되면 자동으로 사용할 수 있다

단점

  • 프로그램이 실행되기 전 메모리 크기를 미리 정해야 하므로, 실제 필요량보다 작거나 크게 할당할 수 있음
  • 할당되었지만 실제 사용되지 않는 메모리가 있어 낭비될 수 있음

함수 내부에 지역 변수를 선언하면 이는 자동 메모리 할당으로 함수 호출 시 자동으로 할당과 호출이 끝나면 알아서 해제된다. 스택 영역에 위치함

동적 메모리 할당

프로그램이 실행 중에 메모리를 필요에 따라 할당하고 해제하는 방식이다

주요 특징

  • 메모리가 필요할 때 할당하고 필요하지 않을 때 해제한다
  • 할당 크기를 런타임에 결정할 수 있어 다양한 요구를 충족가능

장점

  • 실행 중에 필요에 따라 할당과 해제하니 메모리 효율이 높다
  • 필요한 만큼 메모리를 사용하므로 낭비를 줄일 수 있다

단점

  • 런타임에 메모리 할당과 해제 과정이 필요하므로 정적 할당에 비해 성능이 떨어짐
  • 동적으로 할당한 메모리를 해제하지 않으면 종료 전까지 메모리가 해제되지 않는 메모리 누수가 있을 수 있다
  • 여러 번의 할당과 해제를 반복하며 메모리 공간이 불규칙하게 남아 단편화가 생길 수 있음

헷갈리는 것이 있어서 찾아봤는데 전역 변수로 vector<int> v = {1, 2, 3} 이렇게 선언하면 무슨 할당인지 찾아봤다

일단 전역 변수 자체가 정적 메모리 할당을 받아 변수 v의 참조 주소가 정적 메모리로 저장된다

vector 내부적으로 동적 배열을 사용하므로 초기화하면서 값들을 담기 위해 힙 메모리를 사용해 동적으로 배열 공간을 할당한다

그래서 두 가지 메모리 할당 방식이 쓰이는 것이었다

profile
나태지옥

0개의 댓글