
2025.05.17
오늘한 내용 : PintOS - Project1: Threads - mlfqs 구현 완료
WEEK 09 : 정글 끝까지(PintOS) - Threads
참고한 블로그
[Pintos] Project 1 : Thread(스레드) - Advanced Scheduler (mlfqs)
../thread/build
특정 테스트만 검사
pintos -v -- -mlfqs run <테스트이름>
ex) pintos -v -- -mlfqs run mlfqs-load-1
make check TEST="mlfqs-nice-10"
전체 검사
make check
priority = PRI_MAX - (recent_cpu / 4) - (nice * 2)
- time slice(4ticks)마다 우선순위가 재계산
PRI_MAX는 우선순위의 최대값 (예: 63)recent_cpu: 스레드가 최근 사용한 CPU 시간nice: CPU를 양보하려는 성향- priority는 정수 → 계산시 소수점은 버림
nice < 0: 양보↓ → 우선순위 ↑nice = 0: priority 수치 기본값nice > 0: 양보↑ → 우선순위 ↓
recent_cpu = (2 * load_avg) / (2 * load_avg + 1) * recent_cpu + nice
- 최근 사용한 CPU시간
- 오래사용되지 않은 스레드 일수록 우선순위를 높게(recent_cpu값이 작아짐.) → 모든 스레드들이 골고루 실행될 수 있게
- recent_cpu 클수록 우선순위 감소
- 지수가중 이동평균 방식을 이용해 최근 cpu 사용량에 더 큰 가중치를 부여
(Exponetially Weigthed Moving Average)
x(t) : t번째 데이터의 지수 가중 이동평균, recent_cpu 값
a : 하이퍼 파라미터, 최적의 값을 대입해 사용, 부패율
a = k(k+1)f(t) : t번재 데이터 값, t 시간에서 사용한 cpu 양
(2 * load_avg) / (2 * load_avg + 1) 부분을 부패율 a라고 보면 지수 가중 이동평균과 같음.
load_avg = (59/60)load_avg + (1/60)*ready_threads
- load_avg
- 최근 1분동안 수행가능한(ready to run) 스레드의 평균 개수
- 시스템의 평균적인 부하
- ready_thread : 현재 실행 중이거나 준비 상태인 스레드의 수
1 << 14)| Arithmetic | C |
|---|---|
Convert n to fixed point | n * f |
Convert x to integer (rounding toward zero) | x / f |
Convert x to integer (rounding to nearest) | (x + f / 2) / f if x >= 0 |
(x - f / 2) / f if x <= 0 | |
Add x and y | x + y |
Subtract y from x | x - y |
Add x and n | x + n * f |
Subtract n from x | x - n * f |
Multiply x by y | ((int64_t) x) * y / f |
Multiply x by n | x * n |
Divide x by y | ((int64_t) x) * f / y |
Divide x by n | x / n |
* thread.h
struct thread - nice, recent_cpu, allelem 변수 추가
-------------------------
* thread.c
int load_avg; - 전역 변수 추가
thread 구조체에 all_list 추가
init_thread() - 새로 추가한 변수 초기화 추가
fixed_point 계산을 위한 함수들 선언 및 추가
thread_set_nice() 작성
thread_get_nice() 작성
thread_get_laad_avg() 작성
thread_get_recent_cpu() 작성
-------------------------
* timer.c
timer_interrupt() - mlfqs 옵션일 때만 동작하게 및 틱당 계산 추가
-------------------------
* synch.c
기부 사용하지 않으므로
lock_acquire(), lock_release() 수정
thread_set_priority() 비활성화

짱이에요
부러워요