////
Search

5 : 가상 메모리

운영체제의 메모리 관리 기법
CPU와 프로세스메모리 몇 번지에 무엇이 저장되어 있는지까지 다 일일이 알고 있지는 않음
CPU 내부 저장공간(레지스터)이 메모리만큼 용량이 크지 않기 때문
게다가 새로운 프로세스는 새롭게 메모리에 적재되고 사용되지 않는 프로세스는 메모리에서 삭제되면서 시시때때로 메모리 정보가 변경되는데, 메모리에 적재된 모든 프로세스와 CPU가 실시간으로 바뀌는 정보를 모두 기억하기는 어려움
CPU가 메모리에 적재된 프로세스의 주소를 인식하고 관리하는 방법 : 논리 주소, 가상 메모리, 페이징

물리 주소 & 논리 주소

CPU와 프로세스는 메모리의 하드웨어 상 실제 주소물리 주소가 아니라 다른 주소 체계를 이용 : 논리 주소
논리 주소 : 프로세스마다 부여되는 0번지부터 시작하는 주소 체계
EX : 웹 브라우저, 메모장, 게임 프로세스가 메모리에 적재되어 있다면, 모든 프로세스에는 0번지부터 시작하는 각자의 논리 주소를 가지고 있음
CPU와 프로세스가 사용하는 주소 체계는 논리 주소이므로, 중복되는 물리 주소의 번지 수는 존재하지 않지만 중복되는 논리 주소의 번지 수는 얼마든지 존재 가능
논리 주소라 할지라도, 실제로 정보가 저장되어 있는 하드웨어 상의 메모리와 상호작용하기 위해서는 반드시 논리 주소와 물리 주소간의 변환이 필요
메모리 관리 장치(MMU : Memory Management Unit)
CPU와 메모리 사이에 위치
CPU가 이해하는 논리 주소를 메모리가 이해하는 물리 주소로 변환하는 역할

스와핑 & 연속 메모리 할당

스와핑 & 연속 메모리 할당 : 가상 메모리 기술이 발전하기 전의 초기 메모리 관리 방식

스와핑

메모리 관리 방식
메모리에 적재된 프로세스들 중 현재 실행되고 있지 않은 프로세스들을 임시로 스왑 영역(swap space)라는 보조기억장치의 일부인 영역으로 쫓아내고, 이 자리에 생긴 메모리 상의 빈 공간에 다른 프로세스를 적재하여 실행하는 메모리 관리 방식
메모리에 적재된 프로세스들 중 현재 실행되고 있지 않은 프로세스들이란?
스왑 아웃(swap-out) : 현재 실행되지 않는 프로세스가 메모리에서 스왑 영역으로 옮겨지는 것
스왑 인(swap-in) : 스왑 영역에 있는 프로세스가 다시 메모리로 옮겨오는 것
스왑 아웃되었던 프로세스가 다시 스왑 인될 때는, 스왑 아웃되기 전의 물리 주소와는 다른 주소에 적재될 수 있음
프로세스가 메인메모리와 보조기억장치 일부 영역을 오가는 스와핑
스와핑(메모리 관리 기법)을 통해 프로세스들을 메모리 내 빈 공간에 적재 → 만약 빈 공간이 여러 개라면 어디에 프로세스를 배치해야할까?
연속 메모리 할당 & 외부 단편화 : 비어 있는 메모리 공간에 프로세스를 할당하는 방법

연속 메모리 할당 & 외부 단편화

메모리 할당 방식
연속 메모리 할당 : 프로세스에 연속적인 메모리 공간을 할당하는 방식
사실 메모리를 효율적으로 사용하는 방법은 X
왜냐하면, 외부 단편화라는 문제를 내포하고 있기 때문
출처 : https://code-lab1.tistory.com/54 남아있는 메모리 공간이 요청한 메모리 공간보다 크지만, 남아있는 공간이 연속적이지 않아 발생하는 현상
위 사진처럼, 50 + 50 = 100MB의 공간이 비어있지만 연속적인 공간이 아니라서 프로세스 C(80MB)를 할당할 수 없음
이처럼 프로세스들이 메모리에 연속적으로 할당되는 환경에서는, 프로세스의 실행과 종료를 반복하며 메모리 사이 사이에 빈 공간이 발생 → 메모리 낭비 가능성 증가(외부 단편화)

페이징을 통한 가상 메모리 관리

스와핑 & 연속 메모리 할당이 갖는 2가지 문제
외부 단편화 : 적재 & 삭제를 반복하며 프로세스들 사이에 발생
물리 메모리보다 큰 프로세스를 실행할 수 없음
가상 메모리 : 윗 문제를 해결하는 운영체제의 메모리 관리 기술
실행하고자 하는 프로그램의 일부만 메모리에 적재해, 실제 메모리보다 더 큰 프로세스를 실행할 수 있도록 만드는 메모리 관리 기법
보조기억장치의 일부를 메모리처럼 사용하거나 프로세스의 일부만 메모리에 적재함으로써 메모리를 실제 크기보다 더 크게 보이게 하는 기술이라 할 수 있음
대표적인 가상 메모리 기법 : 페이징, 세그멘테이션

페이징

대표적인 가상 메모리 관리 기법
프로세스의 논리 주소 공간을 페이지라는 일정한 단위로 나누고, 물리 주소 공간을 페이지와 동일한 크기의 프레임이라는 일정한 단위로 나눈 뒤 페이지를 프레임에 할당하는 가상 메모리 관리 기법(프로세스를 구성하는 페이지는 물리 메모리 내에 불연속적으로 배치될 수 있다는 점에 유의)
페이지라는 일정한 크기로 잘린 프로세스들을 메모리에 불연속적으로 할당할 수 있다면, 연속 메모리 할당처럼 프로세스 바깥에 빈 공간이 생길 여지가 없기에, 외부 단편화가 발생하지 않음
페이징 기법에도 스와핑 사용 가능 : 페이지 단위로 스왑 아웃 / 스왑 인 진행(프로세스 전체 단위 X)
페이징 시스템에서는 페이지 아웃, 페이지 인이라고 부름
달리 말하자면, 프로세스를 실행하기 위해 전체 프로세스가 메모리에 적재될 필요가 없다는 의미기도 함
즉, 페이징을 통해 물리 메모리보다 큰 크기의 프로세스 실행도 가능해짐
프로세스를 구성하는 페이지는 물리 메모리 내에 불연속적으로 배치될 수 있음 → CPU 입장에서는 다음으로 실행할 페이지의 위치를 찾기 어려움(어떤 페이지가 어떤 프레임에 적재되어 있는지 알고 있기는 어렵기 때문)
참고) 세그멘테이션

페이지 테이블

프로세스의 페이지와 실제로 적재된 프레임을 짝지어주는 정보(페이지가 물리 메모리에 불연속적으로 배치되어 CPU가 다음으로 실행할 페이지 위치를 찾기 어려워진 것에 대한 문제를 해결하기 위해 활용)
페이지 번호와 실제로 적재된 프레임 번호가 대응되도록 존재
CPU는 페이지 테이블의 페이지 번호만 보고도 적재된 프레임을 찾을 수 있게 됨
프로세스마다 각자의 테이블 정보 보유 → CPU가 서로 다른 프로세스를 실행할 때는 각 프로세스의 페이지 테이블을 참조해 메모리에 접근
페이지 테이블 엔트리(Page Table Entry)
페이지 테이블의 위치

내부 단편화

페이지 하나의 크기보다 작은 크기로 발생하게 되는 메모리 낭비
페이징이 외부 단편화 문제를 해결할 수는 있지만, 내부 단편화라는 또 다른 문제를 야기할 수 있음
페이징은 프로세스의 논리 주소 공간을 페이지라는 일정한 크기의 단위로 나누는 방식이지만, 모든 프로세스가 페이지 크기에 딱 맞게 잘리는 것은 X
모든 프로세스의 크기가 페이지의 배수는 X
EX : 페이지 크기가 10KB인데 프로세스 크기가 107KB라면, 마지막 페이지는 3KB만큼 남음

페이지 테이블 베이스 레지스터(PTBR)

특정 프로세스의 페이지 테이블이 적재된 메모리 상의 위치를 가리키는 특별한 레지스터(= CPU에 위치)
각 프로세스의 테이지 테이블은 메모리에 적재 가능 → 특정 프로세스의 실행을 위해, 이 프로세스의 페이지 테이블이 메모리에 적재된 위치를 알아야함
PTBR은 프로세스마다 가지는 정보각 PCB에 기록 → 다른 프로세스로의 문맥 교환이 발생할 때 변경
모든 프로세스의 페이지 테이블을 메모리에 적재하는 건 비효율적 :
이유 1 : 메모리 접근 횟수 증가
이유 2 : 메모리 용량을 많이 차지
따라서 운영체제는 모든 페이지 테이블을 메모리에 적재하는 것을 가급적 지양

페이징 주소 체계

하나의 페이지 내에는 여러 주소가 포함 → 페이징 시스템의 논리 주소는 기본적으로 <페이지 번호, 변위>와 같은 형태로 존재
1.
페이지 번호 : 몇 번째 페이지 번호에 접근할 지를 표현
2.
변위 : 접근하려는 주소가 페이지(프레임) 시작 번지로부터 얼마나 떨어져 있는지를 표현하는 정보
EX : <페이지 번호, 변위> 형태의 논리 주소 → 페이지 테이블 → <프레임 번호, 변위> 형태의 물리 주소
논리 주소의 변위와 물리 주소의 변위 값은 동일
주소 변환 과정

페이지 교체 알고리즘

요구 페이징

메모리에 프로세스를 적재할 때, 처음부터 모든 페이지를 적재하지 않고 메모리에 필요한(요구되는) 페이지만을 적재하는 기법
기본적인 양상
참고) 순수 요구 페이징
아무런 페이지도 메모리에 적재되지 않은 채 무작정 프로세스를 실행하는 경우
순수 요구 페이징의 경우, 프로세스의 첫 명령어를 실행하는 순간부터 페이지 폴트 발생 → 실행에 필요한 페이지가 어느 정도 적재된 이후부터는 페이지 폴트의 발생 빈도가 떨어짐
요구 페이징을 통해 페이지들을 메모리에 점차 적재하다 보면 언젠가는 메모리가 가득 참 → 메모리에 페이지가 가득 찬 상황에서 추가적으로 페이지를 적재해야 한다면 메모리에 적재된 일부 페이지를 스왑 아웃해야함
페이지 교체 알고리즘 : 메모리에 적재된 페이지 중 보조기억장치로 내보낼 페이지를 선택하는 방법
어떤 페이지 교체 알고리즘이 사용되느냐에 따라 페이지 폴트의 발생 빈도가 달라짐 → 컴퓨터 전체 성능과 직결
좋은 페이지 교체 알고리즘 → 메모리에서 사용되지 않은 페이지를 적절히 보조기억장치로 내보냄(= 페이지 폴트 발생 빈도 적음)
나쁜 페이지 교체 알고리즘 → 곧 사용될 페이지를 보조기억장치로 내보냄(= 페이지 폴트 발생 빈도 높음)
빈번한 페이지 폴트 발생은, 보조기억장치로부터 필요한 페이지를 가져와야 하는 시간만큼 성능 저하를 가져옴

대표적인 페이지 교체 알고리즘

1. FIFO 페이지 교체 알고리즘

First-In First-Out Page Replacement Algorithm
메모리에 가장 먼저 적재된 페이지부터 스왑 아웃하는 페이지 교체 알고리즘
아이디어, 구현은 간단
조기에 적재되어 줄곧 참조되고 있는 페이지를 스왑 아웃할

2. 최적 페이지 교체 알고리즘

Optimal Page Replacement Algorithm
앞으로의 사용 빈도가 낮은 페이지를 교체하는 알고리즘
가장 낮은 페이지 폴트율을 보장하는 알고리즘
앞으로 가장 적게 사용할 페이지를 미리 예측하는건 어렵기 때문에 실제 구현하기 어려운 알고리즘

3. LRU 페이지 교체 알고리즘

Least Recently Used Page Replacement Algorithm
가장 적게 사용한 페이지를 교체하는 알고리즘
보편적으로 사용되는 페이지 교체 알고리즘의 원형, 이를 기반으로 만들어진 다양한 파생 알고리즘 존재
참고) 페이지 폴트 종류
메이저 페이지 폴트(Major page fault)
보조기억장치에서 CPU가 원하는 페이지를 읽어 들이기 위해 입출력 작업이 필요한 페이지 폴트. CPU가 접근하려는 페이지가 물리 메모리에 없을 때 발생하는 페이지 폴트
해당 페이지가 물리 메모리에도 없고 디스크에만 있는 경우 발생
운영체제가 디스크에서 페이지를 읽어와 메모리에 적재
마이너 페이지 폴트(Minor page fault)
보조기억장치와의 입출력이 필요하지 않은 페이지 폴트. CPU가 요청한 페이지가 물리 메모리에는 존재하지만, 페이지 테이블 상에는 반영되지 않은 경우에 발생
페이지가 디스크에는 없고, 이미 메모리에 적재되었지만, 해당 프로세스의 페이지 테이블에는 아직 등록되지 않은 경우 발생
운영체제는 그냥 페이지 테이블 항목만 업데이트하면 해결
참고자료