본문으로 건너뛰기

가상 메모리

연속 메모리 할당

  • 연속 메모리 할당: 프로세스에 연속적인 메모리 공간을 할당하는 방시
  • 스와핑: 메모리에서 사용되지 않는 일부 프로세스를 보조기억장치로 내보내고 실행할 프로세스를 메모리로 들여보내는 메모리 관리 기법
  • 스왑영역: 프로세스들이 쫓겨나는 보조기억장치의 일부 영역
  • 스왑 아웃: 현재 실행되지 않는 프로세스가 메모리에서 스왑 영역으로 옮겨지는 것
  • 스왑 인: 스왑 영역에 있던 프로세스가 다시 메모리로 옮겨오는 것
  • 최초 적합 방식: 최초로 발견한 적재 가능한 빈 공간에 프로세스를 배치하는 방식
  • 최적 적합 방식: 프로세스가 적재될 수 있는 가장 작은 공간에 프로세스를 배치하는 방식
  • 최악 적합 방식: 프로세스가 적재될 수 있는 가장 큰 공간에 프로세스를 배치하는 방식
  • 외부 단편화: 프로세스를 할당하기 어려울 만큼 작은 메모리 공간들로 인해 메모리가 낭비되는 현상
    • 해결방법
      압축: 메모리 내에 저장된 프로세스를 재배치시켜 흩어져 있는 작은 빈 공간들을 하나의 큰 빈 공간으로 만드는 방법
      → 하나로 모으는 동안 시스템은 하던 일을 중지해야 하고 메모리에 있는 내용을 옮기는 작업은 많은 오버헤드를 야기하며 어떤 프로세스를 어떻게 움직여야 오버헤드를 최소화하며 압축할 수 있는지에 대한 명확한 방법을 결정하기 어렵다.

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

  • 연속 메모리 할당의 문제점

    1. 외부 단편화
    2. 물리 메모리보다 큰 프로세스를 실행할 수 없다.

    가상 메모리 - 실행하고자 하는 프로그램을 일부만 메모리에 적재하여 실제 물리 메모리 크기보다 더 큰 프로세스를 실행할 수 있게 하는 기술

    크게 페이징과 세그멘테이션이 있지만 현대 대부분의 운영체제가 사용하는 방법은 페이징 기법이다. 이를 이용하면 물리 메모리보다 큰 프로세스를 실행할 수 있으며 외부 단편화 문제도 해결 가능하다.

  • 페이징: 물리 주소 공간을 프레임 단위로 자르고 프로세스의 논리 주소 공간을 페이지 단위로 자른 뒤 각 페이지를 프레임에 할당하는 가상 메모리 관리 기법

  • 프로세스가 메모리에 불연속적으로 배치되어 있다면 CPU는 이를 순차적으로 실행할 수 없다. 즉, ‘다음에 실행할 명령어 위치를 찾기가 어려워진다. 이를 해결하기 위해 페이징 시스템은 CPU가 바라보는 주소인 논리 주소에는 연속적으로 배치되도록 페이지 테이블을 이용한다.

  • 페이지 테이블을 통해 페이지가 적재된 프레임을 찾을 수 있다.

    • 프로세스마다 각자의 프로세스 테이블이 있으며 각 페이지 테이블 정보들은 프로세스의 PCB에 기록된다.

    • 프로세스의 페이지 테이블들은 메모리에 적재되어 있다.

    • 페이지 테이블에는 페이지 번호, 프레임 번호, 유효 비트, 보호 비트, 접근 비트, 수정 비트 등에 대한 정보가 있다.

    1. 유효 비트: 현재 해당 페이지에 접근 가능한지 여부를 알려주는 비트, 페이지가 메모리에 적재되어 있지 않으면 페이지 폴트 발생
    2. 보호 비트: 페이지에 접근할 권한을 제한하여 페이지를 보호하는 비트 (r - read, w - write, x - execute)
    3. 참조 비트: 페이지에 접근한 적이 있는지 나타내는 비트
    4. 수정 비트: 해당 페이지가 수정된 적이 있는지 나타내는 비트
  • PTBR: 각 프로세스의 페이지 테이블이 적재된 주소를 가리킨다.

  • 페이지 테이블을 메모리에 두기 때문에 메모리 접근 시간이 두배로 늘어난다는 문제가 있다.

    • 메모리에 있는 페이지 테이블을 보기 위해 한번, 그렇게 알게 된 프레임에 접근하기 위해 한번
    • 이를 해결하기 위해 TLB 사용
  • TLB: 페이지 테이블의 캐시 메모리 역할을 수행하기 위해 페이지 테이블의 일부를 저장한다.

    • 주로 최근에 사용된 페이지 위주로 가져와 저장한다.
    • CPU가 발생한 논리 주소에 대한 페이지 번호가 TLB에 있을 경우 TLB 히트라고 한다.
    • 반대는 TLB 미스
  • 하나의 페이지 혹은 프레임은 여러 주소를 포괄하고 있다. 따라서 특정 주소에 접근하려면 아래 두 정보가 필요하다.

    • 어떤 페이지 혹은 프레임에 접근하고 싶은지 (페이지 번호)
    • 접근하려는 주소가 그 페이지 혹은 프레임으로부터 얼마나 떨어져 있는지 (변위) 즉, 논리 주소 (페이지 번호, 변위)는 페이지 테이블을 통해 물리 주소 (프레임 번호, 변호)로 변환된다.
  • 페이지 테이블 엔트리: 페이지 테이블의 각 행들

페이지 교체와 프레임 할당

  • 가상 메모리를 통해 큰 프로세스도 실행할 수 있다고는 하지만 여전히 물리 메모리의 크기는 한정되어 있다. 운영체제는 프로세스들이 한정된 메모리를 효율적으로 이용할 수 있도록 기존에 메모리에 적재된 불필요한 페이지를 선별해 보조기억장치로 내보낼 수 있어야 하고, 프로세스들에 적절한 수의 프레임을 할당하여 페이지를 할당할 수 있게 해야 한다.

  • 요구 페이징: 페이지가 필요할 때만 메모리에 적재하는 기법

    → 위와 같은 요구 페이징 시스템이 안정적으로 작동하려면 페이지 교체프레임 할당을 해결해야 한다.

  • 페이징 교체 알고리즘: 쫓아낼 페이지를 결정하는 방법

    • FIFO 알고리즘: 적재된 페이지 순서대로 교체하는 알고리즘
    • 최적 알고리즘: 앞으로의 사용 빈도가 가장 낮은 페이지를 교체하는 알고리즘 → 가장 낮은 페이지 폴트율을 보장하지만 예측하기가 어려우기 땜문에 실제 구현이 힘듬
    • LRU 페이지 교체 알고리즘: 가장 오랫동안 사용되지 않은 페이지를 교체하는 알고리즘
  • 스래싱: 지나치게 빈번한 페이지 교체로 인해 CPU 이용률이 낮아지는 문제. 프로세스가 실제 실행되는 시간보다 페이징에 더 많은 시간을 소요하여 성능이 저하되는 문제

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

  • 프레임 할당 방식

    • 균등 할당 (정적): 모든 프로세스에 균등하게 프레임을 제공
    • 비례 할당 (정적): 프로세스 크기에 따라 프레임을 배분하는 방식
    • 작업 집합 모델 기반 프레임 할당 (동적): 작업 집합(실행 중인 프로세스가 일정 시간 동안 참조한 페이지의 집합)의 크기만큼만 프레임을 할당하는 방식
    • 페이지 포트율 기반 프레임 할당 (동적): 페이지 폴트율에 상한성과 하한선을 정하고 그 내부 범위 안에서만 프레임을 할당하는 방식