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(조건 변수) 사용
특정 컨디션이 될 때 까지 대기열에서 기다리는 컨디션 변수.
시그널 : 기다리는 애를 깨워주는 것. 브로드캐스트 : 모든 스레드를 깨워주는 것.
'UOS@운영체제' 카테고리의 다른 글
[운영체제] 3. 프로세스 & 스레드(4.8/5) (0) | 2023.04.16 |
---|---|
[운영체제] 3. 프로세스 & 스레드(4/5) (0) | 2023.04.16 |
[운영체제] 3. 프로세스 & 스레드(2/4) (0) | 2023.04.15 |
[운영체제] 1. 운영체제 서론(2/2), 프로세스 & 스레드(1/2) (0) | 2023.04.13 |
[운영체제] 1. 운영체제 서론(1/2) (2) | 2023.03.21 |