Chapter 14 가상 메모리 - goorm-6th-Als/for_study_Algorithm GitHub Wiki

14-1 연속 메모리 할당


프로세스에 연속적인 메모리 공간을 할당하는 방식을 연속 메모리 할당이라고 한다.

1. 스와핑

메모리에 적재된 프로세스들 중에는 현재 실행되지 않는 프로세스가 있을 수 있는데, 이들을 보조기억장치로 쫓아내고 실행할 프로세스를 메모리 상 빈 공간에 적재하는 메모리 관리 기법을 스와핑이라고 한다.

*스왑 영역: 프로세스가 쫓겨나는 보조기억장치의 일부 영역

*스왑 아웃: 메모리 ➡️ 스왑 영역
*스왑 인: 스왑 영역 ➡️ 메모리

예) N사 면접 중...

스왑 영역: 면접 대기실
메모리: 면접장

스왑 인: 대기실에서 면접장 이동 (내 차례다! 들어가자~)
스왑 아웃: 면접 다 보고 대기실로 이동 (휴... 드디어 끝났네)

스크린샷 2024-02-26 11 22 19

스와핑 이용 시, 요구되는 메모리 공간의 크기가 실제 메모리보다 큰 경우에도 프로세스를 동시 실행할 수 있다.

스크린샷 2024-02-26 11 40 21

2. 메모리 할당

비어 있는 메모리에 프로세스를 연속 할당하는 방식은 최초 적합, 최적 적합, 최악 적합의 세 가지 방식이 있다.

(1) 최초 적합(First fit)

최초로 발견한 적재 가능한 빈 공간에 프로세스를 배치하는 방식

(2) 최적 적합(Best fit)

적재될 수 있는 가장 작은 공간에 프로세스를 배치하는 방식

(3) 최악 적합(Worst fit)

적재될 수 있는 가장 큰 공간에 프로세스를 배치하는 방식

3. 외부 단편화

위처럼 프로세스가 연속적으로 메모리에 할당되는 환경에서는 실행되고 종료되기를 반복하며 메모리 사이사이 빈 공간들이 생긴다.
따라서 프로세스를 할당하기 어려울 만큼 작은 메모리 공간들로 인해 메모리가 낭비되는 현상인 외부 단편화가 발생한다.

스크린샷 2024-02-26 13 44 16

외부 단편화를 해결할 수 있는 대표적인 방안은 메모리를 압축(=메모리 조각 모음)하는 것이다.
이는 메모리 내의 프로세스를 재배치하여 흩어져 있는 빈 공간들을 하나의 큰 공간으로 만드는 방식이다.

스크린샷 2024-02-26 17 27 00

But... 압축 방식은 여러 단점이 있는데
압축 과정이 일어나는 동안 시스템은 하던 일을 중지해야 하며, 많은 오버헤드가 발생한다.
이 때문에 외부 단편화를 없앨 수 있는 가상 메모리 기법인 페이징(아래 14-2 파트에서 자세히 설명) 기법이 등장하였다.

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


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

페이징

메모리의 물리 주소 공간을 프레임 단위로 자르고, 프로세스의 논리 주소 공간을 페이지 단위로 자른 뒤 각 페이지를 프레임에 할당하는 가상 메모리 관리 기법
스크린샷 2024-02-29 011740
페이징에서의 스와핑은 페이지 단위로 스왑 아웃(페이지 아웃) / 스왑 인(페이지 인)
메모리에 적재될 필요가 없는 페이지들은 보조기억장치로 스왑 아웃
스크린샷 2024-02-29 012055



프로세스가 메모리에 불연속적으로 배치되어 있다면 CPU 입장에서는 순차적 실행 불가능 페이지 테이블의 페이지 번호를 이용해 페이지가 적재된 프레임을 찾을 수 있다.
스크린샷 2024-02-29 012520
🔺페이지 테이블
스크린샷 2024-02-29 012408
🔺프로세스마다 페이지 테이블이 있음

페이지 테이블 베이스 레지스터(PTBR) : 각 프로세스의 페이지 테이블이 적재된 주소를 가리킴
스크린샷 2024-02-29 013036
🔻페이지 테이블을 메모리에 두면 메모리 접근 시간이 두 배로 늘어난다.
스크린샷 2024-02-29 013304

TLB : 페이지 테이블의 캐시 메모리 역할을 수행하기 위해 페이지 테이블의 일부를 저장
TLB 히트 : CPU가 발생한 논리 주소에 대한 페이지 번호가 TLB에 있는 경우. 메모리 접근 한 번
TLB 미스 : 페이지 번호가 TLB에 없는 경우. 메모리 접근 두 번
스크린샷 2024-02-29 013609

페이징에서의 주소 변환

특정 주소에 접근하려면 필요한 정보

  1. 어떤 페이지 혹은 프레임에 접근하고 싶은지
  2. 접근하려는 주소가 그 페이지 혹은 프레임으로부터 얼마나 떨어져 있는지
    페이징 시스템에서는 모든 논리 주소가 페이지 번호변위로 이루어져 있다.
    논리 주소 <페이지 번호, 변위> => 물리 주소 <프레임 번호, 변위>
    스크린샷 2024-02-29 014343



페이지 테이블 엔트리

페이지 테이블의 각 엔트리(각각의 행)
페이지 테이블 엔트리에는 페이지 번호, 프레임 번호뿐 아니라 유효 비트, 보호 비트, 참조 비트, 수정 비트가 있다.

유효 비트 : 해당 페이지가 메모리에 적재되어 있는지 여부를 알려주는 비트
페이지가 메모리에 적재되어 있다면 유효 비트는 1, 그렇지 않다면 0
CPU가 유효 비트가 0인 페이지로 접근하려고 하면 페이지 폴트라는 예외가 발생한다. (페이지 폴트 처리 과정은 하드웨어 인터럽트 처리 과정과 유사)

보호 비트 : 페이지에 접근할 권한을 제한하여 페이지를 보호하는 비트
페이지 읽기만 가능한 페이지면 비트가 0, 읽고 쓰기가 모두 가능한 페이지면 1
r(Read)w(Write)x(eXecute)의 조합으로 읽기, 쓰기, 실행하기 권한의 조합으로도 나타낼 수 있다.

참조 비트 : CPU가 해당 페이지에 접근한 적이 있는지 나타내는 비트
적재 이후 CPU가 읽거나 쓴 페이지는 비트가 1, 그렇지 않으면 0

수정 비트 (더티 비트) : 해당 페이지가 수정된 적이 있는지를 나타내는 비트
변경된 적이 있으면 비트는 1, 그렇지 않으면(한 번도 접근한 적 없거나 읽기만 했던 페이지) 0

수정비트는 왜 존재할까?
페이지가 메모리에서 사라질 때 보조기억장치에 쓰기 작업을 해야 하는지, 할 필요가 없는지 판단하기 위해서

KakaoTalk_20240229_021849542

10장에서... "프로세스를 fork하면 프로세스가 복제되어 메모리에 적재된다. 이 때 프로세스를 메모리에 중복 저장하지 않으면서 프로세스끼리 자원을 공유하지 않는 방법도 있다."

쓰기 시 복사 : 부모 프로세스 혹은 자식 프로세스 둘 중 하나가 페이지에 쓰기 작업을 하는 순간 해당 페이지가 별도의 공간으로 복제
프로세스 생성 시간과 메모리 공간 절약 가능
스크린샷 2024-02-29 020523



계층적 페이징 (다단계 페이지 테이블) : 페이지 테이블을 여러 개의 페이지로 쪼개고, 이 페이지들을 가리키는 페이지 테이블을 두는 방식
스크린샷 2024-02-29 021158
🔺모든 페이지 테이블이 항상 메모리에 있을 필요 X 페이지 테이블로 낭비되는 공간 줄일 수 있다.
스크린샷 2024-02-29 021358
🔺계층적 페이징 논리 주소
image
페이지 테이블의 계층이 늘어날수록 페이지 폴트가 발생했을 때 메모리 참조 횟수가 많아지므로 계층이 많다고 반드시 좋은 것은 아니다.

14-3 페이지 교체와 프레임 할당

페이지를 어떻게 관리하는가?

image


  • 앞선 내용을 통해서 가상 메모리를 이용하여 더 큰 프로세스를 사용하는 페이징에 대해서 알게 되었습니다.
  • 이번 장에서는 페이지들을 어떻게 효율적으로 관리하고 할당하는지 운영체제는 어떻게 수행하는지 알아보겠숩니다 ^_____^

요구 페이징

  • 유효 비트를 통해서 메모리에 적재하는 기법

image


  • 순수 요구 페이징 : 아무런 메모리가 없이 실행하면 페이지 폴트가 발생하고, 어느정도 페이지가 적재된 이후로 폴트 발생이 적어지는 기법
  • 요구하지 않을때는 메모리를 비어두는 방식입니다.
  • 그렇다면 안정적으로 페이징 시스템을 동작하려면??

1. 페이지 교체

  • 페이지 교체 : 메모리는 언젠가 가득차게 됩니다. 그렇다면 당장 급한 페이지가 있다면 메모리 속 페이지를 보조기억장치로 보내야겠죠.
  • 페이지 교체 알고리즘 : 효율적으로 관리하기 위해 알고리즘을 사용합니다. 페이지 폴트가 적어야 효율적으로 스왑한것으로 판단합니다.
  • 페이지 폴트 횟수 : 페이지 참조열을 통해 알 수 있습니다.

페이지 참조열 : 연속된 페이지를 생략한 페이지열.

image image

  • 연속된 페이지를 생략하는 이유는 중복된 페이지는 페이지 폴트를 발생하지 않기 때문입니다. 2-> 2로 바꾸어도 폴트는 발생하지 않겠죠.

페이지 교체 알고리즘

image

  • 단순하게 먼저 들어온 페이지로 교체하는 알고리즘, 다만 내내 실행해야하는 페이지가 존재할 수 있어 성능적으로 훌륭하진 않습니다.

image

2차 기회 페이지 교체 알고리즘

  • 개선하기 위해 나온 방식은, 한번 더 기회를 줘서 참조비트로 확인을 해줍니다. 참조비트가 1인 경우는 CPU에 접근했다는 의미로, 중요하다고 생각하면 좋습니다.

image



최적 페이지 교체 알고리즘

image

  • 페이지 참조율을 확인해서 페이지 폴트 빈도가 가장 적습니다.
  • 앞으로 오랫동안 사용되지 않을 페이지를 예측해서 스왑하기 때문에 성능은 뛰어나지만 구현이 굉장히 어렵습니다.
  • 다른 페이지 알고리즘을 평가하기 위한 이론적인 척도라고 이해하면 됩니다.

LRU 페이지 교체 알고리즘

image

  • 최근에 사용되지 않은 페이지는 앞으로도 조금 덜 사용되지 않을까..? 로 접근한 방식

image


스래싱과 프레임 할당

  • 페이지 폴트는 단순히 알고리즘 때문은 아닙니다.

image

  • 페이지 폴트가 자주 발생한다면 성능에 악영향을 주어 CPU의 이용률이 떨어지게 됩니다.
  • 페이징 교체에 시간이 너무 많이 들어 성능이 저해되는 문제를 스래싱 이라고 합니다.

image image


프레임 할당 방식

  • 우리가 알고리즘을 해결할때 각자 필요에 맞게 난이도를 설정하듯 프로세스별로 요구하는 프레임양이 존재할겁니다.
  • 요구하는 프레임을 해결하기 위해 두가지 할당 방식이 존재하는데

균등 할당

image

비례 할당

image

작업 집합 모델

image

  • 참조 지역성 원리처럼 CPU는 특정 시간대에 집중적으로 할당하게 되는데
  • 이를 활용해서 cpu가 주로 참조한 페이지 개수만큼만 할당하면 된다. 를 기반으로 나온 모델입니다.
  • 정리하면 프로세스가 일정 시간 동안 참조한 페이지 집합을 기억해서 빈번한 페이지 교체를 방지합니다.

작업 집합 구하기

_ 그쪽도 자겁직학.. 자겁집학.. 작업집팍.. 자걱치료과를 아는지~_ image

  • ㅎㅎ;ㅎㅋ 제성합니다 😹 내용이 길어서 졸릴까바..

작업 집합을 구하려면

  1. 프로세스가 참조한 페이지가 무엇인지.
  2. 시간 간격이 어떻게 되는지 알아야합니다.

image

image


페이지 폴트 빈도

  1. 페이지 폴트율이 너무 높으면 그 프로세스는 너무 적은 프레임을 갖고 있다.
  2. 페이지 폴트율이 너무 낮으면 그 프로세스는 너무 많은 프레임을 갖고 있다.

image

image

  • 페이지 폴트 빈도를 통해서 배분할 프레임을 결정하는것으로 생각하시면 됩니다.
  • 상한선과 하한선을 정해서 그 내부 범위 안에서만 할당하는거죠. -> 동적 할당 방식이라고도 합니다.
⚠️ **GitHub.com Fallback** ⚠️