From f8755360aecb90d77e1cc47e04e4ae9e01751094 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=ED=99=8D=20=EC=9C=A0=EB=B9=88?= <sara150@ajou.ac.kr>
Date: Sun, 22 Dec 2024 23:29:11 +0900
Subject: [PATCH] Update 4. Advanced Scheduler.md

---
 PROJECT1 : THREADS/4. Advanced Scheduler.md | 24 +++++++++++++++++++++
 1 file changed, 24 insertions(+)

diff --git a/PROJECT1 : THREADS/4. Advanced Scheduler.md b/PROJECT1 : THREADS/4. Advanced Scheduler.md
index 3dde087..c16d009 100644
--- a/PROJECT1 : THREADS/4. Advanced Scheduler.md	
+++ b/PROJECT1 : THREADS/4. Advanced Scheduler.md	
@@ -57,5 +57,29 @@ recent cpu가 각 프로세스가 "최근에" 받은 CPU 타임을 측정하기
 > ... <br>
 > x(5) = a^4 * f(1) + a^3 * f(2) + a^2 * f(3) + a * f(4) + f(5). <br>
  
+`f(t)`의 값은 시간 `t`에서 1의 가중치를 갖고, 시간 `t + 1`에서 `a`의 가중치를 갖으며, 시간 `t + 2`에서 `a^2`의 가중치를 갖습니다. 또한 `x(t)`를 `k`와 연관시킬 수 있습니다: `f(t)`는 시간 `t + k`에서 약 `1/e`의 가중치를 갖고, 시간 `t + 2k`에서 약 `1/(e^2)`의 가중치를 갖습니다. 반대 방향에서 `f(t)`는 시간 `t + log_a(w)`에서 가중치 `w`로 감소합니다.
+
+`recent_cpu`의 초기 값은 생성된 첫 번째 스레드에서 0이고, 다른 새 스레드에서는 부모 스레드의 값입니다. 타이머 인터럽트가 발생할 때마다 실행 중인 스레드에 대해서만 `recent_cpu`가 1씩 증가합니다. 단, child 스레드가 실행 중이지 않을 때만 해당합니다. 또한, 1초에 한 번씩 모든 스레드(실행 중, 준비 중 또는 차단됨)에 대해 다음 공식을 사용하여 recent cpu의 값을 다시 계산합니다.
+
+> recent_cpu = (2 * load_avg)/(2 * load_avg + 1) * recent_cpu + nice
+
+`load_avg`는 실행할 준비가 된 스레드 수의 이동 평균입니다(아래 참조). `load_avg`가 1이면 평균적으로 단일 스레드가 CPU를 놓고 경쟁하고 있음을 나타내며, recent CPU의 현재 값은 `log_(2/3) .1 ≈ 6`초 동안 가중치 `.1`로 감소합니다. load avg가 2이면 가중치 `.1`로 감소하는 데 `log_(3/4) .1 ≈ 8`초가 걸립니다. recent cpu 계산 결과는 스레드가 "최근에" 받은 CPU 시간을 추정하며 감소 속도는 CPU를 놓고 경쟁하는 스레드 수에 반비례합니다.
+
+일부 테스트에서 가정한 바에 따르면 recent cpu에 대한 이러한 재계산은 시스템 틱 카운터가 1초 단위에 도달할 때, 즉 `timer_ticks() % TIMER_FREQ == 0`일 때만 수행해야 하며 다른 시간에는 수행해서는 안 됩니다.
+
+`recent_cpu`의 값은 nice 값이 음수인 스레드의 경우 음수가 될 수 있습니다. 음수 `recent_cpu` 값을 0으로 한정하지 마십시오.
+
+이 공식에서 계산 순서를 고려해야 할 수도 있습니다. 먼저 recent cpu의 계수를 계산한 다음 곱하는 것이 좋습니다. 일부 학생들의 보고에 따르면 `load_avg`를 `recent_cpu`로 직접 곱하면 오버플로가 발생할 수 있습니다.
+
+`threads/thread.c`에 스켈레톤이 있는 `thread_get_recent_cpu()`를 구현하세요.
+
+`int thread_get_recent_cpu (void);`
+> 현재 스레드 recent CPU 값의 100배를 가장 가까운 정수로 반올림하여 반환한다.
+
+### `load_avg` 계산
+
+
+
+
 
 
-- 
GitLab