본문 바로가기
[2-3]operating system/[2-3.2]Thread

스레드 동기화

by 오늘도 빛나는 너에게 2020. 6. 13.
728x90

한 스레드가 증감 연산을 수행할 때, 다른 스레드는 끝날 때까지 기다려야 한다.

이런 일반적인 문제는 흔히 '스레드 동기화' 라고 한다.

 

스레드 동기화를 달성하는 여러가지 방법이 있다. 

먼저 공유 객체가 없으면 전형 동기화할 필요가 없다. 

놀랍게도 프로그램을 재설계하고 공유 상태를 제거함으로써 복잡한 동기화 생성자를 자주 없앨수 있다.

이것이 가능하다면 여러 스레드가 단일 객체를 사용하는 것을 피하면 된다.

 

공유 상태가 꼭 필요한 경우 두번째 방식은 원자 연산 atomic poeration 만 사용하는 것인데,

연산이 단일 시간량 quantum of time 을 받아 즉시 완료함을 의미한다.

따라서 첫 번째 연산이 완료될 때까지 다른 연산을 수행할 수 있는 스레드가 존재하지 않는다.

그런 이유로 연산이 끝날 때까지 기다리는 다른 스레드를 만들 필요가 없고, 잠금을 사용할 필요가 없다.

결국 교착 상태를 배제 한다.

 

이마저 불가능하고 프로그램 로직이 더 복잡하다면, 스레드를 조정하기 위해 다른 생성자를 사용해야한다.

이 생성자의 한 그룹은 대기 스래드를 봉쇄 상태로 채운다.

봉쇄 상태에서 스레드는 가능한 한 CPU 시간을 적게 사용한다.

하지만 대기 스레드 상태를 저장하고 다른 스레드로 전환후 

상태를 다시 복원하는 context switch(프로세스의 상태를 교체하는 작업 ) 이라고 부르는 

운영체제의 스레드 스케줄러를 최소한 하나는 반드시 포함함을 의미한다.

 

이것은 많은 자원량을 얻을수 있다. 스레드가 오랫동안 일시 중지하는 경구가 있겠지만 그래도 좋다.

이런 종류의 생성자를 커널모드 생성자라고도 부르는데, 운영체제의 커널만 CPU 시간을 사용하는 스레드를 중지할수 있기때문이다.

 

짤은 기간을 기다려야 할 경우 스레드를 봉쇄 상태로 전환하는 대신에 단순히 기다리는 것이 더 낫다.

스래드가 기다리는 동안에는 약간의 CPU 시간 비용을 소모하는  context switch 을 절약한다.

이런 생성자는 사용자 모드 (user-mode) 생성자라고 한다. 매우 가볍고 빠르지만 스레드가 오랫동안 기다릴 경우 많은 CPU 시간을 소모한다.

 

다른 두 방식의 장점을 사용하겠다면 하이브리드 (Hybrid) 생성자를 고려해볼수 있다.

먼저 대기할 때 사용자 모드의 사용을 시도한 후 , 스레드가 오랫동안 충분히 기다렸다면 봉쇄 상태로 전환해서 CPU 자원을 절약한다

728x90

댓글