본문 바로가기

CS/CA, OS

메모리관리, 페이징(Paging)

개요

컴퓨터가 메모리 관리하는 법에 대해서 간단하게 살펴보며, 현대에서 사용하는 페이징 기법에 대해서 공부해보자.

 

논리, 물리 주소 공간

CPU가 생성하는 주소를 논리주소, 메모리가 취급하는 주소를 물리 주소라고 부른다.

실행 시간 바인딩 기법에서는 논리, 물리 주소가 서로 다르다. 

이 때 논리 주소를 가상 주소 라고 부른다.

 

실행 중에 가상주소->물리주소 변환이 필요한데 이러한 작업은 하드웨어인 MMU(Memory Management Unit)이 한다.

https://ko.wikipedia.org/wiki/%EB%A9%94%EB%AA%A8%EB%A6%AC_%EA%B4%80%EB%A6%AC_%EC%9E%A5%EC%B9%98

 

메모리 관리 장치 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 모토로라 68010 마이크로프로세서와 함께 사용되었던 68451 MMU. 예전에는 MMU가 이와 같이 따로 분리된 하드웨어였지만 최근의 아키텍처에서는 프로세서와 같은

ko.wikipedia.org

 

동적 적재, 연결

동적 적재

프로세스 실행을 위해서는 프로그램이 메모리에 올라와야 한다.

하지만 모든 데이터가 다 적재되어야 해당 프로세스를 실행할 수 있다면, 

메모리 공간이 항상 프로세스의 크기보다 커야 한다.

 

하지만 현대 프로그램 특히 게임 같이 용량이 큰 프로그램은 RAM보다 용량이 크다.

또한 컴퓨터는 여러 프로세스를 동시에 실행시켜야 하기 때문에 dynamic loading 방법을 사용한다.

 

dynamic loading은 실제 사용되기 전에 데이터는 디스크에서 대기하고, 실제로 사용할 때 메모리에 올라와서 실행되는 방식이다.

필요한 경우에만 적재되기 때문에 용량은 크지만 자주 실행되지 않는 루틴의 경우에 유용하다.

 

동적 연결

프로그램을 실행할 때 라이브러리가 연결된 경우 프로그램에 라이브러리를 포함시켜야 한다.

이 때 프로그램 자체에 라이브러리를 포함시켜 내부에서 링크하는 것을 static linking이라고 하며,

프로그램 외부에 있는 라이브러리를 포함시키는 것을 dynamic linking이라고 한다.

 

dynamic linking을 사용한다면, 프로그램마다 중복되는 라이브러리를 외부 한곳에 놓고 참조할 수 있기 때문에 용량 낭비를 하지 않게 된다. 시스템 라이브러리 같은 곳에서 많이 사용한다.

 

dynamic linking 시에는 라이브러리를 호출하는 곳에 stub이(PLT/IAT) 생긴다. stub은 동적 라이브러리 참조를 도와준다. 

 

Windows는 시스템 라이브러리를 대부분DLL(Dynamic Link Library)형태로 제공한다.

https://learn.microsoft.com/ko-kr/windows/win32/dlls/dynamic-link-libraries

 

Dynamic-Link 라이브러리(Dynamic-Link 라이브러리) - Win32 apps

DLL(동적 연결 라이브러리)은 다른 모듈(애플리케이션 또는 DLL)에서 사용할 수 있는 함수 및 데이터를 포함하는 모듈입니다.

learn.microsoft.com


스와핑

프로세스는 실행 중에 RAM이 부족하면 OS에 의해 저장장치로 swap되었다, 실행을 위해 다시 swap될 수 있다.

이를 통해 degree of multiprogramming을 증가시킬 수 있다.

 

현대 운영체제는 기본 스와핑이 아닌 필요한 부분만 swap in, out 하는 변형 스와핑을 한다.


단편화(Fragmentation)

프로세스들이 메모리에 적재되고 제거되는 일이 반복되면 남는 공간이 일정하지 않을 수 있다.

특히 어떤 공간은 작아서 프로세스 메모리를 할당받을 수 없게된다.

https://ko.wikipedia.org/wiki/%EB%8B%A8%ED%8E%B8%ED%99%94

 

단편화 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 단편화(斷片化, fragmentation)는 기억 장치의 빈 공간 또는 자료가 여러 개의 조각으로 나뉘는 현상을 말한다. 이 현상은 기억장치의 사용 가능한 공간을 줄이거나

ko.wikipedia.org

 

외부 단편화: 이러한 작은 공간들을 합치면 프로세스를 실행시킬 정도의 큰 공간이 되지만, 떨어져 있어 합치지 못하기 때문에 발생하는 단편화이다.

 

내부 단편화: 프로그램이 필요한 크기보다 더 큰 공간을 할당해서 발생하는 단편화이다.


Segmentation은 스킵


페이징(Paging)

페이징은 메모리를 일정한 크기로 나누고 이를 필요 시에 할당한다. 

따라서 페이징은 물리공간이 연속적이지 않더라도, 메모리 적재가 가능하다.

또한 페이지라는 일정한 크기로 메모리를 나눴기 때문에 외부 단편화가 없다.  물론 여전히 내부 단편화는 존재할 수 있다.

 

페이징 기법은 OS와 하드웨어의 연계를 통해 구현된다.

 

기본 방법

물리 메모리는 프레임, 가상 메모리는 페이지 라는 같은 크기의 블록으로 나눈다.

현대에는 대부분 4KB의 페이지 크기를 활용한다. (추후 커질 가능성도 있음)

 

논리 주소와 물리 주소가 완벽하게 분리되어, 물리 메모리의 크기보다 논리 메모리의 크기가 크더라도, 문제가 없다.

 

페이지와 프레임을 1대1로 매핑시켜, 해당 페이지에 대한 작업을 실제로는 프레임에 대한 작업으로 만든다. 

 

페이지 테이블

페이징을 위해서는 페이지가 어느 프레임에 매핑되는지에 대한 정보가 필요한데 이를 위해 페이지 테이블을 사용한다.

페이지 테이블은 가상 페이지 번호에 대한 물리 프레임 번호를 저장한다.

이를 MMU가 참조하여 가상 -> 물리 주소 변환을 한다.

https://en.wikipedia.org/wiki/Page_table

 

Page table - Wikipedia

From Wikipedia, the free encyclopedia Data structure that maps virtual addresses with physical addresses Relationship between pages addressed by virtual addresses and the pages in physical memory, within a simple address space scheme. Physical memory can c

en.wikipedia.org

 

페이징을 사용하는 시스템의 주소는 페이지 번호, 페이지 오프셋으로 주소가 구성된다.

페이징 오프셋은 하나의 페이지 내에서의 위치이며 (4KB인경우 12비트), 페이지 번호는 페이지 테이블 내에서의 인덱스를 뜻한다.(현대에는 계층이 세분화 됨)

 

하드웨어 지원

Windows는 프로세스마다 개별 페이지 테이블을 가진다.

프로세스 전환 시에 OS는 CR3 레지스터라는 곳에 해당 프로세스의 페이지 테이블 주소를 설정하고, MMU는 이 테이블을 기준으로 가상 주소를 해석한다.

 

이를 통해 다른 프로세스 간 메모리 접근을 차단할 수 있다.

 

다만 레지스터 -> 테이블 이라는 두번의 접근이 필요하므로, 더 빠른 접근을 위해 TLB(Translation Look-aside Buffer)라는 페이지 전용 캐시를 사용한다.

 

일반적인 캐시 처럼 TLB에서 먼저 찾고 없다면 TLB미스가나며, 페이지 테이블을 직접 접근한다.

 

다만 TLB또한 프로세스마다 겹치면 안되기 때문에 프로세스 전환 시에 flush가 필요할 수 있다.

이를 완화하기 위해, ASID(Address-Space Identifiers)를 활용해, TLB에 어떤 프로세스 소속인지에 대해 점검한다.

 

추가적으로 페이지 테이블에는 각종 bit가 있어 페이지의 권한 등을 판단할 수 있다.

 

처음으로 페이지 테이블에 매핑이 이루어질 때는 아래와 같은 상황이 일어난다.

1. 프로그램이 가상 주소에 접근했을 때 TLB에 매핑정보를 찾는다. 없다면 페이지 테이블에서 찾는다.

2. 없다면 Page Fault가 발생한다. CPU가 OS에 예외를 전달한다.

3. OS가 개입하여, 해당 주소가 합법적인지 확인하고, 필요 시에 물리 메모리에서 빈 프레임을 할당한다.

4. 페이지 테이블에 필요한 정보를 설정하는 등 페이지 테이블과 TLB를 업데이트 한다.

 


요구 페이징(Demand Paging)

실행 프로그램을 디스크에서 메모리로 적재할 때 실제로 접근하는 페이지만 적재하는 것을 demang paging이라고 한다.

페이지의 in, out은 OS의 pager가 해준다.

 

프로세스가 메모리에 올라와 있지 않은 페이지를 접근한다면 page fault trap이 발생한다.

page fault는 아래와 같은 순서로 처리한다.

1. pager는 해당 프로세스 내부 테이블을 확인해 필요한 페이지가 valid, invalid인지 확인한다.

2. invalid이면서 유효하지 않은 페이지에 대한 참조라면 프로세스는 중단된다, invalid이지만 유효한 참조라면(페이지가 디스크에 있음) 디스크에서 메모리로 페이지를 불러온다.

3. 빈 공간(프레임)을 찾는다.

4. 프레임에 요청한 페이지(디스크 상에 존재하는 실제 데이터 블록)를 읽어들인다.

5. 페이지 테이블을 갱신한다.

6. trap으로 중단되었던 명령어를 다시 실행한다. 이후에는 페이지 테이블(+ TLB)을 통해 페이지를 접근한다.


스래싱(Thrashing)

실행에 필요한 최소한의 프레임을 받지 못한 프로세스는 프레임을 할당받지 못했기 때문에 페이지 테이블을 접근하면 페이지 폴트가 발생한다. 

그런데 페이지를 교체한다면, 교체된 페이지는 다시 프레임을 요구하고, 프레임이 부족하기 때문에 계속해서 페이지 폴트가 발생한다.

연쇄적인 반응을 통해 성능이 급격히 저하되는데, 이를 Thrashing이라고 한다.


페이지의 상태(OS, Hardware)

페이지는 운영체제와  하드웨어가 같이 관리한다.

OS는 페이지를 Free, Reserved Commit 상태로 구분하고 추적한다.

Free는 사용하지 않는 상태로 해당 위치를 접근하면 에러를 낸다.

Reserved는 주소 공간만 선점한 상태로 프로세스 내에서 해당 주소 범위를 다른 용도로 사용하지 못하도록 한다.

Commit은 해당 주소 범위에 대해 실제 물리 메모리나 페이지 파일 공간을 확보한 상태이며, 이 주소에 실제로 접근할 경우 페이지 폴트가 발생하여 가상 메모리와 물리 메모리가 매핑된다.

현재 프로세스 스택의 상황이다. 보면?는 아직 커밋되지 않은 reserve 페이지 처럼 보인다.

하지만 실제로는 해당 메모리 바로 위는 가드 페이지로, 접근 시 page fault를 유발해 OS가 실제 페이지를 물리메모리와 매핑할 수 있도록 한다.

가드 페이지는 commit 상태이다.


추후 수정 및 추가 예정

 

내용은 operating system concepts 에센셜을 참고했습니다

 

 

 

 

'CS > CA, OS' 카테고리의 다른 글

Windows 스레드 스케줄링 간단하게 알아보기  (0) 2025.12.31
컴퓨터의 CPU (3) - 캐시 메모리  (1) 2025.05.10
컴퓨터의 시간측정  (0) 2025.04.29
컴퓨터의 CPU (2) - 레지스터  (0) 2025.04.19
컴퓨터의 프로세스  (0) 2025.04.05