CS/운영체제

메모리 구조 이해하기

sangjin98 2024. 1. 19. 13:25
반응형

프로그램이 실행되기 위해서는 먼저 프로그램이 메모리 로드되어야 합니다.

 

그럼 저희가 사용할 프로그램들을 전부 메모리에 로드시켜 놓을까요?

 

리눅스 기준으로는 프로세스 하나가 4GB 인데,

보통 우리가 사용하는 8GB, 16GB 메모리에 사용하고 싶은 프로그램들을 어떻게 전부 실행시킬 수 있죠?

 

가상 메모리 덕분입니다.


 

 

 

가상 메모리

가상 메모리란 메모리가 실제 메모리보다 더 많아 보이게 하는 기술입니다. 

프로세스는 각각 고유의 가상 메모리 공간을 갖고 있고 이중 일부만을 실제 메모리에 올려 실행합니다.

따라서 메모리에는 실제 실행시킬 프로세스의 일부만을 올려 두기 때문에 동시에 많은 프로세스를 로드 시킬 수 있습니다.

 

Logical address 

  • 가상 메모리에 접근하기 위한 주소로, CPU가 접근하는 주소입니다.
  • 프로세스마다 독립적으로 가지고 있습니다.
  • 이 주소는 각각의 프로세스 마다 0번지 부터 시작합니다.

Physical address

  • 메모리에 실제 올라가는 위치를 말합니다.

 

CPU는 논리 주소 에 접근하기 때문에 실제 메모리에 접근하기 위해서는 중간에 누군가가 논리 주소를 물리 주소로 변경해줘야 합니다. 

논리 주소를 물리 주소로 변경해주는 작업을 주소 바인딩이라 하며 MMU 라는 하드웨어 장치가 이 작업을 수행합니다.

 

MMU에 대해서는 다음에 다뤄보고 이번 시간에는 가상 메모리의 구조에 대해서 자세히 살펴 보겠습니다.


메모리 구조

 

메모리 구조는 그림과 같이 CODE, DATA, HEAP, STACK 영역으로 나눠집니다.

각각의 영역에는 어떠한 데이터들이 저장되는 지 하나하나 살펴보겠습니다.

 

코드 영역 ( 텍스트 영역)

실제 프로그램의 코드가 CPU가 이해할 수 있는 기계어 상태로 저장되어 있는 영역입니다.

CPU는 코드 영역에 저장되어 있는 명령어들을 하나씩 가져와 처리합니다.

 

 

데이터 영역

데이터 영역에는 프로그램의 정적 변수와 전역 변수가 저장됩니다.

이 영역의 데이터는 프로그램이 시작하면서 데이터가 할당이 되고, 프로그램이 종료되면 소멸됩니다.

 

데이터 영역 중 BSS(Block Stated Symbol) 영역에는 정적 변수 또는 전역 변수 중 아직 초기값이 할당되지 않은 변수가 저장됩니다.

 

 

힙 영역

힙 영역에는 사용자가 직접 데이터를 관리할 수 있는 영역으로 사용자에 의해 메모리 공간이 동적으로 할당되고 해체됩니다.

예시로 참조형 데이터 타입을 갖는 객체 (인스턴스) 나 배열 등이 이곳이 저장됩니다.

메모리의 낮은 주소부터 할당되고 선입선출(FIFO) 구조 입니다.

 

힙 영역의 데이터는 사용자에 의해 할당되고 해체되기 때문에 효율적인 메모리 사용을 위해 사용하지 않는 데이터는 해체 해주는 것이 중요하다. Java 에서는 GC(가비지 컬렉션) 이 알아서 사용되지 않는 데이터를 해체 해준다.

 

스택 영역

함수 호출 시 생성되는 지역 변수와 매개변수가 저장되는 영역으로 함수 호출이 끝나면 저장된 메모리도 해체됩니다.

메모리의 높은 주소부터 할당되고 후입선출(LIFO) 구조 입니다.

 

위의 그림에서 보듯이 힙과 스택 영역은 서로 같은 공간을 공유합니다. 

그래서 상황에 따라 상대방의 공간을 침법하는 일이 발생하는데 이를 Heap Overflow, Stack Overflow 라고 합니다.

 

코드로 보는 메모리 영역

https://st-lab.tistory.com/198

궁금한 점 정리

메인 메모리의 공간도 코드, 데이터, 힙, 스택 영역으로 나눠져 있는 건가?

 

자료들을 찾아보면 위와 같이 메모리를 4가지 영역으로 나눈 그림이 대부분이다.

그래서 가상 메모리 뿐만 아니라 메인 메모리에도 저런식으로 분류해서 데이터가 저장되나? 라는 의문이 들었다. 

 

위의 그림 처럼 메인 메모리도 각각의 공간을 따로 갖고 있어서

힙 영역의 데이터들은 힙 영역의 데이터들끼리 메인 메모리에도 모여서 저장되나? 라는 생각을 했는데 

 

조사한 결과 코드, 데이터, 힙, 스택 영역은 가상 메모리 상에서 추상적으로 나눈 영역이고, 실제로

메인 메모리에는 저런식으로 저장되는 것이 아니라 특정 패턴 없이 임의로 저장된다.

 

따라서, 가상 메모리 내에서 논리적으로 구분된 코드 영역, 데이터 영역, 힙, 스택 등은 실제 물리 메모리 상에서 이러한 구분 없이 흩어져 저장될 수 있다.

 

참고 자료

https://velog.io/@shindoyeon/%EC%9A%B4%EC%98%81%EC%B2%B4%EC%A0%9C-%EB%A9%94%EB%AA%A8%EB%A6%AC-%EA%B5%AC%EC%A1%B0
https://lxxyeon.tistory.com/70
https://st-lab.tistory.com/198

 

반응형