Kim Jinung

7. 메모리 관리 본문

Computer Science/Operating System

7. 메모리 관리

Kim Jinung 2023. 1. 9. 22:20
메모리 관리에 관하여

현대 컴퓨터 시스템에서 프로그램을 실행 하려면 메인 메모리에 적재해야 한다. 운영체제는 CPU 자원의 사용을 극대화 하고 프로세스를 다중으로 실행하기 위해 CPU 스케줄링 기법 등이 발전해왔다. 프로세스 스케줄링, CPU 스케줄링 그리고 멀티 스레드와 같은 기법들이 그 예이다. 그렇다면 실질적으로 CPU가 실행할 명령어나 데이터를 가져오는 메모리는 프로세스를 어떻게 처리하도록 발전했을지 고민해보면 좋을 것 같다.

논리 주소와 물리 주소

프로그램 컴파일 타임과 로드 타임 시에는 논리 주소와 물리 주소가 같다. 그런데 런타임 바인딩 기법에서는 논리 주소와 물리 주소가 다르다. 따라서 프로그램 실행 중 논리 주소를 물리 주소로 변경해주는 하드웨어가 존재한다. 이것이 MMU(Memory Management Unit)이다.

 

연속 메모리 할당

프로그램을 메모리에 할당 할 때 연속적으로, 통채로 메모리에 할당한다. 운영체제에서는 메모리 상한과 기준이 있어서 프로세스가 다른 프로세스의 영역을 침범할 수 없다. 그런데 연속 메모리 할당의 경우 외부 단편화(External fragmentation) 문제가 발생한다. 예를 들어서 프로그램을 메모리에 할당할 때 물리 메모리에 프로세스 A B C를 연속적으로 차곡차곡 적재한다. 그리고 시간이 흘러서 B 프로세스가 종료된다고 가정하면 A와 C 프로세스 사이에 메모리 공간이 다시 회수된다. 그리고 다음으로 D라는 새로운 프로세스를 실행하고자 하는데, 해당 프로세스의 크기가 B보다 크다면 회수한 B 공간에 할당이 불가능하다. 그러므로 여유가 있는 나머지 공간을 할당 받게 된다. 문제는 이러한 과정이 무수히 반복되면 사용하지 못하고 놀게 되는 작은 메모리 공간이 점점 많아진다. 이것이 단편화 문제다.

Swapping

메인 메모리에 공간이 부족한 경우 프로세스가 임시로 백업 저장장치로 이동시키고 다시 프로세스에 대한 작업을 요청할 때 메인 메모리로 이동시키는 기법이다.

Swapping

메인 메모리와 백업 저장 장치간에 전체 프로세스를 이동시킨다. 

Swapping with paging

기본적으로 Paging이라고 부른다. 프로세스 전체를 백업 저장 장치에 이동시키는 게 아니라 프로세스의 페이지 단위로 스와핑한다.(페이지라는 개념은 뒤에서 다룬다.)

가상 메모리(Virtual Memory)

실제 물리 메모리 개념과 개발자의 논리 메모리 개념을 분리할 수 있게 해준다. 프로세스를 실행하기 위한 메모리가 10GB이고, 실제 물리 메모리가 5GB여도 실행에 필요한 특정 부분만 할당 하면 문제가 없다. 이를 이해하기 위해서는 프로그램이 가진 참조 지역성의 원리(Locality of reference)를 먼저 이해해야 한다. 프로그램이 실행될 때 산발적인 영역을 왔다갔다 하면서 실행되는 게 아니라, 특정 범위만 반복적으로 실행이 된다.

int A
int B

예를 들어서 프로세스에서 변수 A를 참조하면 지역성의 원리에 의해서 그 바로 아래에 있는 변수 B를 참조할 확률도 크고 다시 변수 A를 참조할 확률이 크다. 변수 A를 다시 반복 참조하는 케이스를 Temporal locality, 변수 A 근처의 변수 B를 참조하는 케이스를 Spatial locality 라고 한다. 즉 프로세스 실행 시 부분 영역을 반복적으로 참조하므로, 프로그램을 실행하기 위해서 모든 영역을 메모리에 적재하지 않아도 프로세스 실행에는 문제가 없다. 이것이 가상 메모리 기법이 가능한 이유다.

메모리 페이징(Memory Paging)

메모리에 프로세스를 연속적으로 할당하게 되면 단편화 문제가 발생한다. 페이징 기법은 물리 메모리를 프레임이라는 단위로 나눠서 관리한다. 그리고 논리 주소를 페이지를 블록으로 나누고, 인덱스 역할을 하는 페이지 테이블을 관리한다. (구체적으로는 페이지 넘버와 오프셋을 관리하지만 생략한다.) 즉 페이지와 프레임을 이용해서 프로세스를 비연속적으로 메모리에 할당하는 방법이다. 물리적으로는 비연속적으로 할당되어 있지만 사용하는 CPU 입장에서는 연속적인것처럼 사용할 수 있다. 아래 그림에서 Page 0은 페이지 테이블에서 1번 프레임을 가리키고 있다. 그리고 물리 메모리의 1번 프레임에는 page0에 대한 데이터가 저장되어 있다. CPU가 page0 ~ 3을 실행한다고 가정하면 물리적으로는 비연속적이지만 CPU 입장에서는 연속적으로 실행이 가능하다.

IPC 기법을 구현할 때 공유 메모리와 메시지 전달 기법 두 가지가 존재하는데, 페이지를 이용하여 공유 메모리를 구현할 수 있다. 각기 다른 프로세스에서 특정 페이지를 공유하게 만들어서(기본적으로는 안 되지만 IPC를 구현하기 위해서 공유한다.) 프로세스에서는 마치 자기가 점유하고 있는 영역처럼 사용하여 IPC를 구현한다.

요구 페이징(Demand Paging)

한국말로는 감이 바로 안 온다. 풀어서 말을 하자면 프로세스 전체를 메모리에 올리지 않고, 프로세스 실행에 필요한 페이지만 먼저 메모리에 할당 한다는 의미다. 위에서 다룬 지역성의 원리에 때문에 프로세스 실행을 위해서는 모든 영역을 메모리에 적재하지 않아도 된다. 그리고 프레임에 없는 페이지가 발생할 때마다 이를 요청한다. 비유하자면 연속 메모리 할당은 책(프로세스) 한 권을 그대로 들고 다니면서 보는 방법이고 요구 메모리 페이징은 책에서 필요한 부분만 스캔 떠서 필요한 부분만 들고 다니는 거다. 그리고 없는 부분이 필요해지면 다시 필요한 페이지만 스캔 떠서 추가한다. 이러한 원리에 의해서 프로세스를 처음부터 모두 메모리에 올릴 필요도 없고, 비연속적으로 할당 해서 실행할 수 있다. (즉 가상 메모리 개념과 메모리 페이징 기법이 그 기반이 됨)

 

페이지 폴트(Page fault)

참조 지역성의 원리에도 불구하고 CPU가 프로세스 실행을 진행하기 위해서 현재 프레임에 없는 페이지를 요청할 수도 있다. 프로세스 실행 중 예외가 발생하거나 잘 사용하지 않는 기능을 호출하는 경우가 이에 해당한다. 그런데 요구 페이징 기법에 의해서 잘 사용하지 않는 페이지를 프레임에 할당하지 않았기 때문에 이를 실행할 수가 없다. 이 상황이 페이지 폴트다. 페이지 폴트가 발생하면 운영체제는 즉시 백업 저장 장치에 해당하는 페이지를 요구한다. 그리고 해당 페이지를 프레임에 할당하여 다시 실행한다.

페이지 교체 알고리즘

페이지 폴트가 발생하는 경우 운영체제는 백업 저장장치로부터 해당하는 페이지를 프레임에 할당하도록 한다. 그런데 이때 물리 메모리에도 한계가 존재하기 때문에 모든 모든 프레임이 사용 중이라면 기존 프레임을 비워내서 공간을 만들어주어야 한다. 이때 페이지 교체 알고리즘을 사용한다.

FIFO

말그래도 선입선출 형태로 프레임을 교체한다. 가장 먼저 사용한 프레임을 비워낸다.

Optimal page replcaement

앞으로 가장 오랫동안 사용되지 않을 페이지를 찾아 교체한다. 그런데 이건 SJF 알고리즘과 마찬가지로 실질적으로 구현이 불가능하다. 이를 구현하기 위해서는 프로세스가 앞으로 메모리를 어떻게 참조할 것인지에 대한 과정을 모두 알아야하기 때문이다.

LRU(Least recently used)

페이지마다 마지막 사용 시간에 대한 정보를 가지고, 가장 오래 사용되지 않은 페이지를 교체하는 방법이다. 현대 운영체제에서는 이를 그대로 사용하지 않고 근사 LRU 알고리즘을 사용한다.

 

쓰레싱(Thrasing)

페이지 폴트가 지속적으로 반복되어서 성능이 저하되는 현상을 쓰레싱이라고 한다. 페이지 폴트가 발생하는 경우 Hard disk와 같은 백업 저장장치로부터 페이지를 메모리에 할당 해야하므로 이 과정에서 속도 저하가 발생한다.

'Computer Science > Operating System' 카테고리의 다른 글

9. I/O 시스템  (0) 2023.01.13
8. 대용량 저장장치 구조  (0) 2023.01.11
6. 프로세스 동기화 그리고 데드락  (0) 2023.01.06
5. CPU 스케줄링  (0) 2023.01.05
4. 스레드와 병행성  (0) 2023.01.04