[2024.10.21] 필수 온라인 강의 Part2 운영체제 CH05 가상 메모리 관리
페이징과 페이지 테이블
- 스와핑(swapping) : 프로세스를 보조기억장치의 일부 영역으로 쫓아내고 당장 필요한 프로세스를 적재하는 메모리 관리 기법
- swap : cpu는 실행중인 메모리내에서 코드를 가져와서 사용: 현재 사용되지 않는 프로세스 중에서 굳이 메모리에 필요없는게 있을 수도 있음 : 일부 영역으로 당장 사용되지 않는 프로세스들을 내쫓을 수 있음
- 스왑 아웃(swap-out) : 프로세스를 보조기억장치의 일부 영역으로 쫓아내는 것
- 스왑 인(swap-in) : 스왑 아웃된 프로세스를 메모리에 적재하는 것
- 스왑 영역 : 스왑 아웃된 프로세스가 적재되는 보조기억장치 영역 - 장점 : 메모리의 크기보다 더 많은 프로세스들을 적재 가능!!!!!
- A+B+C+D > 메모리 이어도, 스와핑을 사용하면 전부를 동시에 사용가능.
- 연속 메모리 할당: 프로세스를 메모리에 연속적으로 배치하는 방식
연속 메모리 할당 프로세스 B, D 실행 종료,
남아있는 공간은 50MB남은 공간 50MB에 새로운 50MB가
필요한 프로세스 적재 불가 : 파편화 되어있음
- 외부 단편화 : 프로세스들이 실행되고 종료되길 반복하며 빈 공간이 생기는 메모리 낭비 현상
- 용량이 낭비된다. - 페이징
- 물리 메모리를 프레임(frame)이라는 일정한 크기로 나누고
- 프로세스를 페이지(page)라는 일정한 크기로 나눈 뒤
- 페이지를 프레임에 매핑하는 메모리 관리 방식
- 메모리와 프로세스를 일정 단위로 자르고, 잘라진 공간에 프로세스를 할당 : 외부 단편화 발생X
- 메모리가 잘린 단위 : frame
- 프로세스가 잘린 단위 : page
: page를 frame에 할당함
-> frame과 page의 크기는 같음 ( 단, huge page 제외)
- 페이지 아웃 / 페이지 아웃 : 스왑 기능을 사용 가능하다.
- 페이징이 가상메모리 관리 기법 중 하나 - 필요할 때마다 페이지인/페이지아웃 가능
- 가상 메모리 (virtual memory)의 페이징 사용법
- 프로세스의 일부만을 적재하여 실제 물리 메모리보다 큰 프로세스를 실행하는 기술
- 페이징은 현대 운영체제에서 가장 대중적으로 사용되는 가상 메모리 관리 기법
- 세그멘테이션
- 의미있는 단위로 자름(코드단위 등등 , 크기가 균일하지 않음 : 외부단편화가 생길 수 있음)
<> 페이징 : 동일한 크기의 페이지로 자름
- 외부 단편화는 없지만, 내부단편화가 생길 수 있다.
페이지로 나눌 때, 마지막 페이지가 절대 페이지랑 똑 떨어지지 않는다 : 그만큼 남는문제가 있음
(단, 하나의 페이지 크기보다 작다.)
- 페이징 단점 : cpu입장에서는 순차적으로 읽어와서 실행을 하는데, 다음으로 실행해야하는 프로세스가 어디에 적재되어있는지 모름
-> 이를 해결해주는 게 페이지 테이블 - 페이지 테이블 : 일종의 일정표이다.
- 프레임과 페이지의 매핑 정보를 담고 있는 표 형태의 데이터
- 페이지테이블을 이용하면 물리메모리내에 불연속적으로 배치된 페이지에도 cpu 접근 가능
- 프로세스마다 페이지 테이블을 가지고 있다
- 페이지 테이블 베이스 레지스터(PTBR)
- 각 프로세스의 페이지 테이블 위치를 가리키는 레지스터
- 페이지 테이블이 메모리에 적재 되어 있으면 메모리 접근 시간 두 배 소요
- 페이지 테이블에 접근 + 페이지에 접근 이렇게 2번 실행
- 메모리접근시간이 캐시메모리/레지스터접근보다 훨씬 느림
-> 페이지 테이블의 캐시메모리를 따로 둠 : TLB(Translation Look-aside Buffer)
- TLB(Translation Look-aside Buffer) : 페이지 테이블의 캐시 메모리
- 페이지테이블 접근을 위해, 메모리 접근을 할 필요 없음
- 내가 접근하고자 하는 페이지가 TLB에 있으면 TLB hit
- TLB에 없으면 TLB miss : 메모리 접근 시간이 2배가 됨(메모리 두번 접근해야함)
- 유효 비트(valid bit)
- (페이지 테이블 내 정보) 접근하고자 하는 페이지가 보조기억장치에 있는지, 메모리에 있는지 나타냄
- 메모리 적재 (유효비트 1) , 메모리에 적재되지 않음 (유효비트 0)
- 페이지 폴트(page fault) : 접근하려는 페이지가 보조기억장치에 있을 경우
(메모리에 적재되지 않을경우, 유효비트가 0인 경우)
- 페이지 폴트는 interrupt의 일종 ***인터럽트는 반드시 이해해야할 걔념이다***
- 내가 접근하려는 페이지를 보조기억장치로부터 가지고 와야함. : 페이지를 보조기억장치->메모리로 적재
: 페이지 폴트 처리 루틴
- 작업 내역 백업
- 페이지 폴트 루틴 실행 - 접근하려는 페이지 적재
- 유효 비트 1로 변경
- 접근하려는 페이지 접근
- 보호 비트(protection bit)
- (페이지 테이블 내 정보) 접근하려는 페이지의 권한
- 읽기(가능 r1, 불가능 r0) , 쓰기(가능 w1, 불가능 w0) , 실행(가능 x1, 불가능 x0)
- 참조 비트(reference bit)
- (페이지 테이블 내 정보) 접근한 적 있는 페이지 : 한번이라도 접근한 적이 있는지! 없는지
(접근한 적이 있으면 1, 접근한 적이 없으면 0)
- 수정 비트(modify bit / dirty bit)
- (페이지 테이블 내 정보) 한번이라도 쓰기 작업을 한 적 있는 페이지인지?
- 쓰기 과정/조작이 이루어진 경우를 dirty라고 표현하는 경우가 많음.
- 존재 이유 : 보조기억장치에 저장을 해야하는지 안해야하는지 알려줘야함
- 작업은 cpu와 메모리사이에서 되고, 메모리는 전원차단시 모든 걸 종료 : 기억은 보조기억장치가 함
- 보조기억장치에서 가지고 온 자료를 수정해서 다시 저장해야하는지 아닌지 그걸 알려줘야함.
( 필요 없는 디스크 쓰기를 줄일 수 있음) - 계층적 페이징: 페이지 테이블 크기 줄이기
- 페이지 테이블을 페이징 한다고 생각하면 됨!!
요구 페이징, 스래싱
- 요구 페이징
처음부터 모든 페이지를 적재하지 않고 페이지 폴트가 발생하면 그 때 페이지를 적재한다
- 페이징이 필요할 때만 페이징을 한다는 의미
- 순수 요구 페이징
- 아무 페이지를 적재하지 않고 실행
- 첫 명령어 실행부터 페이지 폴트 발생
- 적당한 페이지가 적재된 이후부터 페이지 폴트 감소
: 페이지 폴트는 적게 발생할수록 좋다 - 페이지 폴트 최소화 방법
: 사실 물리 메모리가 크면 근본적으로 해결된다
- 프레임이 무한히 많은 메모리의 경우 ← 무한히 많은 페이지 적재 가능 : 현실적으로 힘듬
- 프레임이 한 개 있는 메모리의 경우 ← 페이지 접근할 때마다 페이지 폴트 - 스래싱 : 페이징폴트가 너무 많이 발생하여 성능이 저하되는 문제
- 프로세스 실행 시간보다 페이징에 더 많은 시간이 소요되는 문제 : 페이징이 너무 많이 발생
- 지나친 페이지 폴트로 인해 페이지 교체에 너무 많은 시간을 소요하여 성능이 저하되는 문제
- 동시 실행되는 프로세스 수(멀티프로그래밍의 정도림)를 늘린다고 해서 반드시 CPU 이용률이 비례하여 높아지는 것은 아닌 이유 : 스레싱이 발생함. - 많은 물리 메모리(프레임)를 확보할 수 없다면 페이지 폴트 횟수를 줄일 수 없는 걸까?
-> 페이지 교체 알고리즘!!!!! 보조기억장치로 내보낼 페이지(페이지아웃시킬 페이지) / 메모리에 적재할 페이지(페이지 인 할 페이지)를 잘 선별하면 된다
- 진짜 쓸 페이지만을 남기면 된다! 어떤 페이지가 필요한지 잘 판단만 하면 된다. - meminfo에서 명시된 내용에 대해서 공부하기
페이지 교체 알고리즘
- 페이지 교체 알고리즘에 따라서도 성능이 달라질 수 있다.
- 페이지 교체 알고리즘
- 메모리에 적재된 페이지 중 페이지-아웃시킬 페이지를 선정하는 방법
- 좋은 페이지 교체 알고리즘은 페이지 폴트를 적게 일으키는 알고리즘 - 좋은 페이지 교체 알고리즘을 확인하는 방법 : 페이지 폴트를 적게 일으킨다는 것을 확인 방법
- 페이지 참조열: CPU가 참조하는 페이지 중 연속된 페이지를 생략한 페이지열
- 참조한 페이지: 2 2 2 3 5 5 5 3 3 7 -> 페이지 참조열: 2 3 5 3 7
대표적인 페이지 교체 알고리즘 종류
- FIFO 페이지 교체 알고리즘
- 가장 먼저 메모리에 적재된 페이지부터 페이지-아웃
- 문제점 : 초기에 적재된 페이지 중 프로그램 실행 내내 유지할 데이터가 있을 수 있음
- 먼저 적재된 페이지도 계속 유지해야하는 페이지가 있을 수도 있음. - 2차 기회 FIFO 페이지 교체 알고리즘 ( FIFO 페이지 교체 알고리즘의 변형)
- 기본적으로 가장 오래 메모리에 머물렀던 페이지부터 페이지-아웃
- 다만 참조 비트(reference bit, cpu가 접근한적이 있1없0)가 1일 경우, 이를 0으로 변경 후 한번 더 기회 부여
- 참조비트=1, cpu가 자주 접근 할 수도 있는 페이지일수도 있다라는 의미가 될 수 있음
- 참조 비트= 0일 경우 페이지-아웃 (한번도 접근이 된 적이 없음) - 최적 페이지 교체 알고리즘
- 단순하게 생각했을 때, 메모리에서 페이지-아웃되어야 할 페이지는 앞으로 쓸 일이 잘 없는 페이지!
- 앞으로의 사용 빈도가 가장 낮은 페이지부터 교체하는 알고리즘
- 가장 낮은 페이지 폴트 빈도율을 보장하는 알고리즘 : 이상적(비현실적)인 알고리즘
- 하지만 앞으로 CPU가 어떤 페이지를 얼마나 참조할지 예측하기란 매우 어려움
- 이론적으로 페이지 교체 알고리즘의 성능을 평가할 때 주로 사용되는 알고리즘 - LRU 페이지 교체 알고리즘 (LRU 페이지 교체에 굉장히 많은 변형이 있다.)
- 가장 적게 참조할 페이지는 예측하기 어려워도
- 가장 적게 참조한 페이지는 계산하기 쉽다
- 최근에 사용되지 않은 페이지를 페이지-아웃
copy on write 걔념
- 페이징 기법을 사용하면 얻을 수 있는 이점
- 여러개의 독립적인 프로세스의 메모리 낭비를 방지할 수 있음
- copy on write 기법
프로세스끼리 자원 공유를 안 하면서, 별도의 메모리공간에 중복적재하지 않는 방법
- 프로세스를 fork하면 동일한 프로세스 두 개가 메모리에 복제하면 메모리 공간 낭비, 프로세스 생성 시간 낭비가 됨
- fork를 해서 자식 프로세스를 생성
- 부모와 자식프로세스 모두 쓰기 작업이 없고 읽기작업만 하면, 별도의 메모리 공간을 할당할 필요가 없음
- 쓰기 작업이 있을 경우 : 해당프로세스에 페이지에 해당하는 복제본이 새로 할당됨
'Study > CS 기초' 카테고리의 다른 글
네트워크 거시적으로 보기 (6) | 2024.10.21 |
---|---|
운영체제 - 파일 시스템 (4) | 2024.10.21 |
운영체제 - 동기화와 교착상태 (2) | 2024.10.21 |
운영체제 - CPU 스케줄링 (2) | 2024.10.19 |
운영체제 - 프로세스와 스레드 (5) | 2024.10.19 |