mutex
semaphore
세마포어를 사용하기 전 값을 초기화 해야한다
sem_wait()
세마포어 값이 1 이상이면 리턴, 아니면 세마포어 값이 1이 될 때 까지 대기
0일때 wait을 호출하면
세마포어가 음수일때는 대기중인 쓰레드의 개수와 절대 값이 같다
sem_post()
락
시나리오
스레드 0:
sem_wait을 호출하면 값이 1->0으로 된다
그럼 임계영역은 호출한 스레드꺼가 됨
이때 인터럽트가 일어나서 스레드 1로 가게되어
쓰레드0은 running에서 ready state로 가게됨
쓰레드1이 sem_wait을 호출하면 값이 0->-1로 됨
그리고 state가 running에서 sleeping으로 가게됨
다시 인터럽트로 쓰레드0으로 돌아옴
그럼 ready -> running으로 state 바뀜
임계영역에 볼일 끝나 sem_post 호출하면 세마포어값이 -1 -> 0,
스레드 1을 깨움 스레드 1 상태 sleeping에서 ready로
인터럽트로 다시 running-> ready로 바뀜
스레드 1로 돌아옴
ready에서 running으로
임계영역 차지함
동작 완료 후 sem_post 호출
세마포어값 0 -> 1로