안녕하세요? 허니입니다. 기존에는 실제 메모리를 발전하려고 하는 시도가 매우 많았습니다. 하지만 운영체제가 발전하면서 실 메모리를 효과적으로 보다 잘쓰기 위한 연구가 진행되면서 가상 메모리라는 기법이 나오게 되었습니다. 실제 메모리보다 훨씬 더 많은 양의 메모리 영역을 확보할 수 있는 가상 메모리란 무엇인지에 대해 포스팅해 보겠습니다. 학생이나 연구원분들에게 많은 도움이 될 것이라고 생각하며 언제든지 질문은 환영입니다.

 


오늘의 주제

 

 가상메모리란 무엇인가.
 가상메모리의 필요성
 페이징(Paging)
 페이지 테이블(Page table)
 페이지 테이블 에트리(PTE, Page Table Entry)
 

가상메모리란 무엇인가?

 

메모리로서 실제 존재하지는 않지만 사용자에게 있어 메모리로써의 역할을 하는 메모리라고 표현하면 적절하다. 다시 말해 프로그램이 수용될 때는 가상메모리의 크기에 맞춰 수용되는 것이다. 그러나 가상메모리에 수용된 프로그램이 실행될 때는 실제 물리 메모리를 필요로 하게 되는 것이다. 그렇다면 가상메모리는 왜 필요한 것일까. 컴퓨터 시스템이 구조적인 발전을 거듭하기 위해서는 참으로 많은 인력과 시간의 투자가 있어야 한다. 처리속도가 빨라지는 것, 또한 메모리가 증가되는 것, 모뎀 속도가 향상되는 것 등의 발전은 결코 쉬운 것이 아니다. 보다 중요한 것은 프로그램의 용량이 커지는 것에 비해 메모리 용량을 크게 한다는 것은 참으로 많은 걸림돌이 존재한다는 것이다. 그렇기에 프로그램을 사용하는 이들로서는 한정된 메모리의 크기를 고려해야 한다는 것은 대단한 골칫거리가 아닐 수 없다. 바로 이러한 문제를 해결하기 위해 등장한 것이 가상 메모리인 것이다.

 

 다음과 같은 예를 한번 들어보자.

우리가 컴퓨터를 전공하게 된다면 학습에 필요한 서적들은 아마도 수 백 권에 이를 것이다. 그러나 만약 책상에 보관할 수 있는 분량만큼의 서적을 구입할 수밖에 없다면 어떨까. 공부할 책들을 최소화하기 위해 몇 일 밤낮 고생을 해야 할지도 모르겠다. 그러나 책장을 마련해 그곳에 필요한 컴퓨터 관련 책들을 꽂아두고 당장 필요한 책들을 뽑아 책상으로 옮겨온다면 책상 크기에 맞춰 서적을 구입하는 문제는 해결될 것이다. 여기서 책들은 프로그램, 책장이 바로 가상메모리이고 책상은 실제 메모리가 되는 것이다. 
 

 가상메모리는 실제 메모리보다 휠씬 큰 용량을 가지고 있다.

10배에서 20배까지라고 생각해두면 될 것이다. 그렇기에 프로그램 사용자들은 실제 메모리 용량이 아닌 가상 메모리 용량에 맞춰 프로그램을 사용할 수 있기에 보다 자유로울 수가 있는 것이다. 그렇지만 가상 메모리 안에서 프로그램이 실행될 때는 실제메모리에 머물러 있어야 하는 것이 아닌가. 당연한 말이다. 그러나 프로그램이 실행될 때 반드시 프로그램 전체가 실제 메모리에 있을 필요는 없다. 현재 실행되어야 하는 부분만이 실제 메모리에 옮겨져 있으면 되는 것이므로 실제 메모리용량보다 큰 프로그램이 가상메모리를 통해 실행 가능하게 된 것이다. 그렇다면 여기서 꼭 짚어봐야 할 것이 한 가지 있다. 가상메모리에 프로그램이 실행될 경우 어떤 과정을 통해 실제 메모리로 옮겨지게 되는 것일까. 책장에 꽂혀있는 수 백 권의 책들 중에서 현재 읽어야 할 책들을 보다 빠르게 보다 정확하게 책상으로 옮겨다 줄 무엇인가가 필요한 것처럼 말이다. 바로 이러한 역할을 맡고 있는 것을 mapping이라고 한다. 현재 mapping은 MMU라는 하드웨어에 의해 지원되고 있다.

 잠깐, 상식!

MMU (Memory Management Unit):MMU는 메모리를 효율적으로 관리할 수 있도록 여러 가지 기능을 하드웨어로 구현한 반도체칩을 말한다. CPU와 메모리의 중간에 위치하여 프로그램에서 사용되는 가상주소를 메모리에 해당하는 물리적 주소로 변환하는 작업을 수행한다.


가상메모리와 실제 메모리 사이의 재빠른 중계의 역할을 맡고 있는 매핑은 paging과 segmentation, 그리고 이 두 가지 방식을 혼합한 방법 등 3가지가 있다. 현재 가장 각광받고 있는 방법은 이제부터 설명할 paging 방법으로 그만큼 보다 상세한 강의가 진행될 것이다.
 


페이징 (paging)


페이징 방식에서는 가상메모리상의 주소공간을 일정한 크기의 페이지로 분할하게 되는데 실제 메모리 또한 가상메모리와 같은 크기로 페이지를 분할하게 된다. 페이지는 1Kbyte, 2Kbyte, 4Kbyte등으로 시스템에 따라 그 크기가 정해져 있지만 대부분의 경우 4Kbyte의 크기를 사용한다. 페이지 크기는 단편화를 고려해 작을수록 좋겠지만 무조건 작은 것 역시 문젯거리가 발생한다. 페이지 크기를 작게 한다는 것은 그만큼 페이지의 수가 많아지는 것을 의미한다. 이렇게 되면 페이지 단위의 입/출력이 너무 자주 일어나게 되어 그 만큼 전체적인 시스템 처리성능이 저하되기 때문이다.
 

 그렇다면 페이지 테이블이란 과연 무엇인가.

가상 메모리와 실제 메모리를 페이지로 나누어 놓았다고 해서 페이지끼리 자율적으로 매핑을 할 수 있을까. 바로 매핑이 가능하기 위해서는 가상메모리의 페이지와 실제메모리의 페이지를 연결시켜주기 위한 매핑 테이블이 필요한 것이다. 이러한 역할을 하게 되는 테이블이 바로 페이지테이블인 것이다. 페이지테이블은 가상메모리의 페이지넘버와 실제메모리의 페이지프레임이 하나의 순서쌍으로 저장하고 있는 도표이다. 이러한 도표를 사용하여 프로그램에서 사용되는 가상주소를 실제메모리주소로 변환되게 된다. 도서관에서 몇 번 책장에 어떤 책이 꽂혀있다는 열람자료가 없다면 우리는 책 한 권을 찾기 위해 온종일 헤맬지도 모르는 일이다.
 

 잠깐,상식!

페이지프레임(page frame): 가상메모리에서 사용되는 하나의 페이지에 대응하는 실제 메모리 영역을 말한다. 가상메모리에서 사용되는 페이지와 같은 크기를 갖고 있다.

 
이러한 페이지 테이블은 메모리 안에 존재하게 되는데 페이지테이블이 메모리 안에 존재함으로써 시스템의 성능은 하락할 수밖에 없다. 왜냐하면 메모리영역에 두 번의 접근을 시도해야 하기 때문이다. 페이지테이블을 통해 주소를 찾기 위한 한번의 접근과 페이지테이블을 통해 확인된 실제메모리페이지프레임에 접근하는데 한 번이 필요하다. 이러한 문제점을 해결하기 위해 앞서 언급한 MMU라는 하드웨어를 통해 매핑을 시키는 것이다. 프로그램 외부영역에 위치한 하드웨어의 지원을 받아 매핑 기능을 수행하게 되면 매핑을 위한 메모리 접근이 필요치 않기 때문이다.

 


자, 이제 우리는 가상 주소의 bit에 대하여 생각해 보자.


주소 bit를 살펴보는 이유는 그 안에 어떠한 정보들이 담겨 있기에 가상 메모리 주소가 실제메모리를 찾아가게 되는 것인가를 알아보기 위해서이다. CPU에서 하나의 프로세스가 수행되기 위해선 주소버스(address bus)를 통해 주소비트(address bit)를 보내게 된다.

 잠깐, 상식!


주소버스(address bus)란 메모리의 주소가 전달되는 버스를 의미하며, 주소비트(address bit)란 메모리에 주소를 지정하기 위하여 사용되는 비트를 말한다.

 
CPU가 갖는 주소버스가 32bit일 경우 32bit의 가상주소비트가 보내지는 것이다. 32bit의 가상주소비트가 보내지면 이중 20bit를 차지하는 가상페이지넘버를 가지고 페이지테이블을 찾게 된다. 또한 나머지 12bit의 페이지내부주소(offset)를 가지고 페이지의 상대적인 위치를 찾게 된다. 다시 말해 가상페이지넘버를 가지고 실제 메모리상의 페이지프레임의 시작번지를 찾게 되는 것이고 페이지내부주소(offset)를 가지고 현재 필요로 하는 데이터가 페이지프레임 내부 어디에 위치해 있나를 확인하게 되는 것이다. 바로 페이지프레임 시작번지에 내부 주소를 더해야만 실제 주소가 구해지는 것이다. 이렇게 실제페이지주소를 찾기 위해 사용되는 가상주소를 PTE(Page Table Entry)라 한다.


요점정리

 

 가상메모리란

메모리로서 실제 존재하지는 않지만 사용자에게 있어 메모리로써의 역할을 하는 가상의 메모리라고 표현하면 적절하다. 다시 말해 프로그램이 수용될 때는 가상메모리의 크기에 맞춰 수용되는 것이다. 그러나 가상메모리에 수용된 프로그램이 실행될 때는 실제 메모리를 필요로 하게 되는 것이다.

 가상 메모리와 실제 메모리의 관계

가상메모리 안에 프로그램이 실행될 때는 실제메모리에 머물러 있어야 한다.
그러나 프로그램 실행 시 반드시 프로그램 전체가 실제 메모리에 있을 필요는 없다. 현재    실행되어야 하는 부분만이 실제 메모리에 옮겨져 있으면 되는 것이므로 실제 메모리용량   보다 큰 프로그램이 가상 메모리의 등장으로 실행 가능한 것이다.

 mapping이란

가상메모리에 프로그램이 실행될 경우 어떤 과정을 통해 실제 메모리로 옮겨지게 되는데 이를 mapping이라고 한다. 현재 mapping은 MMU라는 하드웨어에 의해 지원되고 있다.

 paging이란
페이징 방식에서는 가상메모리상의 주소공간을 일정한 크기의 페이지로 분할하게 되는데 실제 메모리 또한 가상메모리와 같은 크기로 페이지를 분할하게 된다.

 page table이란

페이지테이블은 가상메모리의 페이지넘버와 실제메모리의 페이지프레임이 하나의 순서쌍으로 저장하고 있는 도표이다. 이러한 도표를 사용하여 프로그램에서 사용되는 가상주소를 실제메모리주소로 변환되게 된다.

32bit의 가상주소비트

32bit의 가상주소비트가 보내지면 이중 20bit를 차지하는 가상페이지넘버를 가지고 실제 메모리상의 페이지프레임의 시작번지를 찾고 페이지내부주소(offset)를 가지고 현재 필요로 하는 데이터가 페이지프레임 내부 어디에 위치해 있나를 확인하게 된다. 바로 페이지프레임 시작번지에 내부 주소를 더해야만 실제 주소가 구해지는 것이다.

 

목 차

 운영체제를 시작하는 분들을 위해

 운영체제의 역사와 구체적으로 어떤 일들을 수행하나요?

 운영체제의 목표와 역할이 미래에도 계속 증대될까요?

 운영체제를 이해하기 위해 필요한 기본 개념들은 무엇인가요?

 운영체제 프로세스 생애주기(Process Lifecycle)는 무엇인가요?

 운영체제 프로세스 관리(Process Management)는 어떻게 하나요?

 운영체제 프로세스(Process)의 처리 속도는 어떻게 높일까?

 운영체제 스레드(Thread)는 무엇인가요?

 운영체제 스케줄링 (Scheduling)은 어떻게 하나요?

 운영체제 스케줄링 알고리즘의 비교 기준이 있나요?

 운영체제 프로세스 동기화가 무엇인가요?

 운영체제에서 세마포어(Semaphore)란?

 운영체제 메모리 관리(Memory Management)는 어떻게 하나요?

 운영체제 메모리 분할 방법은 어떻게 하나요?

 운영체제 가상메모리(Virtual Memory)는 무엇인가요?

 운영체제 Page in/out, Swapping 등이 Page Table Entry와 어떤 관계인가요?

 운영체제 메모리 관련해서 알아야 할 개념은 어떤것이 있나요? (TLB, Locality, Working Set, Overlay)

 운영체제 Page replacement (페이지 대체) 알고리즘이란?

 운영체제 파일시스템(File System)은 어떻게 운영되나요?

 운영체제 파일시스템 내부구조는 어떻게 되나요?

 운영체제 디스크 공간 할당(Disk Space Allocation) 알고리즘과 효과적 알고리즘의 판단 기준은?

 운영체제 파일시스템에서 접근 시간, 디스크 스케줄링을 위한 알고리즘, I/O 시스템이란?

 리눅스 인터럽트 (Interrupt)에 대해 자세히 설명해 주세요.

 인텔 구조에서 운영체제 가상 메모리 (Virtual Memory)는?

 운영체제 아키텍처의 종류는 얼마나 있나요?

 

+ Recent posts