반응형

  지난번까지 배웠던 프로세스에 관해 생각해보면, 하나의 프로세스는 4GB의 메모리공간을 가진다고 했습니다. (4GB의 공간이 정해진 이유는, 32bit 시스템에서 2의 32승이 4GB이기 때문입니다. 한번에 전달 가능한 주소값의 범위가 0~4GB라는 뜻입니다.)

그렇다면 일반적으로 4GB ~ 32GB의 범위를 갖는 주기억장치 RAM에는 동시에 최대 8개의 프로세스밖에 실행될 수 없는 것일까요? 단순히 작업 관리자만 켜보아도 수십,수백개의 프로세스가 실행되고 있는 것을 보아 그건 아닌 것을 알 수 있습니다. 이런 마법을 가능하게 하는 것이 가상 메모리, 페이징 시스템입니다.

 

1. 가상 메모리

  프로세스의 PCB인 4GB는 사실 모두 메모리(RAM)에 올라가는 것이 아닙니다. 당장 사용될 예정인 데이터만 메모리에 올라가게 되죠. 하지만 PCB는 0~4GB의 주소값을 가지고 있습니다. 이 주소값들은 어딜 가리키고 있는 걸까요?

  PCB에 할당된 4GB의 주소는 '가상'의 주소값입니다. 실제 물리 주소값이 아니라, 가상으로 주어진 주소값이라는 얘기죠. 우리가 이 가상 주소값을 호출하면, MMU(Memory Management Unit)이라는 장치에서 가상 주소값을 물리 주소값으로 변환해줍니다. 그럼 CPU에서 실제 물리값에 존재하는 데이터를 사용하여 프로세스를 실행하는 것이죠. 이런 방식으로 수십,수백개의 프로세스에 필요한 데이터를 메모리(RAM)에 올릴 수 있는 것입니다. 이렇게 메모리에 올려지는 데이터를 관리하는 시스템이 '페이징 시스템'입니다.

2. 페이징 시스템

  크기가 동일한 페이지라는 단위로 가상 주소와, 이에 매칭되는 물리 주소 공간을 관리하는 방식을 페이징 시스템이라고 합니다. 프로세스의 PCB는 4GB의 주소를 가지며, 4GB의 공간은 페이지라는 단위로 나뉘어져 관리됩니다. 페이지는 일반적으로 4KB의 크기를 가지며, intel x86시스템에서는 4KB, 2MB, 1GB의 페이지 단위 설정이 가능합니다. (리눅스는 4KB 고정이며, 4GB / 4KB 만큼의 페이지가 존재합니다.)

  아래 그림과 같이 프로세스 A의 PCB는 여러 개의 페이지로 나누어지며, 페이지 테이블을 통하여 메모리의 실제 물리 공간에 있는 페이지 프레임과 매칭됩니다.(페이지와 페이지 프레임은 같은 개념이며 가상 메모리 상의 공간단위를 페이지, 실제 물리 메모리 상의 공간을 페이지 프레임이라고 합니다.) 페이지 테이블은 메모리에 올려져 있으며, 페이지 테이블의 시작 주소가 PCB에 저장되어 있습니다.

 

* 페이지 : 가상 메모리 공간(PCB)를 동일 크기로 나눈 것

* 페이지 테이블 : Dictionary와 같이 '가상 주소값' : '실제 주소값'의 매칭 정보 보관

* 페이지 프레임 : 실제 메모리 공간을 동일 크기로 나눈 것

  페이지를 사용하여 데이터 접근 시, 아래와 같이 페이지 번호와 Offset값을 전달하면 정확한 데이터의 위치에 접근할 수 있습니다.

* 다중 단계 페이징 시스템 : 위와 같이 명령어의 일부분을 페이지 번호(p), 변위(d)로 나타내게 되면 32bit 시스템에서는 모든 페이지를 나타내기 위해서 최소 20개의 bit(100만개의 페이지)가 필요하고, 나머지 12개의 bit는 변위를 나타내게 됩니다. 이를 효율적으로 활용하기 위해서, 사용하지 않는 페이지는 주소값을 생성하지 않고, 필요한 페이지의 주소정보만 생성하여 관리하는 시스템을 다중 단계 페이징 시스템이라고 합니다. 다중 단계 페이징 시스템에서는 페이지 [디렉토리 - 페이지 테이블 - 변위] 라는 계층적 구조를 이루고 있습니다. 

  

지금까지 학습한 내용을 정리해보면,

  1. CPU에서 프로세스 A에서 필요한 데이터의 가상 주소를 MMU에 전달

  2. MMU에서 메모리에 올려져 있는 페이지 테이블에 접근하여 전달받은 가상 주소와 매칭되는 물리 주소값을 찾아냄

  3. 메모리에서 Data를 CPU로 전달

과 같은 과정을 거치게 됩니다.

 

 

Computer Architecture에서도 배웠지만, 일반적으로 속도가 빠른 메모리일수록 비싸고, 중요한 곳에 사용됩니다. 위와 같이 CPU에서 요청한 데이터를 불러오는데 MMU, Memory같이 상대적으로 속도가 느린 메모리를 참조하게 되면 CPU 입장에서는 엄청난 시간 Loss가 발생하게 되죠.

 

  이같은 Loss를 방지하기 위하여 시스템에는 TLB(Translation Lookaside Buffer)라는 메모리가 존재합니다. 해당 메모리에는 최근 사용한(혹은 사용할 가능성이 높은) '가상 메모리'에 매칭되는 실제 물리 주소값이 기록되어 있어, TLB에 존재하는 데이터에 한해서는 MMU가 주기억장치의 페이지 테이블을 참조하지 않아도 됩니다. (속도 ↑) 

  MMU가 CPU로부터 가상 메모리를 전달받으면, 우선 TLB에 매칭되는 물리 주소값이 있는지 확인한 뒤 없으면 페이지 테이블을 참조하게 됩니다.

 

* 요구 페이징 : 프로세스가 실행되기 위해서는 프로그램이 메모리에 올라가야 하는데, 이 때 모든 데이터를 주기억장치(RAM)에 올리는 것이 아니라 실행 시점에 필요한 데이터만 메모리에 올리며, 더이상 필요하지 않은 페이지 프레임은 다시 저장매체(HDD, SSD)로 이동시킵니다. 이같은 방식을 요구 페이징이라고 부릅니다.

  이와 같이 필요하다고 생각되는 데이터만 메모리에 올리는 과정에서, CPU가 요청한 데이터가 메모리에 올라가져있지 않은 상황이 발생할 수 있습니다. 이같은 상황이 일어나면 페이지 폴트(Page Fault)라는 인터럽트가 발생하며, 해당 인터럽트를 받은 OS는 저장매체에서 메모리로 필요한 페이지를 이동시키게 됩니다. 페이지 폴트가 많이 일어나면 실행 시간에 많은 Loss가 생깁니다.

 

  이제 정말 마지막으로 CPU에서 가상 메모리를 바탕으로 프로세스 실행에 필요한 데이터에 접근하는 과정을 살펴보겠습니다.

 

  1. CPU에서 가상 주소값을 MMU로 전달

  2. MMU에서 전달받은 가상 주소값을 TLB에서 확인

  3. 있으면 바로 매칭되는 물리 주소값에 접근, 없으면 메모리의 페이지 테이블에서 매칭되는 값을 찾은 후 해당 물리 주소값에 접근

  (이 때 요청된 데이터가 메모리에 존재하지 않아 페이지 테이블에 없다면, 페이지 폴트가 발생하며 저장매체에서 해당 데이터가 메모리로 로드된다. 데이터가 로드된 이후에는 페이지 테이블이 업데이트되며, 가상 주소값을 다시 전달받아 1번부터 다시 수행한다.)

  4. 물리 주소값에 존재하는 데이터를 CPU로 전달

 

이상 가상 메모리와 페이징 시스템에 대해서 알아보았습니다. 끝-!

 

* 세그멘테이션 기법 : 페이징 시스템에서는 동일한 크기를 가지는 페이지의 단위로 물리 메모리가 나뉘어졌다면, 세그멘테이션 기법에서는 이 단위가 유동적입니다. 페이징 시스템에 비하여 유동적으로 메모리를 관리할 수 있다는 점이 좋지만, 그만큼 복잡하기도 하고 하드웨어적인 지원이 되어야 합니다.

반응형

+ Recent posts