쓰레드의 개념
프로세스 : 운영체제로부터 자원을 할당받은 작업의 단위
스레드 : 프로세스가 할당받은 자원을 이용하는 실행 흐름의 단위
즉, 스레드는 프로세서 활용의 기본 단위이다.
스레드의 장점
자원을 공유하여 효율성과 경제성이 증가한다. 이때 context switching이 일어나는데 비용이 상당히 적다.
게임이 멀티스레드 프로세스라면 3개의 작업을 3개의 스레드로 각각 처리한다고 했을 때 일부 스레드가 block 되거나 wait 된다고 해도 다른 스레드는 계속해서 작업이 가능하다!
멀티 프로세스 시스템에서 여러 프로세스(쓰레드)들이 같은 공유 자원을 사용할 때, 동시에 동일한 공유 자원에 접근하지 못하도록 하는 것
write와 read가 동시에 절대 수행될 수 없음!
교착상태(Deadlock)
두 개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에 결과적으로 아무것도 완료되지 못하는 상태
기아(Starvation)
프로세스가 세마포터 큐에서 무한히 대기하는 상황
우선순위 역전(Priority inversion)
공유 자원에 대한 허가를 기다리는 동안, 낮은 우선순위 프로세스와 스케줄링 순서가 뒤바뀌는 상황
쓰레드 간 동기화를 하는 가장 단순한 방법은 한 쓰레드가 cpu를 사용할 때 일시적으로 cpu에 들어오는 인터럽트들을 막는 것이다.
일반적으론, CPU 소모를 줄일 수 있는 Block-Wakeup 방식을 사용
그러나 block-wakeup 방식은 오버헤드가 존재
따라서 critical section의 길이가 길면, block/wakeup이 적당
critical section 길이가 짧으면, busy-wait가 적당
preemptive : 선점형 스케줄링
Non-preemptive : 비선점형 스케줄링
선점형 스케줄링 (threads 에서 발생)
위의 결정 시점에서 1번~4번까지 모든 상황에서 발생
다른 프로세스에게 CPU 사용을 양보하게 되는 경우
세마포어는 3가지 방식으로 이루어져 있다.
Semaphore(n)
로 초기 설정을 한다. 이 때 n은 공유 가능한 자원의 수를 나타낸다.P()
으로 임계구역에 들어가기 전에 사용중이라는 표시를 한다V()
으로 임계구역에 나올 때 비었다고 표시한다.한 프로세스가 임계 영역에 해당하는 코드를 실행하고 있을 때 다른 프로세스가 임계 영역으로 진입하지 못하도록 하는 것
즉 하나의 공유자원에 여러 사용자가 접근하지 못하도록 lock을 설정하는 것
동기화 도구로써, lock에 접근할 때 체계적으로 접근하기 위해 사용하는 도구
동기화 도구 중 하나로 세마포어나 락보다 더 높은 레벨의 동기화이다.
어떤 실행 상태가 원하는 것과 다를 때 조건이 참이 되기를 기다리며 쓰레드가 대기할 수 있는 큐이다.
💡 Condvar는 공유 자원을 사용할 때까지 계속 loop를 도는 Busy waiting 방식을 개선하기 위해 등장
<aside>
💡 해 등장했다.
</aside>
```c
//pseudocode
while(!queue.empty())
{
sleep(1);
}
Busy waiting 방식을 사용하면 매번 CPU가 체크해주어야 한다. 만약 그냥 잠들어 있고, 누군가가 준비가 되면 일어나라고 신호를 보내 주면 어떨까?
//pseudocode
syncVar.lock.acquire();
while(!queue.empty())
{
syncVar.wait();
}
//pseudocode
syncVar.lock.acquire();
while(!queue.empty())
{
syncVar.wait();
}
//do stuff with queue
syncVar.lock.release();
다른 스레드가 Queue를 비워주고 있다고 해 보자. 다 비워졌을 때 syncVar.signal()
을 호출해 wait()에서 잠들어 있는 임의의 스레드를 깨워줄 수 있다.
우선 순위가 높은 스레드가 우선순위가 낮은 스레드를 기다리는 현상
Priority donation
높은 우선순위를 가진 thread가 낮은 우선순위의 thread에게 우선순위 기부
Multiple donation
Priority donation이 여러번 발생한 경우
ref) https://www.educative.io/answers/blocked-state-vs-waiting-state-of-a-thread
https://nostressdev.tistory.com/18
https://umbum.dev/60
https://velog.io/@dongvelop/%EC%8A%A4%EC%BC%80%EC%A4%84%EB%A7%81-%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98
https://woonys.tistory.com/entry/PintOS-Project-123-Priority-Inversion-59%EC%9D%BC%EC%B0%A8
https://gyumgyum2.tistory.com/31