Thread API & Mutex(상호 배제)

Jin Hur·2021년 9월 27일
0

reference: https://pages.cs.wisc.edu/~remzi/OSTEP/

Thread API (pthread 라이브러리)

pthread_create()

  • fork()와 유사
  • 함수의 끝에 도달할 때 쓰레드는 종료

pthread_join()

  • wait()와 유사
  • for synchronization (동기화; 순서관계)

쓰레드 trace: 수행 순서 분석 trace

  • 3개의 쓰레드가 있다 가정: main, thread1, thread2
  • 스케줄링 순서: depend on the whims of scheduler


공유 자원 예시 (전역 변수)

전역 변수의 데이터는 주소 공간의 data 영역에 있다. 따라서 멀티 쓰레드들은 이를 공유한다.

아래의 코드는 경쟁 상태가 유발되는 코드이다.

(프로그램 실행 결과)

병행성 문제가 발생하였다.
공유 자원에 대해 제어를 하지 못하였다. 이는 스케줄링이 적절히 이루어지지 않아서이다. 이를 "Uncontrolled Scheduling(제어되지 않은 스케줄링)" 문제라 한다.
(산출되는 결과는 'not deterministic')

위 그림을 보자,
'counter += 2'가 되어야 정상이지만, mov, add, mov 명령어들이 원자적으로 묶이지 않아 +=1 만 진행되었다. 이러한 상황이 반복되어 예상치 못한 결과가 나온 것이다.

멀티코어에서 경쟁 상태가 발생하면 어떻게 될까?
동기화 프로토콜이 이를 막아줄까?


Uncontrolled Scheduling

발생 이유

  • 두 개의 쓰레드가 공유 데이터를 동시 접근 => Race Condition(경쟁 상태)
  • Uncontrolled scheduling => 각 수행에서 다른 결과를 낸다. depending on scheduling oreder

해결법

  • Controlled Scheduling: Do all or Nothing => "Atomicity"
  • 경쟁 상태를 만들 수 있는 코드를 잘 파악 => Critical Section(임계 구역) 파악
  • critical section에서는 오직 하나의 쓰레드만을 허용한다. => Mutual Exclusion(상호 배제)

하나의 차가 단일 도로 터널을 모두 지나가게 할 동안(do all), 다른 차들은 멈추게 한다(nothing).

Mutex(Mutual Exclusion, 상호 배제)

  • 신호등을 통해 one-lane 터널에서 하나의 차 만이 통과하게 한다.
  • "오직 하나의 쓰레드만을 임계 구역에 허용한다."
    => 원자성 보장
    => by Lock 기법

Synchronization(동기화)

  • 하나의 쓰레드는 다른 쓰레드가 작업을 끝낼 때까지 기다려야 한다.
    => 순서 관계 보장, 쓰레드1 -> 쓰레드2

참고사항

쓰레드 분류(Thread classfication)
1. User-level thread
2. Kernel-level thread

  • 쓰레드 관리가 커널에 의해 지원된다. 대부분의 OS가 제공한다.
  • 최근 나온 OS들은 모두 커널 레벨 쓰레드를 제공한다.
  • 대표적인 라이브러리: pthread(posix), windows thread, Java thread
  • pthread의 경우 리눅스 내부적으로 clone()과 sharing 옵션을 통해 구현하였다. (pthread based on kernel thread)

쓰레드가 수행할 함수 작성 시 주의사항
1) 힙 영역 할당

2) 스택 영역

쓰레드가 종료되면 해당 스택 공간은 반납됨. 메인에서 리턴 값을 참조하려 할 때 엉뚱한 값을 받을 수 있다. -> garbage

0개의 댓글