Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- HTML
- 4기
- 코드트리
- Vue.js
- userprog
- 모션비트
- 오블완
- CSS
- Flutter
- 크래프톤 정글
- corou
- 핀토스
- JavaScript
- defee
- 시스템콜
- pintos
- 리액트
- 백준
- 사이드프로젝트
- 티스토리챌린지
- 스택
- 알고리즘
- 크래프톤정글
- 나만무
- 자바
- 소켓
- Java
- TiL
- 큐
- 자바스크립트
Archives
- Today
- Total
미새문지
pintOS - project1(Thread) thread.c - mlfqs 본문
728x90
thread.c - mlfqs
< calculate_advanced_priority >
더보기
// 스레드의 고급 우선순위를 계산
int calculate_advanced_priority(struct thread* t){
// priority = PRI_MAX - (recent_cpu / 4) - (nice * 2) 공식 이용
int advanced_priority;
advanced_priority = PRI_MAX - ROUND_TO_INT(DIV_INT(t->recent_cpu, 4)) - t->nice_value * 2;
return advanced_priority;
}
< thread_set_nice >
더보기
// 현재 스레드의 nice값 설정
void
thread_set_nice (int nice) {
ASSERT(thread_mlfqs == true) // mlfqs가 실행이 안됐으면 종료
// 현재 스레드의 nice값을 인자 nice로 저장
thread_current()->nice_value = nice;
// new_priority에 현재 스레드의 고급 우선순위를 계산해 넣는다.
int new_priority = calculate_advanced_priority(thread_current());
// 스레드 우선도를 설정
thread_set_priority(new_priority);
}
< thread_get_nice >
더보기
// 스레드의 nice를 가져온다.
int
thread_get_nice (void) {
ASSERT(thread_mlfqs == true) // mlfqs가 실행되지 않았으면 종료
return thread_current()->nice_value; // 현재 스레드의 nice 값을 반환
}
< update_load_avg >
더보기
// 평균 부하를 업데이트
void
update_load_avg(){
ASSERT(thread_mlfqs == true) // mlfqs가 실행되어 있지 않으면 종료
struct thread* t = thread_current();
int ready;
ready = list_size(&ready_list); // ready에 ready_list의 리스트 크기를 저장
// 현재 스레드가 유휴 스레드가 아니면 ready를 증가
if (t != idle_thread)
ready ++;
// load_avg = (59/60) * load_avg + (1/60) * ready_threads 공식 계산
load_avg = ADD_FIXED(MUL_FIXED(DIV_INT(FIXED_POINT(59), 60), load_avg),MUL_INT(DIV_INT(F,60),ready));
}
< thread_get_load_avg >
더보기
// 스레드의 평균 부하를 가져오기
int
thread_get_load_avg (void) {
ASSERT(thread_mlfqs == true)
// #define ROUND_TO_INT(x) (x >= 0 ? ((x + F / 2) /F) : ((x - F / 2 ) /F))
// 매크로를 사용해 평균 부하를 계산해 반환
int return_load_avg = ROUND_TO_INT(MUL_INT((load_avg), 100));
return return_load_avg;
}
< calculating_recent_cpu >
더보기
// recent_cpu 계산
int
calculating_recent_cpu(struct thread* t){
ASSERT(thread_mlfqs == true);
// recent에 스레드의 recent_cpu 저장
int recent = t->recent_cpu;
// recent_cpu = (2 * load_avg) / (2 * load_avg + 1) * recent_cpu + nice 공식 계산
recent = ADD_INT(MUL_FIXED(DIV_FIXED(MUL_INT(load_avg, 2), ADD_INT(MUL_INT(load_avg, 2),1)),recent),t->nice_value);
// 스레드의 recent_cpu에 recent를 저장하고 반환
t->recent_cpu = recent;
return recent;
}
< calc_all_recent_cpu >
더보기
// 시스템의 모든 스레드의 recent_cpu 계산
void calc_all_recent_cpu(){
// all_list가 비어있다면 종료
if (list_empty(&all_list))
return;
// all_list의 맨 앞 스레드를 e에 저장 (밑 for문에서 다시 가져오는데 필요할까 싶다)
struct list_elem*e = list_front(&all_list);
struct thread *t;
// e에 all_list의 첫 스레드를 넣고 끝까지 순회
for (e = list_begin (&all_list); e != list_end (&all_list); e = list_next (e)){
// t에 e의 구조체 스레드를 가져와 recent_cpu를 계산한 값을 저장
t = list_entry(e, struct thread, all_elem);
t->recent_cpu = calculating_recent_cpu(t);
}
}
< thread_get_recent_cpu >
더보기
// 스레드의 recent_cpu 가져오기
int
thread_get_recent_cpu (void) {
ASSERT(thread_mlfqs == true)
// ROUND_TO_INT 매크로로 계산해 return_value에 넣고 반환
int return_value = ROUND_TO_INT(MUL_INT(calculating_recent_cpu(thread_current()), 100));
return return_value;
}
< apply_to_all >
더보기
// 모든 스레드에 대해 calculating_recent_cpu 수행
void apply_to_all(){
struct list_elem *e;
struct thread *t;
// e에 모든 리스트의 첫 요소를 넣고 리스트의 끝까지 순회
for (e = list_begin (&all_list); e != list_end (&all_list); e = list_next (e)){
t = list_entry(e, struct thread, all_elem); // e가 있는 all_elem의 thread 포인터를 t에 저장
calculating_recent_cpu(t); // 최근 cpu 사용량 실행
}
}
< advanced_scheduling >
더보기
// 고급 우선도 스케줄링 정렬
static bool advanced_scheduling(const struct list_elem *a_, const struct list_elem *b_,
void *aux UNUSED){
// 스레드 a와 b를 가져와 비교해서 a가 작으면 true 반환 크면 false 반환
const struct thread *a = list_entry (a_, struct thread, all_elem);
const struct thread *b = list_entry (b_, struct thread, all_elem);
return a->priority > b->priority;
}
728x90
'크래프톤 정글 > pintOS' 카테고리의 다른 글
pintOS - Project 2 Userprog WIL (2) | 2024.03.23 |
---|---|
pintOS - project1(Thread) synch.c (2) | 2024.03.12 |
pintOS - project1(Thread) thread.c (1) | 2024.03.11 |
pintOS - Project 1 Thread WIL (1) | 2024.03.11 |
pintOS - project1(Thread) timer.c (1) | 2024.03.11 |