> For the complete documentation index, see [llms.txt](https://jmxx219.gitbook.io/cs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://jmxx219.gitbook.io/cs/operating-system/thrashing.md).

# 스레싱 Thrashing

> CPU작업 시간보다 메모리와 스왑영역 간 페이지 교체에 시간을 많이 소비하는 것

<br>

## 배경

* [스와핑](https://jmxx219.gitbook.io/cs/operating-system/pages/G0xFC4jscbu8HKJMR5F1#swapping스와핑) 작업은 디스크 I/O 작업으로 CPU를 사용하지 않는 작업
* 스와핑 시간이 많아질 수록 CPU가 일하는 시간이 감소 함

<br>

**페이지 부재 (Page Fault)**\
CPU를 점유하고 있는 프로세스가 필요로 하는 데이터가 물리 메모리에 없는 경우

<br>

**다중 프로그램 정도 (MPD: Multi-Programming Degree)**

* 메모리에 동시에 올라가 있는 프로세스의 수
* 운영체제는 CPU 이용률이 낮으면 MPD를 높임
  * 과도하게 MPD가 높아질 경우 → 프로세스에게 할당되는 메모리 양 감소 → 페이지 부재 발생 → 프로세스 수행시간 보다 페이지 교체 시간이 많은 상태 됨

즉 스레싱이란 **`페이지 부재율이 증가하여 CPU 이용율이 급격히 떨어지는 현상`**

\ <br>

## 주요 원인

* **부적절한 페이지 교체 정책**
  * 페이지 교체 정책 실패
  * page 추가 hit rate 감소
* **시스템 리소스 부족**
  * 작은 L2캐시 및 낮은 메모리용량으로 인한 빈번한 Page Fault 발생
  * Single Core 혹은 저성능 CPU/CORE 사용
* **프로그램 메모리 관리 실패**
  * 과도한 thread()와 무분별한 fork()로 과도한 프로세스 발생
  * exit(0) 미사용 혹은 G/C 미수행으로 메모리 누수/관리 실패

\ <br>

## 프레임 할당

* 스레싱은 각 프로세스에 프레임을 할당하는 정도와 연관 됨
* 프레임 할당 방법
  * 감당할 수 있을 정도의 페이지 부재를 일으키며, 전체 프로세스가 원할하게 돌아가게 함
  * 2가지의 프레임 할당 방법 존재

<br>

### Local Replacement

* 프로세스 별로 할당된 프레임의 크기가 고정되어 있음
* 메모리 상의 `자기 자신의 프로세스 페이지`에 대해서만 교체 작업 수행
* 페이지 부재 발생 시
* 프로세스 안에서 페이지 교체 정책을 통해 자체적으로 메모리 확보

<br>

### Global Replacement

* 프로세스의 우선 순위를 따져 각 프로세스에게 동적으로 우선 순위 할당 진행
* 메모리 상의 `모든 프로세스 페이지`에 대한 교체 작업 수행
* 페이지 부재 발생 시
  * 다른 프로세스가 가지고 있던 프레임을 가져와 사용할 수 있음

\ <br>

## 스레싱 해결 방안

### 워킹셋 알고리즘(Working Set)

* 개념
  * 지역성 집합이 메모리에 동시에 올라갈 수 있도록 보장하는 메모리 관리 알고리즘
* 방법
  * [지역성](https://github.com/jmxx219/CS-Study/blob/main/OperatingSystem/캐시%20메모리.md#캐시-지역성)을 활용하여 프로세스가 많이 참조하는 페이지 집합을 메모리 공간에 계속 상주시켜 빈번한 페이지 교체현상을 줄이는 방법
* `워킹셋 윈도우` : 페이지를 참조하는 횟수
  * ex) 10,000번의 명령어 수행을 워킹셋 윈도우로 정한다
    * 현재 시점 T로부터 이전 10,000개의 명령어에 속한 녀석들이 워킹셋이 된다는 의미
  * 시간이 지남에 따라 자주 참조하는 페이지들의 집합은 변할 수 있기 때문에 워킹셋도 시간에 따라 변함

<br>

### 페이지 부재 빈도 알고리즘(Page Fault Frequency)

![](https://github.com/reddevilmidzy/CS-Study/assets/78539407/92c5b6c5-7619-4f00-abf5-86d2d56e8b23)

* 개념
  * 프로세스의 페이지 부재율을 주기적으로 조사하고 이 값에 근거하여 각 프로세스에 할당할 프레임 양을 동적으로 조절하는 알고리즘
* 방법
  * 시스템이 미리 정해 놓은 상한값(Upper bound)을 넘어가거나 하한값(Lower bound)이하로 떨어지게 되면 운영체제가 메모리에 올라가있는 프로세스의 수를 조절
    * 페이지 부재 비율 상한선 초과 → 할당한 프레임이 적다는 것 → 프레임 할당량 늘려줌
    * 페이지 부재 비율 하한선보다 낮음 → 할당한 프레임이 많다는 것 → 할당한 프레임 어느정도 회수

\ <br>

## 페이지 크기

* 페이지의 일반적인 크기 `4KB ~ 4MB`
  * 페이지의 크기는 점점 커왔고, 현재도 계속 증가 하고 있음
* 페이지 크기는 [내부 단편화](https://jmxx219.gitbook.io/cs/operating-system/pages/G0xFC4jscbu8HKJMR5F1#내부-단편화internal-fragmentation)와 `페이지 부재`의 trade-off관계

<br>

### 페이지 크기 작게 설정시

* 장점
  * 내부 단편화(Internal Fragmentation)가 줄어듦
  * 메모리 사용의 효율성을 높일 수 있음
* 단점
  * 개별 페이지에 대한 페이지 테이블을 들고 다니는 데 많은 메모리가 필요할 수 있음
  * 잦은 페이지 부재로 인한 오버헤드가 커질 수 있음

<br>

### 페이지 크기 크게 설정시

* 장점
  * 필요한 페이지 테이블의 수는 작음
  * 페이지 부재를 핸들링하는데 드는 오버헤드가 적음
* 단점
  * 내부 단편화가 큼

<br>

#### ref

[운영체제 KOCW 양희재 교수님](http://www.kocw.net/home/search/kemView.do?kemId=978503)\
[\[운영체제/OS\] 프레임 할당(Frame allocation)과 Page fault 관련 기타 이슈들](https://studyandwrite.tistory.com/23)\
[\[시나공 정보처리기사\] 2415506 스래싱](https://youtu.be/6AfFVJraKZA?si=jZVo5SuRozpuH1bO)\
[스레싱 (Thrashing)](https://blog.skby.net/%EC%8A%A4%EB%A0%88%EC%8B%B1-thrashing/)\
[스레싱(thrashing)이란 무엇인가](https://straw961030.tistory.com/155)
