어제.. 탈주하고 싶어서
오전부터 탈주하고 싶었지만
노트북 배터리가 충전이 안되어있어서
충전하면서 에러를 노려보고
점심에는 동료들과 카페 가서 공부.
내가 겪는 이슈가 뭐였나면
load-avg-60 테스트에서
load_avg가 2초마다 출력이 되어야하는데
60초간 출력이 안되다가
한번에 60초간의 출력을 하고
그 뒤로 2초 마다 출력을 하는 에러였음.
처음엔 너무 막막했는데 혼자 디버깅하면서
printf를 테스트 .c 코드에서도 찍어보고
작동하는 timer_sleep함수나 다 찍어봄.
그래서 맨처음에 load_avg를 출력하니
1sec마다 출력하도록 timer_interrupt 선에서 출력하니
load_avg자체는 갱신이 잘 되고 있더라?
그 때부터 나아진 건 없었지만 마음은 좀 나아졌음.
get_load avg 문제라고 하기에는
그 값 자체는 그 이후에 문제없이 나오니까 아닌거같고
테스트 케이스 구성을 보니까
60초 라는 간격을 만드는 건 main이 아닌 thread가
60초간 잠들어있어서 그거 기다리느라였음.
특히 그 thread에 시간이 지날때까지 while문을 도는
그 부분을 주석처리하면 출력이 잘 됨.
근데 while문을 지우는게 해결책일리는 없고
다른 thread가 먼저 나온다는건 priority의 갱신이
잘 안 되고 있다... 일수도 있는거잖아?
그래서 테스트 코드 내에서
thread의 name과 priority를 출력하고
while문에 빠지는 경우를 따로 printf 처리했음.
그래서 맨처음에는 priority가 음수자체가 나오길래
0이하, 63 이상을 따로 잘라주는 처리를 했음.
그러자 63짜리 priority가 나옴.
분명 초기 생성해서, set nice에 의해 23으로 갱신되었다는 문구가 나왔었는데
(내가 출력해서 넣었었음)
애초에 음수와 63 이상이 나온다는 것 자체가 priority의 계산이 잘못되고있다는 거니까
priority 계산식도 바꾸고
(기본 계산식이지만 정수 - (실수)/4 - 정수*2 구조인데)
(여기서 정수를 모두 실수로 바꿔서 전부 실수식 계산을 하는 대신)
(정수는 정수로 하고, 중간 값을 실수식 계산을 하고 정수로 convert해줌.)
사실 그것보다는
priority 계산시 내가 계산하고자 하는 thread의 recent_cpu를 가져와야하는데
thread_current()로 가져오고 있어서 러닝 쓰레드의 priority 가져와서 갱신하고 앉았으니 생긴 이슈였음.
그 뒤로는 priority가 일정하게 나왔는데,
분명 main이 50이상이고 다른건 20언저리인데 priority가 존중이 안됨.
unblock 과정에서 ready list에만 넣고
priority에 따라 yield 하지 않는단 사실을 깨달았는데
unblock 과정이나 wakeup 과정에 스케쥴관련 함수 넣으면
쓰레드 상태 관련 오류가 남.
그래서 나는 advanced에는 따로 yield 하는 과정을 넣어줘야하나
그치만 그 어디도 이런걸 고치는 사람들은 없었는데 싶어서
의아함...... 그리고 뭣보다 yield가 안됨.....
인생이 답답....했는데
저녁에 와서 동료분들에게 물어보니
thread_start함수에서 4tick, TIME_SLICE마다
intr_yield_on_return()을 호출하는데,
여기서 yield_on_return이라는 bool값을 true로 바꿔주면서
인터럽트 핸들러 함수가 호출될때마다
그 값이 true면 자체적으로 yield 해준다는사실을 알게됨.
그래서 더 의문이 됨.
yield과정이 있다면 대체 왜 반영이 안된다는 것인가?
이제보니....
thread_insert ordered 함수에서
어떤 값을 비교해서 순서순으로 넣을지
부가 함수를 만들어서 넣어줘야 그 기준으로 넣어주는 함수가 있는데
advanced로 넘어오면서 priority끼리 비교해줬어야했는데
내가 init_priority를 비교하는걸 thread priority라고 이름을 짓고
priority끼리 비교하는걸 thread_donation priority라고 지었더라
(그리고 donation list에서 비교하는건 또 다르게 지음.)
당연히 donation 용이라 생각하고
제대로 확인 안 한게 실책이었음.
init_priority끼리 비교하면 당연히 안되지. 갱신하는건 priority인데.
그걸 고치고 나니 됨.
block까지 알아서 통과됐고 load 케이스가 전부 통과됐는데
recent_cpu 자체가 양수 나왔다가 음수가 나옴.
왜일까? 식은 다 맞는거같은데....
가끔 convert_x_n이라고 실수를 정수로 바꾸는 부분에 따라
오버헤드때문인지 음수가 나왔던 때가 있어서 그대로 했는데 안됨.
어디서 오버플로우가 나는건지 잘 모르겠음.
다른 팀 분이 봐주셔서 따져보니까
기본 수식...은 Load_avg가 되는데 recent_cpu가 안될 이유가
없지않나 싶었는데
이제보니 recent_cpu에서만 쓰는 매크로에서
실수끼리 곱하고 나눌때는 int64_t로 오버헤드를 최소화하는
기본 수식에도 있는 거를 내가 수정하면서 지워버렸었음.
고치니까 됨...
recent_cpu 싹 통과하고
nice까지 마저 다 통과해서
all pass....
모두가 나에게 행복해보인다고했음...
이 외에 아마 고치지 않았으면 이슈가 있었을
thread_exit 함수에서 all_list에 넣었던
all_elem을 제거하는 과정... 이 있었음.
여태 한걸 총정리해야했지만
이미 마음은 다 끝났기때문에 다른분들 에러 구경하다
일찍 퇴근.
그래서 오늘 저녁 다 정리해야지
발표준비도 하고~ 했는데
흠...
시간이 생각보다 넉넉하진않네...
OS도 봐야하는데......
이래서 인간이 방심하면 안돼...
오기 전 집에서 발표 구상 좀 한 것밖에없음.
잘때 load_avg...하면서 잤던거같음
발표 구상, 정리, 연습,
그리고
이번 project 1 정리.
WIL을 써말어...
내일부턴 알고리즘도....
꼭.