Thrashing(쓰레싱)
- 메모리 영역에 접근하게 될 때, 메모리에 페이지 부재(=페이지 폴트(Page fault)) 비율이 높은 것을 의미하며, 심각한 성능 저하를 초래합니다.
-> 간단하게 말하면, 페이지 폴트가 시스템의 허용량을 넘어가는 것.
'프로세스가 집중적으로 사용하는 페이지들의 집합이 메모리에 한꺼번에 적재되지 못하여 페이지 부재율(page fault)이 많이 발생하고 CPU 이용율이 급격히 떨어지는 현상' 을 의미한다고 한다.
1. 메모리 허용량보다 더 많은 프로세스를 동시에 실행시키려고 할 때.
-> 말 그대로 CPU 혹사시키는 경우
2. 스케줄러가 CPU 이용률만 보고 계속해서 더 많은 프로세스를 실행시키려고 할 때.
-> 보통은 이게 문제.
엥? 스케줄러는 왜 그렇게 일을 처리하나요? 🤨
-> 스케줄러는 원래 그런 애다. 운영체제 요소 중 CPU 스케줄러라는 애가 있는데, 얘가 CPU 사용량을 감시하면서 CPU 사용량이 낮으면 프로세스에 뭘 자꾸 올린다. CPU를 계속 부려먹으려고 하는 것.
(이걸 'MPD를 높인다'고 한다. Multi-Programming Degree, 다중 프로그래밍 정도. )
문제는 현재 프로세스를 처리하기 위한 페이지가 많이 적재된 상태라 새로 할당받은 프로세스를 위한 페이지가 적어져서 페이지 폴트가 일어나도, 스케줄러는 그저 'CPU가 새 프로세스를 위한 일을 안 하고 놀고있다' 고만 생각해서 또다른 프로세스를 끝도 없이 올려댄다. 이 악순환이 계속 되면 페이지 폴트로 인한 오버헤드가 심각해진다.
운영체제가 페이지 폴트로 CPU의 낮은 사용량을 감지해내고 새 프로세스를 올리면서 전역 페이지 교체 알고리즘을 사용, 어떤 프로세스의 페이지 인지는 확인하지 않고 그냥 페이지들을 싹다 갈아치워 버린다.
그런데 갈아치워져서 사라진 페이지 중 필요한 게 있었다면 페이지 폴트를 해소하기 위해 올렸던 그 프로세스 또한 페이지 폴트를 발생시키고, 또 다른 프로세스에서 페이지를 뒤적뒤적 가져오느라 리소스를 잡아먹는다.
이렇게 프로세스들이 페이지 스왑 인, 스왑 아웃을 위해 페이징 장치를 사용해야 하는데, 이 장치에 큐가 걸리면서 레디 큐는 비게 된다.
프로세스들이 페이징 장치가 일하기를 기다리는 동안(이게 페이징 대기시간) CPU 이용률은 떨어지고, CPU 스케줄러는 또 귀신같이 이것만 감지해서 새 프로세스를 추가하여 MPD를 높이려고만 든다.
새로 시작하는 프로세스는 실행중인 프로세스들로 부터 프레임을 가져오고자 하고, 더 많은 페이지 폴트와 더 긴 페이징 대기시간을 만든다.
이론적으로는 프로세스에게 충분한 양의 프레임을 할당하면 되겠지만, 프레임 수에 제한을 두면 한번에 실행 가능한 프로세스의 수가 줄어들기 때문에 바람직한 방법은 아니다. 즉, 내가 원하는 만큼 프로그램을 못 켤 수도 있다는 것. 5개가 한계인 경우 6번째 켜려면 지금 켜져있는 것들 중 무언가를 꺼야한다는 얘기가 될 것이다.
하여 쓰레싱을 방지하기 위한 방법으로 아래 두 알고리즘이 있다.
1. 워킹셋 알고리즘
프로세스가 일정 시간동안 특정 주소 영역을 집중적으로 참고하는 경향이 있는데, 이를 '지역성 집합' 이라 한다.
지역성 집합이 메모리에 동시에 올라갈 수 있도록 하는 메모리 관리 알고리즘이다.2. 페이지 부재 빈도 알고리즘
페이지 부재율을 주기적으로 조사하고 이 값에 근거해 각 프로세스에 할당할 메모리 양을 동적으로 조절하는 관리 알고리즘이다.
작업공간 모델은 운영제체가 메모리를 관리할 때 '지역성을 활용하는 모델' 을 말한다. 위에서 나온 워킹셋 알고리즘의 워킹셋이 바로 작업공간.
운영체제는 프로세스가 필요한 전체 메모리를 할당하는 것이 아니고 일부만 할당하는데, '지역성을 잘 고려해' 현재 시점으로부터 이전에 실행된 일정한 메모리 참조만을 워킹셋으로 구별하고, 이 워킹셋을 메모리에 할당한다. 이때 이 워킹셋 구간을 '워킹셋 윈도우' 라고 한다.
-> 이를테면, 지역성을 고려한 페이지의 갯수를 7개로 하면 워킹셋 윈도우는 7이 되는 것.
(이건 혼잡제어, 흐름제어에서의 슬라이딩 윈도우와 조금 느낌이 비슷한 것 같다.)
작업공간 모델은 일정 구간만큼의 내용을 워킹셋 윈도우로 정의하고 이를 이동해가면서 워킹셋의 내용을 변경시키는 식으로 작동한다.
-> 이렇게 하면 워킹셋에는 현재 프로세스가 실행될 때 필요한 지역성 집합들이 들어가 있을테니 페이지 폴트를 최소화 할 수 있다. 페이지 폴트는 워킹셋 윈도우가 이동할 때만 발생한다.
워킹셋에 따라 메모리 프레임을 할당하면 페이지 폴트가 특정 부분에서만 발생한다.
실천하는 힘은 매우 강력한 동기부여로 부터 나온다.
그렇기 때문에 잘 만들어야 한다. 그러기 위해서 꾸준히 공부를 해야 하고.
그런데 그 공부를 학문적으로만 다가가는 것은 한계가 있다. 목적이 있어야 한다. 꼭 만들고 싶은 것, 되고 싶은 게 있어야 한다.
나는 어느 회사, 무슨 스튜디오, 무슨 게임에 들어가서, 몇년 안에 연봉 얼마! 같은 목표든 뭐든 좋으니, 나를 움직여줄 것이 있어야 한다.