[운영체제] 3. 프로세스 & 스레드(3/5)

2.3.6 mutex 세마포어(단순버전) : 개수 세는 능력 필요 없을 때

empty : 데이터를 삽입하려면 빈 자원이 필요하므로 생산자가 사용가능한 자원의 수 확인 -> 0이면 대기

full : 데이터를 제거하려면 자원이 존재해야함 -> 0이라면 소비자는 대기

 

뮤텍스는 1, 엠프티는 N, full은 빈 슬롯의 개수.

뮤텍스는 언락과 락 둘 중 하나의 상태를 가짐. 0이면 언락, 다른 값이면 락.

 

우선순위 선점 스케쥴링에서 역전 현상 발생 : T3가 수행하고 있는데, t2시점에 락을 점유하게 됨. -> T1이 스케쥴링 -> T1실행하다가 락이 필요해짐 BUT T3가 이미 크리티컬 리전에 있기 때문에 상호 배제가 깨져서 T1은 어쩔 수 없이 잠듦.

-> T2가 와서 T2가 수행, 이후 T3가 락을 푼 다음에야 T1이 스케쥴링 되고 락을 가지고 크리티컬 리전에서 작업.

 

문제 : T3가 먼저 실행되는 건 어쩔 수 없지만, T2도 먼저 실행되어버림 : unbounded priority inversion

 

해결 : T1이 락을 점유하려는 시점에 T3가 락을 잡고 있다는 것을 확인한 순간 T3에게 자신의 우선순위를 빌려줌 -> T3 쭉 실행 -> 락 풀고나면 T1이 스케쥴링 되고 락 점유하면서 수행 후 T2수행 : 우선순위 상속

 

지금까지의 업다운 연산은 프로세스 간 연산, 스레드 간에도 세마포어가 비효율적이라 뮤텍스가 필요해짐 -> tsl인스트럽션으로 운영체제가 제공.

뮤텍스라는 메모리 변수를 레지스터로 가져와서 -> 0이면 1로 바꾸고 바로 임계구역으로 진입(리턴)

/ 레지스터 값이 0이 아니었으면 thread_yeild(중지하고 다른 스레드에게 실행 권한 양도, 대기)

 mutex_언락 : 뮤텍스에 0 값 넣는 것.

pthread는 조건변수라는 동기화 기법 제공 : 뮤텍스에다가 스레드의 수행을 대기시키는 것 추가

트라이락 : 락을 점유하려고 시도 -> 점유 못하면 바로 리턴

락 : 락 점유할 때 까지 스레드가 대기

스레드 간에서도 프로듀서 컨슈머 문제가 발생 -> sleep를 쓸 수 없음

-> condition variable(조건 변수) 사용

특정 컨디션이 될 때 까지 대기열에서 기다리는 컨디션 변수.

시그널 : 기다리는 애를 깨워주는 것. 브로드캐스트 : 모든 스레드를 깨워주는 것.