운영체제 & 컴퓨터구조

[OS] #12. 가상 메모리 ( Virtual Memory )

코딩하는상후니 2022. 9. 16. 22:17

 

 


 

 

* 가상 메모리

 

 

 

 

=> 가상 메모리는 '각각의 프로세스마다 주어지는 선형 메모리' 이다.
 
 
=> 보통 운영체제가 관리하고 할당해주며
32bit 환경에서의 가상 메모리 크기는 '4GB'
64bit 환경에서는 이론상 엄청큰 가상 메모리 영역을 할당할 수 있지만,
'8TB' 정도로 제한하고 있다.
 
 
 
 
물리 주소 ( Physical Address )  :  실제 하드웨어 RAM 에 존재하는 주소.
 
가상 주소 ( Virtual Address )  :  프로세스마다 존재하는 가상 메모리의 주소.
 
 
 
 
=> 물리 주소와 가상 주소를 분류해놓은 이유는
프로세스마다 어떤 주소를 저장해야할 필요가 생기는데
프로그램이 메모리에 올려지게 될 때,  어느 위치에 올려질지 모르는 상황에서
물리 주소는 알 수 없다.
 
 
따라서,
일정 크기의 가상 메모리를 통해서
프로세스가 메모리 주소를 관리하고 접근할 수 있도록 한다.
 
 
 
 
=> 이 가상 메모리를 일정한 간격으로 나눈 블록을 '페이지' 라고 부른다.
 
이렇게 페이지 단위로 나누는 기법을 '페이징 ( Paging )' 이라고 한다.
 
 
 

 

 

 

 

 
 
 
 
 
 
 
 

* 가상 메모리를 페이지로 나눈 이유

 
 
왜 그런지 생각해보자.
이유를 알기 위해선 이전에 어떤 문제점이 존재했는지 생각해 볼 필요가 있다.
 
 
CPU 가 어떤 프로세스의 작업을 수행하기 위해선
2차 메모리에 있는 프로그램을 주 기억 장치인 RAM 에 올리고
CPU 가 RAM 에 존재하는 기계어 코드들을 읽고 연산하는 과정이 필요하다.
 
 
이 때,
프로그램을 메모리에 전체를 올리게 되면 어떻게 될까 ??
당연히 메모리가 부족하다.
 
또한, 더 큰 문제점은
프로그램이 올려졌다가 종료되면서 생기는 '외부 단편화' 로 인해서
다른 프로그램이 메모리에 올려질 수 있는공간이 존재함에도 불구하고
메모리에 올리지 못하는 현상 이 발생된다.
 
 
이를 해결하기 위해
가상 메모리를 '페이지' 단위로 나누게 된다.
 
 
프로그램 실행 시, 메모리에 전체 올리지 않고
필요한 부분의 '페이지' 만 메모리에 올려서 CPU 가 연산하게 한다.
 
이로 인해
메모리를 효율적으로 쓸 수 있게 되고 '페이지 테이블' 을 만들면서
운영체제가 메모리 관리를 효과적으로 할 수 있게 된다.
 
또 메모리의 크기에 상관없이
크기가 큰 프로그램을 느리더라도 실행시킬 수 있는 장점이 있다.
 
 
하지만,
페이지 교체가 빈번하면 비용이 크다.
'내부 단편화' 가 일어날 수 있다.
 
 
 
 
 
 

 

 

 
 
 
 

* 외부 단편화  /  내부 단편화

 

 

 

 

 

외부 단편화  :  메모리에 공간은 충분하지만 파편되어있음.
( 외부에서 발생하는 문제. )
 
내부 단편화  :  해당 데이터가 메모리에 적재되어 생기는 파편.
( 내부에서 발생하는 문제. )
 
 
 
 
 
 
 
 
 
 
이제부터
CPU 가 가상 주소를 이용해서 실제 물리 메모리에 접근해
어떻게 처리하는지 과정을 알아보려고 한다.
 
 
그전에 먼저 관여된 H/W 들을 알아보고 넘어가자.
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

* MMU ( Memory Management Unit )

 
 
 
 
 
 
=> 가상 주소를 물리 주소로 바꿔주는 역할을 한다.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

* TLB ( Translation Lookaside Buffer )

 
 
 
 
 
=> MMU 를 거쳐 바뀐 물리 주소를 저장하는 '일종의 MMU 캐시 메모리' 이다.
 
 
 
 
 
 
 
 
 
 
 
 
 
 

 

* 페이지 테이블 ( Page Table )

 
 
 
 

 

 
 
=> 페이징 에서 사용되는 자료 구조로 프로세스의 페이지 정보를 저장하고 있는 테이블.
 
=> 실제 RAM 에는 가상 메모리의 일부 필요한 페이지들만 올려져있음.
 
 
=> 이런 과정들을 'MMU ( Memory Management Unit )' 가 관리 한다.
 
 
 
 
 
 

 

 
 
 
 

* Virtual Cache ( 가상 캐시 )  /  Physical Cache ( 물리적 캐시 )

 

 

 

 

=> 캐시 메모리의 종류는 크게 두 가지
Virtual Cache ( 가상 캐시 ) / Physical Cache ( 물리 캐시 ) 로 나뉜다.
 
 
가상 캐시는 가상 메모리 주소 그대로 저장할 수 있고
물리 캐시는 MMU 에서 가상 메모리 주소를 물리 메모리 주소로 변환 후의 값을 저장한다.
 
 
 
 
이러한 특징을 통해 장단점을 알 수 있는데,
가상 캐시의 장점은 MMU 의 변환을 통하지 않고 가상 메모리 주소를 직접 비교함으로써,
더욱 빠르게 캐시 메모리의 데이터를 수집할 수 있어 빠르다.
 
 
하지만,
가상 메모리를 확인하는 것이기 때문에 같은 가상 메모리 주소를 구분할 수 있는
어떤 알고리즘을 추가로 필요한다.
 
 
예를 들어,
프로세스의 ID ( PID ) 를 이용해 동일한 가상 주소를 구분하거나,
물리 메모리 tag 를 이용해 동일 가상 주소를 구분할 수 있다.
 
물리 캐시의 장단점은 가상 캐시와 반대라고 보면 된다.
 
 
=> 대부분의 캐시는 가상 캐시가 디폴트 이다.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

* 가상 메모리와 CPU <-> RAM 간의 데이터 처리 과정(종합)

 
 
 

 

 

=> 주소 버스는 CPU -> RAM 으로 '단방향' 이다.
 
 
=> CPU 는 데이터에 접근할 때, 캐시 메모리에 자신이 작업할 데이터가 존재하는지 확인한다.
이 후 MMU 에게 가상 메모리 주소를 넘겨준다.
 
MMU 는 TLB 에서 받은 가상 메모리 주소의 물리 주소가 저장되어있는지 확인한다.
있다면 바로 물리 메모리에 접근해 데이터를 받아오거나 수정하고
없다면 해당 프로세스의 '페이지 테이블 ( Page Table)' 에 접근해서 물리 주소를 받아온다.
 
 
=> OS 는 프로그램을 메모리에 올릴 때, 가상 메모리를 '페이징 ( Paging )' 한다.
현재 사용해야할 페이지를 메모리에 올리고 스케줄링으로 프로세스를 선별하고
해당 프로세스의 명령 코드들을 CPU 가 작업할 수 있도록 조종한다.
 

 

 

 

 

 

 

 

 

 

 

 

 
 

* Swap-In & Swap-Out

 
 
페이지가 2차 메모리에서 RAM 메모리로 이동하는 것을
'Swap-In' 또는 'Page-In' 이라고 한다.
 
반대의 상황 마찬가지로
OS 의 판단하에 다른 우선순위가 높은 페이지를 위해서 RAM 메모리가 부족할 때,
덜 중요한 페이지를 하드디스크 쪽으로 이동하게 하는 것을
'Swap-Out' 또는 'Page-Out' 이라고 한다.

 

 

 

 

 

 

 

 

 

 

 


 

참고 자료