본문 바로가기
2️⃣ 개발 지식 B+/OS

[PintOS Project1] THREADS

by ddubbu 2024. 10. 8.

 

깃헙 링크

 
FYI. Project 과제별로 브랜치를 save해두었습니다. 필요하신 분은 편히 참고하세요.
틀린 부분 제보는 언제든 환영입니다.
 
https://github.com/ddubbu-dev/pintos-1-9th-9team/tree/1-1-alarm-clock

GitHub - ddubbu-dev/pintos-1-9th-9team

Contribute to ddubbu-dev/pintos-1-9th-9team development by creating an account on GitHub.

github.com

 
https://github.com/ddubbu-dev/pintos-1-9th-9team/tree/1-2-priority-scheduling

GitHub - ddubbu-dev/pintos-1-9th-9team

Contribute to ddubbu-dev/pintos-1-9th-9team development by creating an account on GitHub.

github.com

 
 


 

발표 자료

 
10.01 WEEK07 발표
 

 
이번 과제는 PintOS 를 통해 OS Scheduling을 간단하게 실습해보는게 목표였습니다.
linux OS 에서 ps 커맨드로 확인할 수 있는 9개의 상태 중 4개의 상태로 진행한 것처럼 말이죠.
 

 
먼저, Alarm Clock 과제에서는 Polling 방식에서 Interrupt 방식으로 전환하는게 목표였습니다.
더 이상 연산이 필요 없다면, 푹 재우고 기상 시간에 깨워주도록 바꿔주었습니다.
 

 
그리고 timer_sleep은 실제 OS에서 I/O 작업 요청 후 blocked상태로 전환되는 것을, 간단 구현한 것으로 해석했습니다.
이를 위해 sleep_list 구조체를 추가해주었고, 
매 timer_interrupt 때마다 1) global tick을 올려주고 2) wake_up 을 호출하며 interrupt 방식으로 전환하였습니다.
 

 
그리고 테스트 케이스별로 어떻게 코드를 디벨럽했는지 살펴보겠습니다.
 

 
먼저 Priority Scheduler 를 구현했습니다.
“우선순위가 가장 높은 쓰레드가 선점”한다는 규칙을 갖고 있고,
실제 OS에서는 복합적으로 정의 되어있지만, PintOS에서는 단순 상수로 값을 주입해주었습니다.
위 선점 규칙을 위해 현재 쓰레드 우선순위가 변경되거나 ready_list 가 변경되는 시점에 yield를 실행할 필요가 있을지 체크 및 실행해줍니다.
 

 
그리고 ready_list 의 처음이 가장 높은 우선순위를 갖도록 내림차순 정렬을 보장해주었습니다.
 

그리고 donate 유형입니다.
핵심 로직은 lock을 보유하고 있는 쓰레드가 빠르게 실행을 끝내도록 waiters의 우선순위를 기부하는 것인데요.

  1. lock 요청시 holder의 우선순위가 낮다면, 기부 후 donations에 등록합니다. 그리고 sema를 통해 잠이 듭니다.
  2. holder가 반환 시 donations 목록에서 다음 우선순위를 받거나 없으면 복구 후 sema로 깨웁니다.

 
만약 donate lock이 여러 개라면 어떻게 될까요?

  1. lock의 타입을 관리하기 위해 멤버변수를 추가하고, 
  2. holder 반환 시 donator 한개를 대기열에서 제거하고 ready_list에 등록해줍니다.

 
마지막으로 중첩된 lock 관계일 경우에는,
holder를 타고 가서 목표 holder까지 업데이트하도록 수정합니다.
 

 
 
기본적으로 제공된 method를 익힐 필요가 있었고
comp_priority d_elem, elem 달랐던거
semaphore, condvar 간의 관계성이 보이지 않고 이해가 안됨
여전히 모르는 것 : interrupt_disabled() 의미, gdb 사용법 여전히 모름
 
 


 

발표 질문

 
Q. 스레드 상태 9가지는 어떤건지 자세히 알려줄수 있나? 
A. 첫번째 장표에 명시되어있음. 궁금하면 man ps 살펴보세요.
 
Q. Donation함수에서 Nest를 따지는 부분이 Donation list에서 하는게 아니라 마지막에 들어온 순으로 while문을 도는거 같은데 마지막에 들어온 우선순위가 제일 높은게 아니면 비효율적이지 않을까?
A. 컨텍스트 스위칭되면서 알아서 Donate 가 일어나는것 이해함. 당시에는 한번에 끝까지 타고 업데이트해야한다고 생각했음.