오랜만에 친구랑 스벅에서 모각공하며 기분 전환 •ᴗ• 경찰 공무원 준비 중인 친구는 여러 시험을 보며 자신은 이해가 돼야 암기든 응용이든 된다고 한다. 한국사 시험을 예로 들면, 인조반정이 시험에 나오는 것은 극히 일부분이지만 자신은 인조반정이 일어난 이유와 계기, 사람들 간의 관계 등 세부적인 부분이 전부 이해가 돼야 외울 수 있고 시험에서 응용할 수 있다는 것이다. 친구는 끼리끼리라고 하나 ㅎㅎ 내 모습을 보는 것 같았다. 그 안의 내부적인 구조를 이해해야 겉에 시스템이 왜 이렇게 돌아가는지 와닿고, 그래야 사용하고 응용하게 된다. 이것이 OS 공부를 놓지 못하게 하는 매력인 거 같다.
왜 가상 메모리를 알아야 하고, 관리할 수 있어야 할까?
가상 메모리 시스템을 관리함으로써 성능을 최적화하는 것에 목적이 있다. 한국인 특) 빠르고 효율적인 것을 좋아한다. 물론 나도 그렇다. 프로그램의 전체적 성능 향상을 위해 가상 메모리의 성능 관리도 필요할 뿐이다.
성능을 최적화하기 위해서는 기준이 필요하다. 이 기준에 미달하면 성능이 좋지 못해서 향상이 필요하고 기준 이상이면 다른 곳에 집중해도 된다는 그러한 기준 말이다. 그 기준으로 Cost model을 사용한다.
대표적인 Cost Model로는, Page fault frequency(발생 빈도에 따른 비용 모델), Page fault rate(발생률에 따른 비용 모델)가 있다. 이것을 기준으로 page fault rate를 최소화할 수 있는 전략을 설계해나야 한다. 이전에 말했듯 page fault로 인한 context switch는 비용이 많이 들기 때문이다. 해서 context switch로 인한 kernel의 개입을 최소화하여 overhead를 줄이고, 시스템 성능을 향상시키는 전략이 필요하다.
Vitual memory 관리에는 H/W component와 S/W component가 필요하다.
먼저, 필요한 H/W 장치로는
가 있다.
가상 메모리 성능 향상을 위한 S/W적 관리 기법들은 굉장히 많다.
Allocation strategies (할당 기법)
각 프로세스에 메모리를 얼마만큼 줄 것인가?
프로세스의 실행 동안 고정된 크기의 메모리를 할당하는 Fixed allocation (고정 할당) 기법과 할당하는 메모리의 크기가 유동적인 Variable allocation (가변 할당) 기법 중에 고를 수 있다. 기법을 선택할 때 너무 큰 메모리 할당으로 인한 낭비가 없도록, 반대로 너무 적은 메모리 할당으로 인한 page fault rate 향상으로 시스템 성능이 저하되는 일이 없도록 적당한 메모리 양을 예측하는 것이 관건이다.
Fetch strategies
특정 page를 메모리에 언제 적재할 것인가?
프로세스가 참조하는 페이지들만 적재하는 Demand fetch 기법과 참조될 가능이 높은 page를 예측하여 가까운 미래에 참조될 가능성이 높은 page를 미리 적재하는 Anticipatory fetch(pre-paging) 기법이 있다.
Demand fetch 기법은 필요할 때 적재함으로 page fault로 인한 overhead가 크다.
Anticipatory fetch(pre-paging) 기법은 예측 성공 시, page fault overhead가 없다는 장점이 있으나 예상이 얼마나 맞냐를 나타내는 Hit ratio에 민감하여 잘못된 예측 시 자원의 낭비가 크다.
실제로 대부분의 시스템은 일반적으로 준수한 성능을 보여주는 Demand fetch 기법을 사용한다. 그럼에도 Anticipatory fetch(pre-paging) 기법을 배우는 것은 스스로 만든 프로그램에서 내가 만든 알고리즘은 예측이 가능함으로, 개인 프로그램에 사용하게 된다고 한다.
Placement strategies (배치 기법)
page/segment를 어디에 적재할 것인가?
paging system에서는 공간이 일정하기에 불필요한 기법이고, segmentation system에서 배운 배치 기법과 같다.
Replacement strategies (교체 기법)
빈 page frame이 없는 경우, 새로운 page를 어떤 page와 교체할 것인가?
새로운 page를 어떤 page와 교체할지 고민할 때 기준이 되는 것은 Locality(지역성)이다. 지역성이 가상 메모리 관리에 영향을 미치는 것이 잘 표현된 예시는 아래와 같다.
n = 1000
for i in range(n):
A[i] = B[i] + C[i]
page size = 1000 words
Machine instruction size = 1 word
주소 지정은 word 단위로 이루어지고
위 프로그램이 4번 page에 continuous allocation 된다고 가정할 때,
실제 기계어로 바꾸면 19000번 정도의 메모리 참조 중 5개의 page만을 집중적으로 접근하게 된다. 하여 메모리 관리 시 locality를 최대로 활용한다면, 성능을 높일 수 있다.
Fixed allocation
Variable allocation
* Working Set (WS) Algorithm
working set 이란 process가 특정 시점에 자주 참조하는 page들의 집합으로 locality를 활용하기 위한 것이다. window size라고 하는 최근 일정 시간 동안, 참조된 page들의 집합인 working set은 시간에 따라 당연히 변한다. locality에 기반을 두었기에 page fault rate (thrashing)은 감소하고, 시스템 성능을 향상시킬 수 있다.
working set은 메모리에 항상 유지되어 있어야 하며, 최근 일정 시간인 window size는 고정이기에 window size 값이 성능을 결정짓는 중요한 요소가 된다. 그럼 window size 값은 어느 정도의 값이 좋을까?
초반에는 windwo size를 조금만 늘려도 working set size가 급격하게 증가를 하고, 어느 구간에 돌입하면 완화되고, 어느 수준 이상으로 window size가 커지면 더 이상 working set size가 커지지 않는 시점이 온다. 이는 locality로 인해 아무리 window size를 늘린다 해도 특정 시간에 부분만 보기에 working set size가 늘지 않는 것이다.
이 기법의 성능을 평가할 때에는 page fault와 함께 평균 할당된 page frame 수도 영향을 미쳐서 함께 고려해야 한다. page fault가 없더라도 working set을 계속 관리해야 하기에 overhead가 있다.
Cleaning strategies (정리 기법)
변경된 page를 언제 wrtie-back 할 것인가?
즉, update bit가 1일 때 변경된 내용을 swap device에 write-back 하는 것을 언제 할 것인가?에 대한 기법이다.
변경된 해당 page가 메모리에서 내려올 때 write-back 하는 Demand cleaning 기법과 더 이상 page에 data 변경이 될 가능성이 없다고 판단할 때, 미리 write-back을 하는 Anticipatory cleaning(pre-cleaning) 기법이 있다.
이 역시 실제 대부분의 시스템은 일반적으로 준수한 성능을 보여주는 Demand cleaning 기법을 사용한다. Anticipatory cleaning(pre-cleaning) 기법은 미리 wirte-back을 하므로 page 교체 시 발생하는 wrtie-back 시간을 절약하지만 만약, write-back 이후 page 내용이 수정되는 등 잘못된 예측 시 자원의 낭비가 크기 때문이다.
Load control strategies (부하 조절 기법)
multi-programming degree를 어느 정도로 유지할 것인가?
시스템의 multi-programming degree(시스템에 들어온 process의 수)를 조절하는 전략으로, allocation strategies와 연관되고 적정 수준으로 유지하는 것이 좋다.
저부하 상태라면 시스템 자원이 낭비되고 throughput 면에서 성능이 저하되고, 고부하 상태라면 자원에 대한 경쟁 심화로 성능이 저하되고 과도한 page fault가 급격하ㅔ 많이 발생하는 Thrashing(스레싱) 현상이 발생되므로 좋지 않다.