[운영체제] 가상 메모리

물리 메모리의 한계

1) 주소 공간과 물리 메모리

  • 컴퓨터에 설치할 수 있는 물리 메모리의 한계

→ cpu 주소 버스에 따라 최대 물리 메모리 크기가 정해져 있음

→ 현실적인 크기와 비용으로 인해 8~32GB의 메모리 사용

2) 물리 메모리의 한계

  • 설치된 물리 메모리보다 큰 프로세스를 실행시킬 수 있는가?
  • 프로세스들을 합친 크기가 설치된 물리 메모리보다 클 때 이들을 실행시킬 수 있는가?

→ 프로세스 전체가 물리 메모리에 적재 되어야 실행 가능한가?

→ 당장 실행에 필요한 프로세스의 일부 메모리만 적재한 채 실행시킬 수 없는가?

가상 메모리 개념

1) 가상 메모리

  • 물리 메모리 크기 한계 극복
  • 물리 메모리를 디스크 공간을 확장하는 기법

→ 프로세스나 사용자가 프로세스를 실행하기에 충분히 큰 메모리가 있다고 착각하게 만드는 메모리 관리 기술

  • 메모리가 부족할 때, 하드 디스크로 이동하고 실행에 필요할 때, 물리 메모리로 이동하는 스와핑 사용

2) 가상 메모리의 개념

  1. 운영체제는 물리 메모리 영역을 하드 디스크까지 연장
  2. 프로세스의 실행 시 프로세스 전체가 물리 메모리에 적재될 필요 없음
  3. 운영체제는 물리 메모리의 빈 영역이 부족하게 되면, 물리 메모리 일부분을 하드 디스크로 옮겨 물리 메모리의 빈 영역 확보
  4. 물리 메모리를 확장하여 사용하는 디스크 영역은 스왑 영역
  5. 사용자는 컴퓨터 시스템에 문한대의 메모리가 있는 것으로 착각
  6. 가상 메모리는 운영체제마다 구현 방법이 다름

3) 대표적인 가상 메모리 구현 방법

  • 요구 페이징

→ 페이징 기법을 토대로 프로세스의 일부 페이지들만 메모리에 할당하고 페이지가 필요할 때 메모리를 할당받고 페이지를 적재시키는 메모리 관리 기법

→ 페이징 + 스와핑

  • 요구 세그먼테이션

→ 세그먼테이션 + 스와핑

요구 페이징

1) 요구 페이징 개념

  • 현재 실행에 필요한 일부 페이지만 메모리에 적재하고 나머지는 하드디스크에서 필요할 때 메모리에 적재하는 방식
  • 운영체제는 첫 페이지만 물리 메모리에 적재 후 실행 중 다음 페이지가 필요하면 그 때 적재시키는 방법 사용
  • 스왑영역 : 메모리가 부족할 때, 메모리를 비우고 페이지를 저장해두는 하드디스크 영역

2) 페이지 테이블 항목

  • presence/valid bit : 해당 페이지가 물리 메모리에 있는지 여부
  • modified/dirty bit: 해당 페이지가 수정되었는지 여부
  • physical address : presence bit에 따라 해당 페이지가 적재되어있는 프레임이나 디스크 블록 번호르 나타냄

3) 페이지 폴트와 스레싱

  • cpu가 액세스하려는 페이지가 물리 메모리에 없을 경우 발생 → 스왑 인/ 스왑 아웃을 통해 스와핑 진행
  • 페이지 폴트 발생 시 디스크 I/O 증가
  • 페이지 폴트가 계속 발생하여 메모리 프레임에 페이지가 반복적으로 교체되고 디스크 입출력이 심각하게 증가하는 현상 : 스레싱

→ 다중 프로그래밍 정도가 과도하거나 잘못된 메모리 할당/페이지 교체 알고리즘 사용

→ 혹은 기본저인 메모리 량이 적거나 우연한 특정 시간에 너무 많은 프로세스 실행

4) 쓰기 시 복사

  • 프로세스의 생성 : 부모 프로세스의 fork() 시스템 호출로 생성 → 메모리 할당과 페이지의 적재 시작

→ 완전 복사와 쓰기 시 복사의 경우로 생성

  • 완전 복사 : 부모 프로세스의 메모리를 완전히 복사하여 자식 프로세스 생성
  • 쓰기 시 복사 : 자식 프로세스의 실행 중 페이지에 쓰기 발생 → 새 프레임을 할당
  • 프로세스의 생성 시간을 절약
  • 프로세스에 새로운 프레임을 할당할 필요가 없을 경우 메모리 절약

5) 스레싱 현상

  • 스레싱이 발생하는 시점

→ 다중 프로그래밍 정도가 임계점 M을 넘어가면 스레싱이 발생하여 cpu 활용률이 떨어짐

  • 스레싱을 해결하기 위해 운영체제마다 다른 감지방법 사용
  • 해결 및 예방

→ 다중 프로그래밍 정도를 줄이고 SSD 사용 + 메모리 늘리기

참조의 지역성과 작업 집합

1) 참조의 지역성

  • 프로그램의 특성으로 cpu가 짧은 시간 범위 내에 일정 구간의 메모리 영역을 반복적으로 참조하는 경향
  • 메모리를 균일하게 액세스하지 않고, 짧은 시간에 특정 부분 집중 참조
  • 프로세스는 최근에 참조한 데이터와 코드를 다시 참조하는 경향

→ 현재 프로세스의 실행 패턴을 관찰하면 가까운 미래에 프로세스의 코드와 데이터 사용을 합리적으로 예측 → 메모리 할당과 페이지 교체 전략에 활용

2) 시간 지역성과 공간 지역성

#1 시간 지역성

  • 프로세스에서 지금 참조된 주소가 가까운 미래에 다시 참조될 가능성이 큰 특성
  • 코드나 데이터, 자원 등이 아주 짧은 시간 내에 다시 사용되는 특성
  • 대표적으로 반복문 존재

#2 공간 지역성

  • 지금 참조되는 번지의 주변 번지들이 가까운 미래에 참조되는 특성
  • 배열이나 순차 읽기, 코드 진행 시 다음 코드들이 존재

3) 작업 집합

  • 일정 시간 범위 내에 프로세스가 액세스한 페이지들의 집합
  • 페이지 폴트는 작업 집합을 메모리에 적재하는 과정
  • 참조의 지역성 → 페이지 폴트 → 메모리에 작업 집합 형성

#1 작업 집합 이동

  • 프로세스가 실행되는 동안 작업집합 이동
  • 시간이 지나면 새로운 작업 집합 형성

#2 스레싱과 작업 집합

  • 스래싱 발생 원인 설명에 작업 집합 모델 사용
  • 작업 집합이 메모리에 올라와 있지 않을 경우 스레싱 발생

4) 요구 페이징의 필수 알고리즘

#1 프레임 할당 알고리즘

  • 프로세스당 할당할 프레임 개수를 결정하는 문제
  • 프로세스의 작업 집합에 포함될 페이지들을 수용할만한 개수의 프레임 할당 → 페이지 폴트 줄이기 위해

#2 페이지 교체 알고리즘

  • 페이지 폴트가 발생하였을 떼, 빈 프레임이 없는 경우 희생 프레임을 결정하는 문제
  • 작업 집합에 속하지 않은 페이지가 담긴 프레임을 선태하여 미래에 사용될 페이지 교체되지 않도록 유지

프레임 할당 & 페이지 교체

1) 프레임 할당

  • 프로세스에게 작업 집합에 포함된 페이지들을 적재할 충분한 메모리 할당
  • 균등 할당

→ 프로세스에게 크기와 관계없이 동일한 개수의 프레임 할당 ( 작은 프로세스는 프레임 낭비, 큰 프로세스는 빈번한 페이지 폴트 발생 )

  • 비례 할당

→ 프로세스의 크기와 비례하여 프레임 할당 ( 전체적인 페이지 폴트의 수를 줄임, 프로세스이 크기는 실행 중에 완벽히 알기 어려움 )

2) 페이지 교체

  • 메모리 프레임 중 하나를 선택하여 비우고 요청된 페이지를 적재하는 과정
  • 희생 프레임과 희생 페이지 : 비우기로 한 프레임과 페이지
  • 현재 작업 직합에 포함되지 않거나 가까운 미래에 참조되지 않을페이지를 희생 페이지로 선택하여 페이지 폴트를 줄임

3) 희생프레임의 선택 범위

  • 지역 교체 : 요청한 프로세스에게 할당된 프레임 중에서 희생 프레임 선택

→ 프로세스 별 독립적인 페이지 폴트 처리가 필요하나 스레싱에 대한 대책으로 적합

  • 전역 교체 : 전체 메모리 프레임 중에서 선택

→ 지역 교체보다 효과적이며 현재 많은 운영체제에서 사용

4) 페이지 교체 알고리즘

#1 최적 교체 ( Optimal Page Replacement )

  • 이롡거인 최적 알고리즘
  • 가장 먼 미래에 사용될 페이지를 교체 대상으로 선택 - 비현실적

#2 FIFO ( First In First Out )

  • 가장 오래전에 적재된 페이지 선택

#3 LRU ( Least Recently Used )

  • 가장 최근에 사용되지 않았던 페이지 선택

#4 Clock

  • LRU를 단순화한 방법