본문 바로가기
C언어/Pintos

WIL

by lacuca9 2024. 10. 1.

목표 :

우선순위가 높은 스레드가 먼저 CPU를 점유할 수 있도록 Priority Scheduling을 구현한다.

 

  • 스레드들은 각 우선순위에 따라 ready list에 추가
  • 현재 실행 중인 스레드의 우선순위보다 높은 우선순위의 스레드가 추가되면,
    현재 실행 중인 스레드는 바로 CPU 양도
  • 스레드는 언제든지 자신의 우선순위를 변경할 수 있다.
    우선순위를 낮추어 가장 높지 않으면 즉시 양도
  • 대기하고 있는 스레드가 여러 개면, 가장 높은 스레드가 깨야 한다

새로운 thread의 우선순위가 높으면 선점

기존 pintos에서는 ready_list에 새로운 thread가 삽입 되어도 선점x

pintos는 ready list에 삽입된 순으로 thread가 CPU 점유

 

 

WIL :

설명만 듣는것 하고 직접 구현은 차원이 다른 문제였다.

한양대 ppt, 블로그, 주변 동료들.. 바짓가랑이 붙잡고 억지로 머리에 때려박느라 벅찼다

솔직히 말해서 donate 부분은 이론만 가져가고 코드는 다시 한번 봐야 할 것 같은데..

test case를 뜯어보면서 priority 위주로 배운 것 같다.

 

 

우선 priority를 각각 다르게 줘서 생성하고 alarm_priority_thread를 실행해준다.

 

alarm_priority_thread 은 스레드가 생성되자마자 5초동안 sleep_list에 재워주고

5초 후에 깬 후에 sema up을 한다.

sema_up이 되기 전에 할 일이 있는데 sema_up 함수가 매우 중요한 역할을 하기 때문에 빨간줄

 

5초 동안 놀 순 없지 않은가. Main 스레드는 할거 해야지. 나머지 코드를 실행한다.

우선 현재 스레드 즉 Main스레드의 우선순위를 최저(0)으로 낮춰주고 

for문 루프를 타면서 sema_down을 호출한다.

 

sema_down 함수를 호출하면 while문에 도달하게 되는데 조건이 세마포어가 0이 아니면 탈출이다.

우린 처음에 세마포어 값을 0으로 초기화 했으니 당연히 while문에 걸리고

Main스레드는 waiters에 추가되고 블락된다. (즉 cpu가 아무것도 안하는 상태) 

 

# 아니 그럼 while문을 언제 빠져나와? ( 세마포어 값이 언제 0이 아니게 돼? )

우리가 처음에 alarm_priority_thread 함수에서 중요하다고 빨간줄 친 바로 그 놈이 while문을 탈출시켜준다.

sleep에 들어간 스레드들은 인터럽트가 발생하면서 깰 시간이 되면

" 나 깼어요" 를 외치고 sema_up을 해준다! (할거 다하면 삭제됨)

그렇게 되면 드디어 멈춰있던 Main스레드의 시간이 흐르게 된다. ( 세마포어 값이 1이기 때문에 )

그러고 세마포어 값을 다시 0으로 내려준다.

근데 우린 이제 겨우 main의 for문을 한번만 돌았다. 우린 이걸 10번 반복해야한다.

for문을 한번 빠져나온 main은 다시 for문으로 들어가자마자 본인이 0으로 만든 세마포어 값 때문에 

다시 while문에서 걸리게 된다.

그리고 다음에 잠들어있던 스레드가 일어나면서 sema_up을 해주면 또 탈출.. 10번 반복

 

sema_up함수다.

sema_down으로 waiters에 들어간 main스레드가 꺼내지고 세마포어를 1 증가시켜

main스레드가 잠깐 장악하면서 while문이 마저 돌게 한다. 

하지만 다음 함수 preempt_priority에 의해 ready_list에 있던 스레드가 cpu를 점령함.

 

밑에는 테스트 실행 결과이다.

 

 

딜레마 :

부족한 배경지식을 메꾸느라 책과 각종 강의영상을 천천히 곱씹으면서 보자니 

진도를 도저히 못 따라가겠고.. 

그렇다고 진도를 맞추자니 머릿속에 들어오는게 하나도 없고..

새삼 나의 부족함을 느끼는 한 주였다..

근데 뭐 어쩌겠나.. 내가 선택한 길인걸.. 악으로 .. 깡으로.. 훌쩍

'C언어 > Pintos' 카테고리의 다른 글

WIL3 (1)  (0) 2024.10.10
Understanding Threads  (0) 2024.09.25
Synchronization  (0) 2024.09.25
개요  (0) 2024.09.25