쓰레드란
특징
쓰레드 작동 원리
스택과 힙 사이 영역에 쓰레드 전용 공간이 있다.
쓰레드마다 고유의 pc와 sp가 있어서 고유하게 동작할 수 있다.
다만, 프로세스와의 차이점은
프로세스는 프로세스간에 통신이 필요할 때는 IPC기법을 사용해야 했지만, 쓰레드는 쓰레드간에 직접 통신이 가능하다.
나머지 힙, 데이터, 코드 영역은 동일한 프로세스 영역이기 때문에 모두 공유한다.
쓰레드의 장단점
장점
단점
하나의 쓰레드만 문제가 생겨도 전체 프로세스가 영향을 받음.
쓰레드를 많이 생성할 경우, Context Switching이 많이 일어나 성능이 저하.
쓰레드 동기화 문제
10만을 50번 더하니까 결과는 5천만이 나와야 하지만 훨씬 적은 숫자가 결과로 나왔다.
이유는 다음 그림과 같다.
계산된 값이 레지스터에 저장 되기 전에 컨텍스트 스위칭이 일어나고, 다시 돌아 왔을 때 이어서 작업을 진행하는데, 각각의 쓰레드에서 레지스터에 저장된 값은 1이기 때문에 쓰레드1과2는 g_count값에 1을 저장한다.
쓰레드별 작업 순서를 보장함으로 정상적인 동작이 가능.
세마포어
임계영역: 여러 쓰레드가 공유하고 있는 작업
임계자원: 임계영역에서 사용하는 변수
세마포어 기법
대기 상황의 무한 루프를 보완하기 위해 대기큐 기술로 보완
S가 0보다 작거나 같을 경우 S를 queue에 넣고 대기 시킨다(block()).
작업이 완료되면 queue에 있는 S를 제거하고 활성화 시킨다(wakeup(P))
위 로직은 운영체제를 직접 수정하여 개선 시킨 방법이다.
교착상태(Deadlock), 기아상태(Starvation)
교착상태: 무한대기상태. 즉, 두개 이상의 작업이 서로 상대방의 작업이 끝나기 만을 기다리고 있기 때문에, 다음 단계로 진행하지 못하는 상태
교착상태 해결 방법
1. 교착상태 예방
2. 교착상태 회피
3. 교착상태 발견
4. 교착상태 회복
기아상태: 특정 프로세스의 우선순위가 낮아서 원하는 자원을 계속 할당 받지 못하는 상태.
해결방법
1. 우선순위 변경