WIL

이후띵·2021년 12월 30일
0

PintOS

목록 보기
13/31

Team2

1. alarm-clock

  • busy wait 문제가 발생했다. busy 는 runninng중인 쓰레드가 cpu를 점유하고있는데, 하는일은 yield 밖에 안하는 상태이다.
  • 자원낭비 발생하기 때문에, 해결해야한다.
  • 해결방법 : sleep/awake 방식 사용, 타이머 슬립에서 busy 코드를 지우고, thread sleep 함수를 작성하여 호출하였다.
  • thread_sleep 은 block 한 쓰레드를 sleep_list에 추가하는 함수이다.
  • 전역변수로, next_tick 을 사용하여, 깨울쓰레드가 있을 때만 thread awake 를 호출하였다.
  • 그이유는, 매 틱마다 쓰레드 awake 를 쓸데없이 호출하는것을 없애기 위함이다.(sleep list 를 다 돌 필요가 없다.)

2. priority scheduling

  • 지금까지는 레디리스트에 새롭게 실행되는 쓰레드들이 뒷쪽에 추가되고 먼저들어온 쓰레드를 먼저 실행하는 FCFS(FIFO) 방식이었다.
  • 각 쓰레드마다 우선순위를 반영하여, 우선순위가 높은 쓰레드를 먼저 실행하도록 구현하는것을 목표로 하였다.
  • 레디리스트에 우선순위 기준인 내림차순으로 정렬이 되어있으면 맨앞에 있는 쓰레드가 가장 높은 우선순위를 가지는 쓰레드다.
  • list_insert_ordered 함수를 사용하여 우선순위를 반영한 레디 리스트를 만들었다.
  • 우선순위가 높은 쓰레드가 레디리스트에 들어오면 cpu 를 선점할수있도록 구현하였다.

3. Synchronization - condition variable, sema, lock

  • condition variable와 semaphore, lock을 사용해 동기화하여 임계영역에서 여러 쓰레드가 접근을 못하도록 하였다.
  • 우선순위 스케줄링에서 priority inversion이나, deadlock 일어날 수 있음
  • 이 문제를 해결하기 위해 자신보다 낮은 쓰레드에게 자신의 우선순위 부여하는 방식으로 문제 해결
profile
이후띵's 개발일지

0개의 댓글