스와핑(swapping)
- 프로세스를 보조기억장치의 일부 영역(스왑 영역)으로 쫓아내고 당장 필요한 프로세스를 적재하는 메모리 관리 기법
- 스와핑을 이용하면 좋은점은 현재 메모리의 크기보다 더 많은 프로세스를 적재할 수 있는 장점이 있다. 아래 이미지를 보면 프로세스 B를 보조기억장치로 스왑 아웃 시킨다. 당장 필요하지 않는 프로세스를 보조기억장치로 스왑 아웃할 수 있다.
스왑 아웃
- 프로세스를 보조기억장치의 일부 영역으로 쫓아내는 것
스왑 인(swap-in)
- 스왑 아웃된 프로세스를 메모리에 적재하는 것
스왑 영역
- 스왑 아웃된 프로세스가 적재되는 보조기억장치 영역
운영채제가 메모리를 관리하는 방법
연속 메모리 할당
보통은 생각하는 프로세스가 메모리에 적재되는 방법이 아래와 같지 않을까? 라고 생각한다.(연속 메모리 할당)
아니다. 실제로는 많은 운영체제에서 연속 메모리 할당 방식을 사용하지 않는다.
연속 메모리 할당 방법은 외부 단편화 라는 용량 낭비의 문제를 야기할 수 있다.
연속 메모리 할당 부작용
- 프로세스 B, D가 실행 종료하면 남아 있는 공간은 50MB 이다.
- 그러면 남은 공간에 적재가 가능한 것인가? 불가능하다. 실행되고 종료되길 반복하며 프로세스 외부에 빈 공간이 생기는 메모리 낭비 현상이 생긴다.(외부 단편화 현상)
페이징 방법 (외부단편화 해결 방법)
- 물리 메모리를 프레임(frame)이라는 일정한 크기로 나누고
- 프로세스를 페이지(page)라는 일정한 크기로 나눈 뒤
- 페이지를 프레임에 매핑하는 메모리 관리 방식
- 메모리와 프로세스를 일정 단위로 자르고, 잘라진 공간에 프로세스를 할당한다면?
- 메모리를 10mb 단위로 자르는 것, 프로세스 B(50mb)를 잘라서 5개를 메모리에 적재한다.
- 예외적으로 huge Page도 있다.(일정한 크기가 아님)
페이징을 이용할때도 페이지 아웃, 페이지 인을 할 수 있다.
- 페이지 인: 페이지를 메모리에 적재한다.
- 페이지 아웃: 페이지를 보조기억장치에 보낸다.
가상 메모리 (virtual memory)
- 프로세스의 일부만을 적재하여 실제 물리 메모리보다 큰 프로세스를 실행하는 기술
- 페이징은 현대 운영체제에서 가장 대중적으로 사용되는 가상 메모리 관리 기법
- 실제 물리 메모리 크기보다 훨씬 더 큰 프로세스를 사용할 수 있다.(가상 메모리 관리 기법, 페이징)
- 가상 메모리 관리 기법 중 세그멘테이션 기법도 있다, 프로세스를 의미 있는 단위로 자르는 방법이다. 크기가 균일하지 않아 외부단편화 문제가 생길 수 있다.
그렇다면 페이징을 사용하면 단편화 문제가 없는가?
그렇지 않다. 페이징은 내부 단편화 문제가 발생할 수 있다.
내부 단편화: 프로세스 내부에서 일어나는 메모리 낭비이다.
일정한 크기로 나눴을때 마지막 페이지가 다른 크기보다 적지만 균일하게 나눠지기 때문에 할당은 다른 페이지 크기만큼 할당 되는것.
어떤 페이지가 어떤 프레임에 매핑되었는지 어떻게 알 수 있을까?
CPU 프로그램 카운터 레지스터는 다음에 실행될 메모리의 주소가 적혀있다.
근데 페이징을 사용하면 다음에 실행되야할 메모리가 어디에 위치하는지 모를 수 있다.
그것을 위해서 페이지 테이블이 있다.
페이지 테이블이란, 프레임과 페이지의 매핑정보를 담고 있는 표 형태의 데이터
페이지 테이블을 이용하면 불연속적으로 배치되어 있는 페이지가 메모리내에 어디에 적재되었는지 CPU 입장에서 알 수 있다.
페이지 테이블
프로세스마다 페이지 테이블을 가지고 있다
페이지 테이블 베이스 레지스터(PTBR)
- 각 프로세스의 페이지 테이블 위치를 가리키는 레지스터
- 페이지 테이블이 어디 있는 것이 좋을까?
- 모든 페이지 테이블이 메모리에 있으면 메모리 접근 시간이 두배 소요
TLB(Translation Look-aside Buffer)
- 페이지 테이블의 캐시 메모리, CPU 근처에서 참조하고 바로 메모리 주소에 접근한다.
- 내가 접근하고자 페이지가 TLB에 있으면 TLB hit 반대는 TLB miss(메모리 접근 시간 두배)
페이지 테이블 내 정보: 유효 비트(valid bit)
- 접근하려는 페이지가 보조기억장치에 있는가? 메모리에 있는가? 를 나타내주는 비트
- 1이면 메모리에 적재된것, 0이면 메모리에 적재되지 않은 페이지
페이지 테이블 내 정보: 유효 비트(valid bit)
- 내가 접근하려는 페이지가 보조기억장치에 있을 경우: 페이지 폴트(page fault)(interrupt)
- 작업 내역 백업
- 페이지 폴트 루틴 실행-접근하려는 페이지 적재
- 유효비트 1로 변경
- 접근하려는 페이지 접근
페이지 테이블 내 정보: 보호 비트(protection bit)
- 접근하려는 페이지의 권한
페이지 테이블 내 정보: 참조 비트(reference bit)
- 접근한 적 있는 페이지인가?
페이지 테이블 내 정보: 수정 비트(modify bit / dirty bit)
- 쓰기 작업을 한적있는 페이지인가?
- 존재하는 이유는 메모리 A가 실행되고 있다 특정 페이지가 X이다.
- 메모리에 있는 내용은 보조기억장치에 저장이 되어 있어야 한다. 비휘발성
- CPU는 A 프로그램을 바꾸면 메모리 A는 바꿨지만 보조기억장치에 저장된 것을 변경해줘야 한다. 이때 수정 비트를 사용한다.
계층적 페이징: 페이지 테이블 크기 줄이기
프로세스 크기가 너무 크면 페이지 테이블도 너무 커지기 때문에 Outer 페이지 테이블을 통해 페이지 테이블에 접근한다.
요구 페이징, 스래싱
- 처음부터 모든 페이지를 적재하지 않고
- 페이지 폴트가 발생하면 그 때 페이지를 적재한다
순수 요구 페이징
- 아무 페이지를 적재하지 실행
- 첫명령어실행부터페이지폴트발생
- 적당한 페이지가 적재된 이후부터 페이지 폴트 감소
페이지 폴트는 적게 발생할수록 좋다 페이지 폴트를 적게 발생시키려면?
사실 물리 메모리가 크면 근본적으로 해결된다
- 프레임이 무한히 많은 메모리의 경우←무한히 많은 페이지 적재가능
- 프레임이 한 개 있는 메모리의 경우←페이지 접근할때마다 페이지폴트
스래싱
- 프로세스 실행 시간보다 페이징에 더 많은 시간이 소요되는 문제
- 지나친 페이지 폴트로 인해 페이지 교체에 너무 많은 시간을 소요하여 성능이 저하되는 문제
- 동시 실행되는 프로세스 수를 늘린다고 해서 반드시 CPU 이용률이 비례하여 높아지는 것은 아닌 이유
- 스래싱이 발생할 수 있다.
많은 물리 메모리(프레임)를 확보할 수 없다면 페이지 폴트 횟수를 줄일 수 없는 걸까?
- 페이지 교체 알고리즘
- 보조기억장치로 내보낼 페이지 / 메모리에 적재할 페이지를 잘 선별하면 된다
페이징 교체 알고리즘
- 메모리에 적재된 페이지 중 페이지-아웃시킬 페이지를 선정하는 방법
- 좋은 페이지 교체 알고리즘은 페이지 폴트를 적게 일으키는 알고리즘
페이지 폴트를 적게 일으킨다는 것은 어떻게 알 수 있을까?
- 페이지 참조열: CPU가 참조하는 페이지 중 연속된 페이지를 생략한 페이지열
- 참조한페이지: 2223555337
- 페이지참조열: 23537
이번 시간에 학습할 페이지 교체 알고리즘
- FIFO 페이지 교체 알고리즘
- 2차 기회 FIFO 페이지 교체 알고리즘
- 최적 페이지 교체 알고리즘
- LRU 페이지 교체 알고리즘
FIFO 페이지 교체 알고리즘
- 가장 먼저 메모리에 적재된 페이지부터 페이지-아웃
- 문제가 발생한다.
- 초기에 적재된 페이지 중 프로그램 실행 내내 유지할 데이터가 있을 수 있다
2차 기회 FIFO 페이지 교체 알고리즘
- FIFO 페이지 교체 알고리즘의 변형
- 기본적으로 가장 오래 메모리에 머물렀던 페이지부터 페이지-아웃
- 다만참조비트가1일경우,이를0으로변경후한번더기회부여
- 참조 비트가 0일 경우 페이지-아웃
최적 페이지 교체 알고리즘
- 단순하게 생각했을 때, 메모리에서 페이지-아웃되어야 할 페이지는 앞으로 쓸 일이 잘 없는 페이지!
- 앞으로의 사용 빈도가 가장 낮은 페이지부터 교체하는 알고리즘
- 가장 낮은 페이지 폴트 빈도율을 보장하는 알고리즘
- 하지만 앞으로 CPU가 어떤 페이지를 얼마나 참조할지 예측하기란 매우 어려움
- 이론적으로 페이지 교체 알고리즘의 성능을 평가할 때 주로 사용되는 알고리즘
LRU 페이지 교체 알고리즘
- 가장 적게 참조할 페이지는 예측하기 어려워도
- 가장 적게 참조한 페이지는 계산하기 쉽다
- 최근에 사용되지 않은 페이지를 페이지-아웃
copy-on-write
- “프로세스를 fork하면 동일한 프로세스 두 개가 메모리에 복제된다”
- “그 이유는 프로세스끼리는 기본적으로 자원을 공유하지 않기 때문이다”
이러한 방법은
→ 메모리 공간 낭비 → 프로세스 생성 시간 낭비
복제 프로세스를 생성할 경우 이를 중복 저장하지 않고 동시에 프로세스 간의 자원을 공유하지 않게끔 하는 방법
- 처음 자식 프로세스를 생성했을 경우, 읽기 작업만 있다면 굳이 메모리를 별도로 할당할 필요가 없다.
- 하지만 쓰기 작업이 있는 경우, 메모리에 복사본이 적재가 된다.
결론
가상 메모리 관리는 스와핑을 통해 현재 메모리보다 더 많은 프로세스를 실행할 수 있게 해준다. 프로세스는 페이지 단위로 나뉘어 관리되며, 필요한 페이지만 메모리에 적재하는 요구 페이징 방식을 사용한다. 페이지 폴트가 발생하면 페이지 교체가 이루어지는데, FIFO, 2차 기회 FIFO, 최적, LRU 등 다양한 페이지 교체 알고리즘이 존재한다. 과도한 페이지 폴트로 인한 성능 저하인 스래싱을 방지하기 위해 적절한 페이지 교체 알고리즘 선택이 중요하다. 또한 copy-on-write 기법을 통해 프로세스 fork 시 메모리 낭비를 최소화하고 효율적인 자원 관리가 가능하다.
'Computer Science > Operating System' 카테고리의 다른 글
[Computer Science] [운영체제] 파일 시스템 (0) | 2025.01.05 |
---|---|
[Computer Science] [운영체제] 동기화와 교착상태 (2) | 2025.01.01 |
[Computer Science] [운영체제] CPU 스케줄링 (0) | 2024.12.31 |
[Computer Science] [운영체제] 프로세스와 스레드 (1) | 2024.12.30 |