reference: https://pages.cs.wisc.edu/~remzi/OSTEP/
pthread_create()
pthread_join()
쓰레드 trace: 수행 순서 분석 trace
전역 변수의 데이터는 주소 공간의 data 영역에 있다. 따라서 멀티 쓰레드들은 이를 공유한다.
아래의 코드는 경쟁 상태가 유발되는 코드이다.
(프로그램 실행 결과)
병행성 문제가 발생하였다.
공유 자원에 대해 제어를 하지 못하였다. 이는 스케줄링이 적절히 이루어지지 않아서이다. 이를 "Uncontrolled Scheduling(제어되지 않은 스케줄링)" 문제라 한다.
(산출되는 결과는 'not deterministic')
위 그림을 보자,
'counter += 2'가 되어야 정상이지만, mov, add, mov 명령어들이 원자적으로 묶이지 않아 +=1 만 진행되었다. 이러한 상황이 반복되어 예상치 못한 결과가 나온 것이다.
멀티코어에서 경쟁 상태가 발생하면 어떻게 될까?
동기화 프로토콜이 이를 막아줄까?
하나의 차가 단일 도로 터널을 모두 지나가게 할 동안(do all), 다른 차들은 멈추게 한다(nothing).
Mutex(Mutual Exclusion, 상호 배제)
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