본문 바로가기
~ 2024.03/컴퓨터 구조 + 운영체제

[컴퓨터 구조] 가상 메모리

by Monett 2024. 1. 5.
반응형

혼자 공부하는 컴퓨터 구조 + 운영체제(강민철 저, 한빛미디어)를 공부하며 내용을 정리한 글 입니다.
현재 블럭의 내용은 작성자의 의견 혹은 생각이며, 틀린 내용이 있을 수 있습니다. 지적 감사드립니다.

 

연속 메모리 할당

프로세스에 연속적으로 메모리 공간을 할당하는 방식

스와핑

현재 실행되지 않는 프로세스를 임시로 보조기억장치로 이동시키고, 빈 공간에 다른 프로세스를 적재하는 것

  • 스왑영역 : 보조기억장치의 일부 영역
  • 스왑아웃 : 현재 실행되지 않는 프로세스가 스왑영역으로 옮겨지는 것
  • 스왑인 : 스왑영역에 있던 프로세스가 다시 메모리로 옮겨지는 것

스와핑을 통해 프로세스들이 요구하는 메모리가 실제 메모리보다 큰 경우에도 프로세스를 동시에 실행 가능하다.

메모리 할당

비어있는 메모리 공간에 프로세스를 연속적으로 할당하는 방식은 크게 세 가지가 있다.

  • 최초 적합 : 순서대로 검색하다 발견하면 즉시 할당 (빠른 할당이 가능하다)
  • 최적 적합 : 모두 검색한 후 가장 작은 공간에 할당
  • 최악 적합 : 모두 검색한 후 가장 큰 공간에 할당

외부 단편화

연속 메모리 할당 시 외부 단편화가 발생할 수 있다.

메모리 사이에 빈 공간이 생기고, 그 공간보다 큰 프로세스를 적재하기 어려워져 낭비가 발생하는 문제이다.

 

이를 해결하기 위해 메모리 압축(조각모음) 기법을 사용하기도 하나, 이 때 시스템이 하던 일을 중단해야 하고 오버헤드를 야기한다.


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

가상 메모리란 실행하고자 하는 프로그램을 일부만 적재하여 실제 물리 메모리보다 더 큰 프로세스를 실행할 수 있도록 하는 기법이다.

가상 메모리 기법에는 페이징, 세그멘테이션 등이 있으며 현대 컴퓨터는 대부분 페이징 기법을 사용한다.

페이징

메모리와 프로세스를 일정한 단위로 자르고, 불연속적으로 할당하는 기법이다.

  • 페이지 : 프로세스의 논리 주소 공간을 자른 단위
  • 프레임 : 메모리 물리 주소 공간을 자른 단위

페이징에서의 스와핑

페이징에서의 스와핑은 프로세스 전체가 스와핑되지 않고, 페이지 단위로 스와핑된다.

스왑아웃과 스왑인을 페이지아웃과 페이지인으로 부르기도 한다.

 

이는 한 프로세스를 실행하기 위해 프로세스 전체가 메모리에 적재될 필요가 없다는 말과 같다.

프로세스를 이루는 페이지 중 실행에 필요한 일부 페이지만 적재하여 물리 메모리보다 더 큰 프로세스를 실행할 수 있다.

페이지 테이블

프로세스가 메모리에 불연속적으로 배치되어 있다면 CPU 입장에서 이를 순차적으로 실행하기 어렵다.

프로세스를 이루는 페이지가 어떤 프레임에 적재되어 있는지 모두 알고 있기 어렵기 때문이다.

 

이를 해결하기 위해 프로세스의 논리주소는 연속적으로 배치되도록 페이지 테이블을 이용한다.

프로세스마다 테이블이 있으며, CPU 내 테이블 베이스 레지스터(PTBR)이 페이지 테이블 주소를 가리키고 있다.

 

페이지 테이블은 메모리에 적재되며, 정보는 프로세스의 PCB에 기록된다.

 

그러나, 페이지 테이블을 메모리에 두면 메모리 접근 시간이 두 배로 늘어난다.

테이블에 한 번, 실제 프레임에 한 번씩 접근하기 때문이다.

 

이와 같은 문제를 해결하기 위헤 CPU 곁에 (일반적으로 MMU 내에) TLB(Translation Lookaside Buffer)라는 페이지 테이블의 캐시 메모리를 두어 페이지 테이블의 일부 내용을 저장한다.

참조 지역성에 근거해 최근 사용된 페이지 위주로 저장되며, TLB 히트와 TLB 미스 개념도 존재한다.

페이징에서의 주소 변환

하나의 페이지 혹은 프레임은 여러 주소를 포괄하고 있다.

그렇기에 특정 주소에 접근하려면 두 가지 정보가 필요하다.

  • 어떤 페이지 혹은 프레임에 접근하고 싶은지
  • 접근하려는 주소가 그 페이지 혹은 프레임으로부터 얼마나 떨어져 있는지

그렇기에 페이징 시스템에서 논리 주소는 모두 페이지 번호와 변위(offset)으로 이루어져 있다.

페이지 테이블 엔트리

페이지 테이블의 각각의 행을 페이지 테이블 엔트리라고 한다.

엔트리에는 페이지 번호와 프레임 번호 외에 다른 정보도 존재한다.

  • 유효 비트 : 해당 페이지 접근 가능 여부(스왑 아웃 여부), 0일 때 접근 시 페이지 폴트 예외 발생
  • 보호 비트 : 읽기 전용 여부. read, write, execute로 구현하기도 한다. ex) 1/1/0 이면 읽고 쓰기만 가능
  • 참조 비트 : 적재 이후 접근한 적이 있는지 여부
  • 수정 비트 : 페이지에 데이터를 쓴 적이 있는지 여부. 메모리에서 사라질 때 보조기억장치에 쓰기를 실행해야할 지 판단하는데 도움이 된다.

내부 단편화

프로세스가 페이지 크기만큼 딱 맞게 잘리지 않아 발생한다. 

ex) 페이지 크기는 10mb이지만, 프로세스 크기가 12mb인 경우 등

 

페이지 크기를 조정하여 해결할 수 있지만, 적절한 페이지 크기를 조정하기는 쉽지 않다.


요구 페이징

프로세스를 메모리에 적재할 때 처음부터 모든 페이지를 적재하지 않고 필요한 페이지만을 메모리에 적재하는 것을 요구 페이징이라 한다.

  1. CPU가 특정 페이지에 접근하는 명령어를 실행한다.
  2. 해당 페이지가 메모리에 있을 경우(유효 비트가 1일 경우) CPU는 페이지가 적재된 프레임에 접근한다.
  3. 없을 경우 페이지 폴트가 발생한다.
  4. 페이지를 메모리에 적재하고 유효 비트를 1로 설정하는 페이지 폴트 처리 루틴을 처리한다.
  5. 1번으로 돌아간다.

순수 요구 페이징이란 처음부터 메모리 적재 없이 실행하는 기법이다. 페이지 폴트와 적재를 반복적으로 실행하며 페이지가 채워진다.

 

요구 페이징이 안정적으로 작동하려면 필연적으로 페이지 교체와 프레임 할당을 해결해야 한다.

페이지 교체 알고리즘

스왑아웃 할 페이지를 결정하는 방법이다.

 

페이지 폴트를 가장 적게 일으키는 알고리즘이 좋은 알고리즘이다. 

이를 위해서는 페이지 폴트 횟수를 알아야하며, 이는 페이지 참조열을 통해 알 수 있다.

 

페이지 참조열은 연속된 페이지를 생략한 페이지열을 의미한다.

FIFO 페이지 교체 알고리즘

가장 먼저 올라온 페이지부터 스왑아웃되는 단순한 방법이다.

계속해서 사용될 내용이라면 아웃되면 안되기에 단점이 존재한다.

최적 페이지 교체 알고리즘

사용 빈도가 가장 낮은 페이지를 교체한다.

예측이 어려워 구현이 어려우며, 이론상 성능 측정을 위해 사용한다.

LRU 페이지 교체 알고리즘

Least Recently Used의 준말이며 오랫동안 사용되지 않는 페이지를 교체한다.

스래싱과 프레임 할당

사실 프레임 수가 적어도 폴트가 자주 발생하며, 이것이 더 근본적인 이유라 할 수 있다.

프로세스가 실행 시간보다 페이징에 더 많은 시간을 쏟는 것을 스래싱이라고 하며, 이는 성능 저하의 원인이 된다.

 

메모리에서 동시 실행되는 프로세스의 수를 멀티프로그래밍의 정도라고 하는데, 이것이 필요 이상으로 늘어나면 페이지 폴트가 자주 발생하고, 성능 하락의 원인이 된다.

 

스래싱이 발생하는 근본 원인은 각 프로세스가 필요로 하는 최소한의 프레임 수가 보장되지 않았기 때문이다.

그렇기에 운영체제는 각 프로세스들이 무리 없이 실행하기 위한 최소한의 프레임 수를 파악하고 적절하게 할당해야 한다.

 

프레임 할당 방식은 아래와 같다.

  • 정적 할당 방식(단순히 프로세스와 물리 메모리의 크기만 고려하여 할당)
    • 균등 할당 : 매 프로세스에 균등하게 프레임 제공. 비합리적임
    • 비례 할당 : 프로세스 크기에 맞게 할당. 실제로 얼마나 많은 프레임이 필요할지 실행해봐야 아는 경우가 많다.
  • 동적 할당 방식(실행하는 과정에서 배분할 프레임을 결정)
    • 작업 집합 모델 : 프로세스가 일정 시간동안 참조한 페이지만큼 할당
    • 페이지 폴트 빈도 : 페이지 폴트 빈도 기반 할당. 상한선과 하한선을 정하고 그 범위 안에서 할당.
반응형