프로세스 메모리(Process Memory)

Tony·2023년 5월 11일
0

Process

목록 보기
2/2

Intro

독자가 프로세스 메모리의 구조를 알고있다는 가정하에서 글을 쓰고 있습니다.
각각의 프로세스는 하나의 가상 메모리에서 독립적인 가상 메모리 공간을 가집니다. 물리 메모리의 크기에 대한 한계를 극복하기 위해 만든만큼, 보통 물리 메모리보다 훨씬 크기가 큽니다.
프로세스가 동작할때, 항상 모든 데이터가 전부 필요한 것은 아닙니다. 또한, 프로그램은 물리 메모리에 한번에 적재하기에 크기가 클 수도 있습니다. 이러한 점을 통해, 개발자들은 프로세스의 일부만을 물리 메모리에 적재하여 프로세스를 실행시키려고 했습니다. 그 노력의 산물이 가상 메모리입니다.
가상 메모리를 활용하여 최대한 물리 메모리를 적게 사용하면서 최대한 많은 프로세스를 실행시키기 위해, 다음과 같은 방법을 사용합니다.

조각내기

필요한 만큼 데이터를 적재하여 프로세스를 실행시키기 위해서는, 프로그램을 잘게 나누어야 합니다. 이때, 아무렇게나 조각내면 OS가 어디에서 어디부터가 한 조각인지 판별하기가 힘듭니다. 따라서 일정한 단위별로 조각을 냅니다. 이를 프레임(Frame)이라고 합니다.
이제, 디스크로부터 프로그램을 자유롭게 일부만 적재할 수 있습니다. 하지만, 조각을 내었기 때문에 필요한 만큼 적재할 수 있더라도 여러 프로그램으로부터의 조각이 서로 뒤섞여 있을 것입니다. 이러한 상황에서, 프로세스를 어떻게 실행해야할까요?
간단한 방법은 같은 프로그램으로부터의 프레임끼리 모으면 됩니다. 그런데, 물리적으로 프레임을 계속 모으려면 상당한 오버헤드를 감수해야합니다. 필요한 만큼만 적재해서 사용하기 때문에 언젠가는 해당 프레임이 필요없어져서 버리고, 필요한 다른 프레임을 적재할 것이기 때문입니다. 이 과정에서 프레임들은 다시 서로 섞입니다.
가상 메모리는 이 문제는 깔끔하게 해결합니다.

가상 메모리

이제 프로그램은 프레임단위로 조각이 났습니다. 따라서 가상 메모리에서도 프로그램은 프레임단위로 나타내어집니다. 가상 메모리에서는 프레임을 페이지(Page)라고 부릅니다.
가상 메모리를 사용하면 좋은 점은, 모든 페이지들이 정렬(연속)된 상태라고 가정한다는 점입니다. 이렇게 구현하기 위해서는 페이지와 프레임을 변환해주는 작업이 필요합니다. 가상 메모리 모델에서는 이 작업을 Memory Management Unit(MMU) 이라는 별도의 하드웨어에 떠맡깁니다. 이로써, 가상 메모리는 프레임들의 위치에 영향받지 않고 마치 프로그램 전체를 메모리에 적재한 것 처럼 프로세스를 실행할 수 있습니다.

주소 변환

MMU는 Page Table 을 사용하여 가상 메모리 주소와 물리 메모리 주소를 변환합니다.

- 페이지 테이블(Page Table)

페이지, 프레임 번호
페이지와 프레임은 번호를 지닙니다. 0에서부터 시작합니다. 그러므로, 각 프레임은 물리 메모리에서 독립적인 번호를 지닙니다. 페이지 가상 메모리에서 독립적인 번호를 지닙니다.

페이지 테이블 엔트리
페이지 테이블은 페이지 번호와 프레임 번호를 연결짓습니다. 페이지 테이블의 엔트리의 개수는 가상 메모리에 있는 페이지의 개수와 같습니다.
이러한 페이지 테이블 엔트리는 프레임 번호와 페이지 메타데이터를 지닙니다.

페이지 테이블 크기
페이지 테이블의 크기는 가상 메모리에 있는 페이지 개수와 비례합니다. 하지만, 물리 메모리의 크기는 제한되어 있으므로 페이지 테이블의 크기는 물리 메모리에 의해 제한됩니다.
만약, 가상 메모리 크기가 2^32이고 페이지 크기가 4KiB라고 가정해봅시다. 4KiB = 2^15 이므로 페이지의 개수는 2^17입니다.
따라서 최대 페이지 테이블의 크기는 2^17 * (페이지 엔트리 1개 크기) 입니다. 하지만, 프레임의 개수가 2^17개 이하라면 페이지 테이블의 크기는 그만큼 작아집니다.

페이지 테이블의 계층 구조
가상 주소의 크기가 크면, 페이지 테이블도 메모리에 적재하기 힘들어 질 수 있습니다. 이때, 페이지 테이블의 페이지 테이블을 만들면 문제를 해결할 수 있습니다. 앞의 예제를 다시 가져오겠습니다.
가상 메모리 크기 : 2^32
페이지 크기: 2^15
페이지 개수: 2^17
페이지 테이블 엔트리 1개 크기: 32B = 2^8
-> 페이지 테이블 크기: 2^25
2차 페이지 테이블 크기: 2^25 / 2^15 * 2^8 = 2^18
위의 계산에서 볼 수 있듯이, 2차 페이지 테이블은 원래의 페이지 테이블보다 획기적으로 크기가 작아집니다.
하지만, 이렇게 다차원의 페이지 테이블을 사용하면 페이지 테이블을 여러번 거쳐서 주소 번역이 되기 때문에 성능상의 저하가 있습니다.

- Page Fault

Page Fault는 Interrupt의 한 종류이고, exception에 해당합니다. 다음과 같은 상황에서 발생합니다.

  • 접근하고자 하는 페이지에 대한 프레임이 메모리에 적재되지 않은 상태
  • 접근하고자 하는 페이지 테이블 엔트리에 대한 프레임이 메모리에 적재되지 않은 상태

Page Fault가 발생하면, Intterupt Service Routine이 실행되어 OS가 디스크로부터 해당 프레임을 찾아 적재합니다. 그리고 프로세스의 실행을 이어나갑니다.

- TLB(Translation Lookaside Buffer)

TLB는 SRAM 캐시로서 메모리보다 읽기/쓰기 속도가 월등합니다. 하지만, 비싸고 용량이 작습니다. 따라서 TLB에는 최근에 읽은 페이지 테이블 엔트리를 남겨 주소 변환이 빠르게 이루어질 수 있도록 합니다.

- TLB miss

주소 변환을 할때, TLB가 있다면 가장 먼저 TLB에서 페이지 테이블 엔트리를 찾습니다. 찾고자 하는 페이지 테이블 엔트리가 없을때, 이를 TLB miss라고 합니다.
TLB miss가 나면, 페이지 테이블에서 찾게 됩니다. 그리고 찾은 페이지 테이블 엔트리를 TLB에 캐시합니다.

0개의 댓글