프로그래밍공부(Programming Study)/CS-운영체제(OS)

메모리는 그냥 “값을 넣는 공간”이 아니다

Chann._.y 2026. 3. 31.
728x90

프로그램을 처음 배울 때는 메모리를 꽤 단순하게 생각하게 된다.
변수를 선언하면 값이 들어가고, malloc()을 하면 공간을 받고, 쓰고 나면 끝이라고 느껴진다.

그런데 운영체제 관점에서 보면 메모리는 그냥 빈 공간이 아니다.
아무 프로그램이나 마음대로 접근할 수 있는 공간도 아니고, 단순히 값만 저장하는 장소도 아니다.

오히려 메모리는 권한, 보호, 격리를 전제로 설계된 구조에 가깝다.

이걸 이해해야 뒤에서 나오는 malloc(), mmap(), RSS, page cache 같은 개념도 자연스럽게 이어진다.

메모리를 왜 그냥 “공간”이라고 보면 안 될까

아주 단순하게 생각해보면, 컴퓨터에서는 여러 프로그램이 동시에 실행된다.

  • 브라우저도 메모리를 쓰고
  • 데이터베이스도 메모리를 쓰고
  • 운영체제 자체도 메모리를 쓴다

만약 이 셋이 같은 메모리를 아무 제약 없이 건드릴 수 있다면 어떻게 될까?

브라우저가 데이터베이스 메모리를 덮어쓸 수도 있고,
사용자 프로그램이 운영체제 내부 데이터를 망가뜨릴 수도 있다.
그럼 프로그램 하나의 버그가 시스템 전체 장애로 이어진다.

그래서 운영체제는 메모리를 단순히 나눠주는 게 아니라,
누가 어디까지 접근할 수 있는지를 엄격하게 구분한다.

이게 메모리를 그냥 “저장 공간”이 아니라 “관리되는 공간”으로 봐야 하는 이유다.

사용자 공간(user space)과 커널 공간(kernel space)

운영체제에서 가장 먼저 나오는 구분이 바로 이거다.

  • 사용자 공간(user space)
  • 커널 공간(kernel space)

사용자 공간은 일반 프로그램이 사용하는 메모리 영역이다.
우리가 작성한 애플리케이션 코드, 힙(heap), 스택(stack), 라이브러리 등이 여기에 들어간다.

반면 커널 공간은 운영체제가 사용하는 영역이다.
프로세스 관리, 파일 시스템, 네트워크 스택, 디바이스 드라이버 같은 핵심 기능들이 여기에 있다.

중요한 건 두 공간이 단순히 “이름만 다르게 부르는 영역”이 아니라는 점이다.

사용자 프로그램은 커널 공간에 직접 접근할 수 없다.

이 제약이 있어야 운영체제가 보호된다.
즉, 프로그램이 잘못된 포인터를 써도 자기 프로세스만 죽고 끝나게 만들어야지, 운영체제까지 같이 무너지면 안 된다.

그래서 사용자 공간과 커널 공간의 분리는
성능 최적화 이전에 보안과 안정성의 기본 조건이다.

그런데 우리가 쓰는 주소는 진짜 메모리 주소가 아니다

여기서 한 번 더 생각해볼 부분이 있다.

C에서 이렇게 썼다고 해보자.

int *p = malloc(100);

우리는 p 안에 어떤 주소가 들어 있다고 생각한다.
그런데 이 주소는 우리가 흔히 상상하는 “RAM의 진짜 위치”가 아니다.

프로그램이 보는 주소는 가상 주소(virtual address) 다.

즉, 프로그램은 실제 물리 메모리(RAM)를 직접 보는 게 아니라,
운영체제가 만들어준 가상 주소 공간(virtual address space) 안에서 동작한다.

흐름으로 보면 대략 이렇다.

프로그램
 → 가상 주소 사용
 → 운영체제가 주소 변환
 → 실제 물리 메모리 접근

이 구조 덕분에 각 프로세스는 마치 자기만의 메모리를 가진 것처럼 동작할 수 있다.
실제로는 여러 프로세스가 하나의 물리 메모리를 나눠 쓰지만, 각자 분리된 공간을 가진 것처럼 보이는 것이다.

왜 굳이 가상 메모리(virtual memory)를 쓰는 걸까

이 질문이 자연스럽다.

“그냥 실제 메모리를 직접 쓰게 하면 안 되나?”

안 된다. 이유는 분명하다.

첫째, 보호 때문이다.
프로세스마다 주소 공간을 분리해두면 서로의 메모리를 침범하기 어렵다.

둘째, 편의성 때문이다.
프로그램 입장에서는 연속된 큰 메모리를 쓰는 것처럼 보여도, 운영체제는 뒤에서 실제 물리 메모리를 유연하게 배치할 수 있다.

셋째, 운영 효율 때문이다.
메모리가 부족할 때 일부 페이지를 디스크로 내리거나, 파일을 메모리처럼 매핑하는 식의 기능도 가능해진다.

즉, 가상 메모리는 단순히 “주소를 한 번 더 바꾸는 번거로운 구조”가 아니라,
현대 운영체제의 메모리 관리 전체를 가능하게 하는 기반이다.

이걸 실제로 누가 관리하나

이건 운영체제 혼자 하는 일이 아니다.
하드웨어도 같이 참여한다.

대표적으로 중요한 게 다음이다.

  • MMU(Memory Management Unit)
  • 페이지 테이블(page table)
  • CPU 권한 레벨(privilege level)

MMU는 가상 주소를 물리 주소로 바꾸는 일을 돕고,
페이지 테이블은 어떤 가상 주소가 어떤 물리 메모리와 연결되는지 기록한다.
그리고 CPU는 현재 코드가 사용자 모드(user mode)인지 커널 모드(kernel mode)인지에 따라 접근 가능 여부를 검사한다.

즉, 메모리 보호는 단순한 소프트웨어 규칙이 아니라
운영체제와 CPU가 같이 강제하는 규칙이다.

정리하면, 메모리는 “보호되는 구조”다

처음에는 메모리를 그냥 변수 넣는 공간 정도로 생각하기 쉽다.
하지만 실제 시스템에서는 전혀 그렇지 않다.

  • 프로그램은 자기 메모리만 써야 하고
  • 운영체제는 보호되어야 하고
  • 주소는 가상 주소로 추상화되어 있고
  • 실제 변환과 권한 검사는 운영체제와 CPU가 함께 처리한다

그래서 메모리는 단순한 공간이 아니라,
격리와 보호를 전제로 관리되는 시스템이라고 보는 게 더 정확하다.

이 관점이 잡히면 그다음에 나오는 질문들도 훨씬 자연스럽게 이어진다.

  • malloc()은 실제로 어디서 메모리를 가져오는가
  • free()를 했는데 왜 RSS는 안 줄어드는가
  • mmap()은 왜 따로 존재하는가
  • 사용자 공간 주소는 어떻게 구성되는가

이제부터는 이런 질문들에 답하면서 메모리 구조를 더 구체적으로 따라가면 된다.

한 줄 정리

메모리는 그냥 값을 저장하는 빈 공간이 아니라, 운영체제와 하드웨어가 함께 권한을 나누고 보호하는 구조다.

728x90

댓글