Pthread 동기화
Spinlock
록을 요청한 스레드가 CPU를 점유한 상태로 록이 해제될때까지 계속 록을 확인함
- 록이 해제되자마자 스레드는 진행
- 록이 짧은 시간동안 점유되는 경우 시간을 절약할 수 있음
- 문맥 교환 없이
- 스레드가 계속 록을 점검하는 동안 CPU 사이클을 소비
- 단일 프로세서 시스템에서는 사용 불가
Sleeplock
록을 요청한 스레드는 block되고 록이 해제되었을 때 그 스레드는 ready 상태로 이동
단일 프로세서 시스템에서 사용 가능
록이 오랫동안 점유되는 경우 CPU 시간을 절약할 수 있음
lock
- 이해하기 쉽고 사용하기 쉬움
- 교착 상태를 유발할 수 있음
- 우선 순위 역전의 문제
- 비싼 비용
- lock에 의한 deadlock
우선 순위 역전(Priority Inversion)
하나의 프로세서를 가정
스레드 T1이 T2보다 높은 우선 순위를 가짐(T1 > T2)
T1은 blocked 상태에 있음
T2가 스케줄되고 임계 영역에 진입
T1이 ready 상태로 감
T1의 우선 순위가 더 높기 때문에 스케줄러는 T2를 중지시키고 T1을 스케줄 함
T1이 임계 영역에 접근할 때 T2가 록을 해제하기를 기다림(영원히 대기)
해결방법
록을 점유하는 동안에는 선점 금지(unlock을 한 후 ready 상태로 이동)
세마포어(Semaphore)
세마포어 S는 음수가 아닌 정수값을 저장하는 변수
두 아토믹한 연산(P와 V)에 의해 다뤄짐
- S는 아토믹하게 증가하거나 감소함
- P(S : wait)
- 만약 S>0이면, P는 S를 감소시킨 후 복귀
- 그렇지 않다면, P는 S가 0 이 아닌 값이 될 때까지 P를 호출한 스레드를 대기(blocked)시킴
- V가 다른 스레드에 의해 수행되어 S>0이면 대기시킨 스레드 중 하나를 재시작
- 재시작 후, P는 S를 1 감소시킨 후 복귀
- V(S : post)
- V는 S를 1 증가시킴
- P에 의해 대기한 스레드가 있다면, V는 그 스레드 중 하나를 재시작
- 공유 자원을 스케줄링하기 위해 사용
바이너리 세마포어와 카운팅 세마포어
바이너리 세마포어
- 세마포어의 값은 1로 초기화 됨
- 항상 0 아니면 1인 값을 가짐
카운팅 세마포어
- 세마포어의 값은 0보다 크거나 같은 정수값을 가짐
- 여러 개의 자원이 있는 경우
- 대개 초기값은 자원의 수로 설정
바이너리 세마포어를 통한 상호 배제
- S=1로 초기화 됨
반응형
'멀티코어 프로그래밍 > Pthread' 카테고리의 다른 글
Pthread Attributes(2) (11) | 2022.05.18 |
---|---|
Pthread Attributes(1) (8) | 2022.05.17 |
Pthread를 이용한 병렬화 (13) | 2022.05.13 |
Pthread Affinity (13) | 2022.05.12 |
Pthread 프로그래밍(3) (5) | 2022.05.11 |
댓글