회고록 블로그

[궁금증] 스택과 힙 영역은 가상 메모리에 있는 공간인걸까 본문

3. Computer Science 공부/준비사항

[궁금증] 스택과 힙 영역은 가상 메모리에 있는 공간인걸까

김간장 2021. 9. 3. 17:43

운영체제에 대해서 공부를 하고 있다가

궁금한 점이 생겼는데 그에 대한 답을 찾아 기록해 놓으려고 한다.


사건의 시작은 이러하다.

며칠전, 운영체제 공부 중 '가상메모리 관리 기법'에 대해서 공부를 하고 있었다.

 

간단하게 정리하자면, 가상메모리는 이런 것이다.

(1) 가상 메모리는 물리 메모리(RAM)와 보조기억장치(하드디스크 등)로 구성되어 있다.

(2) 물리메모리와 동일한 크기(?)로 보조기억장치에 공간이 존재하는데

(3) 보통 프로세스가 처리될 때, 물리 메모리(RAM)에 모든 데이터를 로드 해놓을 수 없으니,

      프로세스의 일부만 물리 메모리에 로드하고 나머지는 보조기억장치에 만들어 놓은 (2)의 공간에 놓는다.

(4) 즉, 하드디스크의 일부 공간을 메인 메모리처럼 사용한다는 것이다.

 

가상 메모리는 한 프로세스 당 1개만 만들어지는데

아래 출처의 그림처럼 (RAM과 DISK의 공간을 다 모아 모아 놓은) 큰 하나의 메모리로 볼 수 있다.

 

https://ko.wikipedia.org/wiki/%EA%B0%80%EC%83%81_%EB%A9%94%EB%AA%A8%EB%A6%AC

 

가상 메모리 - 위키백과, 우리 모두의 백과사전

가상 메모리는 활성 RAM과 DASD 상의 비활성 메모리로 결합되어 있다. 가상 메모리 또는 가상 기억 장치(문화어: 가상기억기, virtual memory, virtual storage)는 메모리 관리 기법의 하나로, 기계에 실제로

ko.wikipedia.org

 

 

그리고 그 가상 메모리를 통해 물리 메모리에 프로세스를 어떻게 적절하게 배치할까 등을 결정하는 가상메모리 관리 기법이 있고

대표적으로 페이징(Paging) 기법과 세그먼테이션(Segmentation) 기법이 있다.

 

어쨌든 가상 메모리에 대한 설명글이 아니니까 가상 메모리는 이정도만 정리하기로 한다.


이때 갑자기 혼란스러워진다.

 

보통 프로그래밍 언어를 배울 때 아주 간단하게 아래와 같이 메모리 구조를 설명해준다.

보통 이렇게 스택과 힙 영역이 있다면서 배우지 않는가.

 

 

그런데 갑자기 가상 메모리가 등장한다.

더구나 페이징(Paging) 기법 같은 경우

가상 메모리를 일정한 크기로 분할해서 물리 메모리(RAM)와 보조기억장치(하드디스크 등)로 배치하는 것이라고 한다.

 

그럼 내가 배운 저 그림은 어디에 있는 메모리라는 것인가.

물리 메모리인가, 가상 메모리인가..

메모리를 어떻게 분할한다는 것인가..

혼란스러워지기 시작했다.


그래서 이 혼란은 어떻게 해결해야할까

 

우연히 여러 글을 읽다가 아래 글에서 그림을 보고 답을 찾아냈다.

마지막 그림을 보면 'Shared Library Using Virtual Memory'라고 되어 있는데

그 그림이 code, data, heap, stack 영역으로 나뉘어 있는 것을 볼 수 있다.

 

https://m.blog.naver.com/jevida/140191866773

 

가상 메모리(Virtual Memory)

가상 메모리(Virtual Memory) 가상 메모리(Virtual Memory)는 프로세스 전체가 메모리에올라와 있지 않...

blog.naver.com

 

즉,

일반적으로 프로그램 공부할 때 배우는 "code, data, BSS, heap, stack 영역을 나눠놓은 메모리 그림"은

"가상 메모리"(virtual memory)를 의미하는 것이었다.

 

그리고 운영체제는 그 가상 메모리를 적당히 분할해서(페이징, 세그먼테이션 등) 물리 메모리와 보조기억장치에 배치하는 것 같다.

(가상 메모리 관리 기법 참고)

 

어차피 code, data, heap, stack 등의 영역은 운영체제가 이해하고 있는 논리적인 것일 뿐이지

실제로 그걸 저장해야하는 물리 메모리(반도체)에게는 단지 0과 1로된 몇백 몇천줄의 데이터일 뿐이니

일정한 크기로 나눠서 물리 메모리에 할당하는건 이상한게 아닌가보다.

 

특히 시스템해킹쪽에서 RET(return address) 변조 등을 할 때 메모리 주소값을 찾게 되는데

그때 나오는 '메모리 주소값'은 '물리 메모리 주소'가 아니라 '가상 메모리 주소'인 것으로 추정된다.

 

 

가상 메모리 덕분에 프로그램을 개발할 때 개발자가 물리 메모리, 하드디스크의 주소를 직접 찾을 필요가 없다고 하기도 했고

가상 메모리 관리 기법을 보면 가상 주소(virtual address)를 물리 주소(physical address)로 변환하는 과정에 대해서 설명해주고 있기 때문에

프로그램 공부를 할 때 나오는 '메모리'와 '메모리 주소'는 모두 물리 메모리가 아니라

'가상 메모리'와 '가상 메모리 주소'를 의미하는 것으로 추측된다.

 


하긴.. 물리 메모리가 code, data, stack, heap 영역으로 나뉘어 있을리가 없지..

 

 

 

 

참고로 가상 메모리는 "프로세스마다 하나씩" 갖고 있는 고유한 공간이기 때문에

하나의 큰 code, data, stack, heap 공간 덩어리에서 각각 프로세스가 나눠서 공간을 쓰는게 아니다.

 

각각의 프로세스마다 code, data, stack, heap 공간이 있는 가상 메모리를 별도로 갖고 있는 것이다.

 

가상 메모리 크기를 사용자가 설정해줄 수도 있는 것 같다. 아래의 글을 보면 말이다.

https://comeinsidebox.com/virtual-memory/

 

윈도우11 가상 메모리 늘리는 방법과 가상 메모리 관련 정보 몇가지 - insideBOX

윈도우에서 가상 메모리란 HDD, SSD 같은 보조 기억 장치의 일부 공간을 메모리로 사용하는 방식을 말합니다. 부족한 시스템 메모리를 보조하기 위한 수단 이라고 생각 하시면 되겠습니다.윈도우

comeinsidebox.com

 

그럼,

stack 공간이 부족하다, heap 공간이 부족하다 등의 문제가 생기면 가상 메모리 크기를 늘려주면 해결될 수 있는걸까..

 

※ 또한 메모리 보호기법 중 하나인 ASLR은 가상 메모리 주소를 랜덤하게 변경하는 것이라고 한다.

Comments