가상 메모리 이해하기
in Development on OS
가상 메모리에 대해 작성한 글입니다
가상 메모리
- Virtual Memory
- 물리 메모리 크기 한계 극복
- 물리 메모리보다 큰 프로세스를 실행?
- e.g. 100MB 메인 메모리에서 200MB 크기의 프로세스 실행
- 어떻게?
- 프로세스 이미지를 모두 메모리에 올릴 필요는 없다.
- 현재 실행에 필요한 부분만 메모리에 올린다!
- 오류 처리 제외, 배열 일부 제외, 워드프로세스에서 정렬, 표 기능 제외 ☞ 동적 적재(dynamic loading)와 비슷한 개념
요구 페이징
- Demand Paging
- 가상 메모리는 거의 Demand Paging을 사용(다른 방법도 있지만..)
- 프로세스 이미지는 backing store에 저장
- 프로세스는 페이지의 집합
- 지금 필요한 페이지만 메모리에 올린다(load) ☞ 요구되는 (demand) 페이지만 메모리에 올린다
- 하드웨어 지원
- valid 비트 추가된 페이지 테이블
- valid 비트 : 메모리에 없으면 0, 있으면 1
- backing store (= swap device)
- valid 비트 추가된 페이지 테이블
- 페이지 결함(Page Fault)
- 접근하려는 페이지가 메모리에 없다 (invalid) = 페이지 부재
- Backing store에서 해당 페이지를 가져온다.
- Steps in handling a page fault
- 용어
- pure demand paging : 처음 실행할 때 0개의 페이지로 시작, 속도가 느리지만 메모리가 절약됨
- prepaging : 미리 페이지를 가지고 옴
- 비교: swapping vs demand paging
- backing 스토어와 메모리를 왔다갔다 하는 것은 유사
- swapping : 프로세스 단위
- demang paging : 페이지 단위
- 유효 접근 시간
- Effective Access Time
- 메인 메모리에 올라와있는지에 따라 어떤 것은 빠르게 어떤 것은 느리게 읽혀짐. 평균적으론 얼마일까?를 나타내는 값
- p: probability of a page fault = page fault rate
- \[T_{eff} = (1-p)T_{m} + pT_{p}\]
- 예제
- \(T_{m}\) = 200 nsec (DRAM)
- \(T_{p}\) = 8 msec (seek time + rotational delay + transfer time)
- \(T_{eff}\) = (1-p)200 + p8,000,000 = 200 + 7,999,800p
- p = 1/1,000 ☞ \(T_{eff}\) = 8.2usec (40배 느림)
- p = 1/399,990 ☞ \(T_{eff}\) = 220nsec (10% 느림)
- 지역성의 원리
- Locality of reference
- local : 지역에 모여있다
- 메모리 접근은 시간적, 공간적 지역성을 가진다!
- 컴퓨터는 반복문이 많아 근처를 읽을 확률이 큼
- 실제 페이지 부재 확률은 매우 낮다
- 공간적 지역성 : 1000번째를 읽은 후 근접 부분을 읽을 확률이 큼
- Locality of reference
- 다른 방법
- HDD 는 접근 시간이 너무 길다 ☞ swap device 로 부적합
- SSD 또는 느린 저가 DRAM 사용
페이지 교체
- Page Replacement
- 요구되어지는 페이지만 backing store 에서 가져온다
- 프로그램 실행 계속에 따라 요구 페이지가 늘어나고,
- 언젠가는 메모리가 가득 차게 된다 ☞ Memory full!
- 메모리가 가득 차면 추가로 페이지를 가져오기 위해
- 어떤 페이지는 backing store로 몰아내고 (page-out)
- 그 빈 공간으로 페이지를 가져온다 (page-in)
- 용어: victim page
- Victim Page
- 쫓겨난 페이지. 희생양
- 어느 페이지를 몰아낼 것인가?
- i/o 시간 절약을 위해
- 기왕이면 modify 되지 않은 페이지를 victim으로 선택
- 방법: modified bit(= dirty bit)
- 수정되었으면 1
- 여러 페이지 중에서 무엇을 victim으로?
- Random : 성능도 랜덤
- First-In First-Out (FIFO)
- 그외
- 용어: 페이지 교체 알고리즘 (page replacement algorithms)
- 페이지 참조 스트링 (Page reference string)
- 페이지 참조 열. 몇 번째 페이지를 읽으려고 하는가?
- CPU가 내는 주소: 100 101 102 432 612 103 104 611 612
- Page size = 100 바이트라면
- 페이지 번호 = 1 1 1 4 6 1 1 6 6
- 연속된 페이지에선 page faults가 일어나지 않음
- 따라서 이어지는 숫자는 스킵하는 것이 Page reference string
- Page reference string = 1 4 6 1 6
- Page Replacement Algorithms
- FIFO (First-In First-Out)
- OPT (Optimal)
- LRU (Least-Recently-Used)
- (1) First-In First-Out (FIFO)
- Simplest
- Idea: 초기화 코드는 더 이상 사용되지 않을 것
- 예제
- 페이지 참조 스트링 = 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
- 7 0 1 -> 2 0 1 -> 2 3 1 -> 2 3 0 -> …
- number of frames = 3
- 15 page faults
- 페이지 참조 스트링 = 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
- Belady’s Anomaly
- 프레임 수 (= 메모리 용량) 증가에 Page Fault 회수 증가
- 상식에 어긋나는 일
- Simplest
- (2) Optimal (OPT)
- Rule: Replace the page that will not be used for the longest period of time
- 최적 알고리즘 (제일 좋음)
- 앞으로 가장 오랜 기간동안 사용이 안될 것을 victim으로!
- 예제
- 페이지 참조 스트링 = 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
- 7 0 1 -> 2 0 1 -> 2 0 3 -> 2 4 3 -> …
- number of frames = 3
- 9 page faults
- 페이지 참조 스트링 = 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
- Unrealistic
- 미래는 알 수 없다!
- cf. SJF CPU scheduling algorithm
- 레디큐 안에 프로세스가 여러 개 있을 때, 작업 시간이 제일 작은 것을 선택
- 작업 시간이 제일 작은 것은 실제로 알 수 없음
- (3) Least-Recently-Used (LRU)
- Rule: Replace the page that has not been used for the longest period of time
- 과거를 보고 미래를 짐작하는 알고리즘
- 최근에 가장 적게 사용된 것을 victim으로!(근사화)
- 대부분 LRU를 사용
- Idea: 최근에 사용되지 않으면 나중에도 사용되지 않을 것
- 저번 학기에 공부를 잘한 사람은 이번 학기에 공부를 잘할 확률이 높다..?
- 예제
- 페이지 참조 스트링 = 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
- 7 0 1 -> 2 0 1 -> 2 0 3 -> 4 0 3 -> …
- number of frames = 3
- 12 page faults
- 페이지 참조 스트링 = 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
- Global replacement
- 메모리 상의 모든 프로세스 페이지에 대해 교체
- Local replacement
- 메모리 상의 자기 프로세스 페이지에 대해 교체
- 성능 비교
- Global replacement가 더 효율적일 수 있다.
프레임 할당
- Allocation of Frames
- 프레임 : 물리 메모리를 일정한 크기로 나눈 블록, 메모리 단편화 문제를 해결하기 위해 고안된 기법
- CPU utilization vs Degree of multiprogramming
- Degree of multiprogramming : 메인 메모리에 올라온 프로세스의 개수
- 프로세스 개수 증가 ☞ CPU 이용률 증가
- 일정 범위를 넘어서면 CPU 이용률 감소
- 이유: 너무 많은 프로세스로 서로 메모리가 부족 -> 빈번한 page in/out
- 쓰레싱 Thrashing: 디스크 i/o 시간 증가 때문
- 쓰레싱 극복
- Global replacement 보다는 local replacement
- 프로세스당 충분한/적절한 수의 메모리(프레임) 할당
- 적절한 수를 어떻게 알 수 있을까?
- 정적 할당
- 동적 할당
- 정적 할당 (static allocation)
- 프로세스에 맞게 할당
- 균등 할당 (Equal allocation)
- 비례 할당 (Proportional allocation) : 사이즈에 비례해 할당
- 동적 할당 (dynamic allocation)
- Working set model
- Page fault frequency
- etc
- Working set model
- Locality(모여져 있음) vs working set(과거를 참고)
- Working set window
- Working set 크기 만큼의 프레임 할당
- Page-Fault Frequency (PFF)
- Page fault 발생 비율의 상한/하한선
- 상한선 초과 프로세스에 더 많은 프레임 할당
- 하한선 이하 프로세스의 프레임은 회수
페이지 크기
- Page size
- 일반적 크기: 4KB ~ 4MB
- 점차 커지는 경향을 보임
- 페이지 크기 영향
- 내부 단편화 : 작아야 좋음
- 프로세스가 35 byte 1 페이지는 10 byte일 경우, 이 프로세스는 4개의 페이지가 필요. 마지막 5 byte를 버려야 함
- Page-in, page-out 시간 : 커야 좋음
- 페이지 테이블 크기 : 커야 좋음
- Memory resolution : 정밀도, 작아야 좋음(크면 필요없는 것도 가져올 것)
- Page fault 발생 확률 : 커야 좋음
- 내부 단편화 : 작아야 좋음
- 페이지 테이블
- 원래는 별도의 chip (TLB 캐시)
- 기술 발달에 따라 캐시 메모리는 on-chip 형태로
- TLB 역시 on-chip 내장
Reference
카일스쿨 유튜브 채널을 만들었습니다. 데이터 사이언스, 성장, 리더십, BigQuery 등을 이야기할 예정이니, 관심 있으시면 구독 부탁드립니다 :)
PM을 위한 데이터 리터러시 강의를 만들었습니다. 문제 정의, 지표, 실험 설계, 문화 만들기, 로그 설계, 회고 등을 담은 강의입니다
이 글이 도움이 되셨거나 다양한 의견이 있다면 댓글 부탁드립니다 :)