- 프로세스에게 몇 개의 프레임이 할당되는지 결정해야 함 -> Allocation of Frames
- HW/SW 측면에서 요구사항이 있음
- instruction 수행 과정에서 page fault가 안 나려면 최소 6개의 페이지 필요
- Loop 내의 page는 한꺼번에 allocate 되는 것이 유리함
- 그렇지 않으면 매 loop page fault 발생
Fixed Allocation
- 프로세스의 크기에 따라 고정적인 프레임 개수 할당하는 방식, 크기 비례 할당
Priority Allocation
- 프로세스 중요도 기반 프레임 할당
- 중요도 높은 프로세스는 빨리 끝나야 됨 -> 프레임 많이 할당 -> page fault(I/O) 적게 발생 -> waiting 상태 감소
=> 크기나 중요도만으로 프레임을 할당했을 때 너무 많이 page fault가 생기기도, 너무 적게 생기기도 함
Local Replacement: 자신에게 할당된 프레임 내에서 victim 선정; 원래의 방식
Global Replacement: 다른 프로세스의 프레임 중에서도 victim 선정할 수 있도록
Thrashing
- 충분한 페이지 프레임이 없으면 page-fault 발생률이 너무 높아짐
- I/O 발생 -> CPU utilization 낮음 -> long scheduler는 CPU가 놀고 있다고 판단해서 더 많은 프로세스를 시스템에 편입 -> MultiProgramming Degree(MPD) 가 높아짐 -> 메모리를 나눠줘야 돼 -> 기존의 프로세스에서 뻇어야 되니까 메모리 더 부족해 -> page fault 더 발생해 -> CPU utilization 더 낮아 -> ... 악순환
- 이런 상황이 Trashing임
- 과도하게 많은 프로세스가 동시에 돌아가면 안 됨
- 대응 방안은 현재 각 프로세스가 자주 접근하는 페이지들이 메모리에 올라오도록 보장해줘야 하는데 어려움
- 각 프로세스 locality 크기의 합 > 메모리 사이즈 합 => trashing 발생
Locality
- 프로그램이 어떤 순간에는 현재 접근하는 소수의 페이지만 계속 접근하는 것
- 임의시간 t 내에 프로그램의 일부분만을 집중적으로 참조
- Temporal Locality: 현재 참조된 메모리가 가까운 미래에도 참조될 가능성이 높음 (한 놈만 패는 스타일)
- Spatial Locality: 하나의 메모리가 참조되면 주변의 메모리가 계속 참조될 가능성이 높음
Working-Set Model
- Working-set: 일하는 페이지들, CPU가 접근하는 페이지들의 집합
- 현재 시점에서의 locality를 파악하기 위해 working set을 알아내는 것이 중요; 프레임 확보, victim으로 선정되지 않도록 보호
- 현재 시점 ti에서 최근 델타(delta) 분 동안 접근한 페이지들의 집합 -> WS(ti)
- 델타가 너무 작으면 working set을 포괄하지 못하게 될 수도 있음
- 델타가 너무 크면 working set이 지나간 페이지까지도 포함할 수 있음
- WSSi = 프로세스 Pi의 working set size(= working set에 포함된 페이지 개수)
- D = WSSi 전체 합 - 총 요구되는 프레임 개수
- D > m(= 사용 가능한 프레임 개수) 이면 Thrashing 발생; suspend 시켜서 메모리를 사용하지 않도록
- 페이지 교체 정책에도 적용 가능
구현의 어려움
- 각 페이지들이 working set에 속하는지 결정하려면 최근 델타 시간 내에 참조되었는지 알아야 함
- 페이지마다 참조된 시점, 시점과 델타 비교 -> overhead 장난 아님
- Approximate; reference bit 사용
- 델타가 10000이면 각 페이지에 2개의 bit 할당
- 5000번에 한 번씩 timer 인터럽트 -> 옆으로 bit copy
- 제일 왼쪽 bit는 방금 카피되었으면 5000-10000시간 내 참조 여부를 알 수 있지만, 4999시간이 지날 때까지는 bit가 이동하지 않으므로 5000-14999시간까지의 정보를 담고 있게 됨 => 최악의 경우 50%의 오류
- bit를 늘리고, interrupt를 자주 걸어주면 정확도는 올라가지만 overhead
- delta 를 어떻게 결정할 것인가? -> 더 큰 문제
- 그래서 실제로 많은 운영체제에서 사용되진 않음
Page-Fault Frequency(PFF) Scheme
- page fault 발생시킨 프로세스의 발생 빈도만 바뀌니까 page fault rate 의 수정 횟수가 바뀌지 않음 => overhead 매우 감소
- 구현 가능하지만 실제로 사용하지 않음
- 어떤 놈을 뺏을지 판단하려면 locality에 포함되지 않는 놈을 알아야 됨
Virtual Memory를 사용했을 때 이점
1. Copy-on-Write
- 부모 프로세스를 자식 프로세스로 카피하지 않아도 됨, page table을 동일하게 만들어 공유 기법 사용
2. Memory-Mapped Files
- 프로세스가 접근하는 파일 데이터 전체를 virtual address space에 mapping시켜서, file system을 통해서 read/write로 접근하는 것이 아니라 일반적인 메모리에서 데이터를 읽는 것처럼 함
- 가상 메모리를 사용하면 demand paging을 하기 때문에 접근하는 페이지만 메모리로 올라오니까 불필요하게 모든 페이지가 올라오지 않아도 됨
- 파일에 대한 접근은 파일 시스템을 통해서 접근해야 되는데, 하드디스크에 접근하는 것이기에 시간이 엄청 오래 걸림
Other Issues
Prepaging
- 프로세스의 시작 단계에서 발생하는 page fault를 줄여주기 위함
- page fault가 발생하기 전에 몇 개의 페이지를 미리 프로세스에 올려버리자
- 올렸는데 안 쓰면 손해보는 거긴 함
Page size
- page size가 커지면
- (+) address space를 자를 때 page size로 자르니까 page 개수가 줄어서 table size 줄어듦
- (+) 한 번 page fault가 발생했을 때 디스크에서 가져오는 데이터양이 많아져서 I/O 측면에서도 좋음
- (+) Locality가 하나의 페이지 안에 쏙 들어갈 가능성도 생김
- (-) frame 사이즈도 크니까 마지막 frame에서 할당됐지만 안 쓰는 메모리 생김 -> internal fragmentation
- 근데 요즘엔 메모리가 워낙 커서 internal fragmentation으로 낭비되는 공간이 심각하진 않고, I/O로 인한 비효율성 같은 게 더 문제니까 페이지 사이즈가 커지는 경향임
TLB Reach
- TLB Reach = (TLB Size) * (Page Size); TLB로 주소 변환할 수 있는 메모리 양
- locality에 포함된 페이지들은 TLB Reach로 되면 좋겠다
- Page Size를 키워서 TLB Reach를 키워볼까 -> internal fragmentation 때문에 쉽지 않음
- Multiple Page Size; 페이지 사이즈를 고정하지 않고 여러 가지로 제공해서 마지막 페이지 크기를 줄이면 internal fragmentation을 방지할 수 있음
Program Structure
- 코딩을 잘 하면 page fault를 줄일 수 있음
- int data[128][128]; 한 페이지에 각 행이 저장 ([0][0] - [0][127], [1][0] - [1][127], …)
I/O interlock
- 어떤 페이지는 victim으로 선정되어서는 안 된다고 선언하고 싶은 경우
- 하드 디스크에서 파일을 읽어서 usb로 카피하고 싶은데, 하드 디스크에서 버퍼에 올린 놈이 디스크로 쫓겨나면 다시 읽어야 됨
- pin을 꼽아서 얘는 빼지 마 하고 swap out 되지 않도록 lock을 걸어두는 것
한양대학교 강수용 교수님 운영체제 강의 내용 정리
'운영체제' 카테고리의 다른 글
[운영체제] Mass Storage Structure (2차 저장 장치) (0) | 2024.06.06 |
---|---|
[운영체제] File System (0) | 2024.05.29 |
[운영체제] Virtual Memory (1) (0) | 2024.05.06 |
[운영체제] Memory Management (2) (0) | 2024.03.24 |
[운영체제] Memory Management (1) (0) | 2024.03.20 |