본문 바로가기
멀티코어 프로그래밍/Pthread

Pthread 동기화(1)

by 기리의 개발로그 2022. 5. 15.

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

댓글