Memory


<aside> 💡 NOTE

주소변환은 운영체제가 관여하지 않았는데, virtual memory 기법은 전적으로 운영체제가 관여한다.

실제로 필요할 때 page를 메모리에 올린다. = Demand Paging

Page Fault 단계

스크린샷 2024-03-17 오후 7.43.25.png

invalid page를 접근하면 MMU가 트랩을 발생시킵니다. 이후 커널 모드로 들어가서 page fault handler에 의해 invoke됩니다.

  1. 잘못된 요청인지 확인 → 잘못 되었으면 process abort
  2. 빈 page frame을 가집니다. 없으면 replace 뺏어서 가져옵니다.
  3. 해당 page를 disk에서 메모리로 가져옵니다.(가장 우선순위가 높은 ready queue로 부여)
  4. disk를 읽으면 page table entry로 valid 기록
  5. ready queue의 process를 insert에서 dispatch 로 변경
  6. 중단된 process 다시 처리

Performance of Demand Paging

스크린샷 2024-03-24 오후 6.52.42.png

하지만 이런 page fault 처리로 disk에 접근하는 것은 시간을 많이 소모하는 작업이다. 또한 overhead가 매우 크다.

따라서 처리하는 시간과 접근 시간의 비율을 계산해서 효율적인 값으로 비율을 맞춘다.

Free frame이 없는 경우

page replacement

replace 알고리즘

Page Replacement

스크린샷 2024-03-17 오후 7.52.56.png

valid, invalid를 통해서 관리하는 방법

메모리에서 swap in, out을 OS에서 처리해준다.

알고리즘

스크린샷 2024-03-24 오후 6.57.36.png

optimal : 미래의 순서를 알고있다고 가정, 가장 먼 미래에 참조되는 page로 대체하는 것 → 실제로 구현은 할 수 없지만 잘 만든 알고리즘의 page faults 최소 기준을 알려준다.

fifo : 선입 선출, 메모리 프레임을 늘려줘도 성능이 오히려 나빠지는 성질을 가진다.

스크린샷 2024-03-24 오후 6.59.08.png

lru(Least Recently Used) : 가장 오래전에 참조된것을 먼저 지운다.

스크린샷 2024-03-24 오후 6.59.59.png

lfu(Least Frequently Used) : 참조 횟수가 가장 적은 page를 먼저 지운다.

스크린샷 2024-03-24 오후 7.03.04.png

장점 : LRU처럼 직전 참조 시점만 보는 것이 아니라 장기적인 시간 규모를 보기에 page의 인기도 정확하게 반영 단점 : 참조 시점의 최근성을 반영하지 못한다. LRU보다 복잡하다.

어떤 메모리를 쫒아낼지에 대한 알고리즘

스크린샷 2024-03-24 오후 7.07.29.png

LRU : 한줄로 줄세우기→ 쫒아낼 것은 가장 위에서 보내고 가장 최근에 참조한 것은 가장 밑으로 보내는 것(모두 확인 안하고도 보낼 수 있다.)

LFU : 참조횟수가 1늘어나면 다른 값보다 참조횟수가 많아야 내려가므로 모두 확인할 필요가 있다. 따라서 힙을 통해 관리를 하는 방식(트리) - 부모가 자식보다 참조횟수가 많으면 자식으로 내려가는 것 O(log n)에 가능하다.

</aside>

Virtual Memory2

<aside> ✍️ NOTE

스크린샷 2024-03-24 오후 7.18.05.png

invalid인 경우 page fault 발생 → trap → OS → disk에 있는 메모리를 가상 메모리로 올려준다.

OS에서는 cpu 내부에서 처리하는 것을 관리할 때 OS에 넘어오지 않은 상태에서 처리를 해버리기 때문에 적용할 수 없다.

LRU, LFU 는 웹 캐싱, 버퍼 캐싱 같은 것에서는 사용할 수 있다.

Clock 알고리즘

스크린샷 2024-03-24 오후 7.21.43.png

하드웨어가 참조값이 최근에 사용되면 reference bit의 값을 1로 바꾼다.

그리고 page fault가 발생했을 때 OS에서 reference bit을 확인하고 bit 값을 0으로 바꾼다. 그리고 사용하지 않은 값들을 쫒아낸다.

modify bit은 수정을 했다면 modify bit을 1로 바꾸고 OS에서 확인할 때 같이 확인해서 값을 변경도 해준다.

page fault가 너무 자주 발생하면 스레싱이 발생한다.

스크린샷 2024-03-24 오후 7.29.55.png

프로그램을 여러개 올리게 되면 cpu 사용량이 증가한다.

하지만 어느정도 값을 넘으면 뚝 떨어지낟.

메모리 할당량이 너무 낮아지게되면 page fault가 너무 많이 발생해서 제대로 업무를 못하는 것 → swap in/out에 시간 대부분을 소모

degree의 값을 조절해서 사용하는 방법을 통해 방지할 수 있다.

working set model

한번에 여러 개의 최소 값을 받아서 처리하게된다.

하지만 그 페이지를 받을 수 없다면 모두 반환해서 받을 수 있을 때까지 suspend상태로 유지한다.

스크린샷 2024-03-24 오후 7.34.51.png

</aside>