동기화 필수 개념
•
동기화(Synchronization): 여러 프로세스나 스레드가 작업을 수행할 때 서로 영향을 주거나 받는 경우, 그 실행 순서나 실행 시간을 조절하는 것
•
임계영역(Critical Section): 한 번에 한 개의 프로세스나 스레드만이 수행할 수 있는 코드 영역. 다른 프로세스나 스레드가 동시에 접근하면 안 되는 공유 데이터를 접근하는 부분을 의미
•
Lock : 상호 배제를 위한 잠금처리(데이터 경쟁)
•
Dead Lock : 프로세스가 자원을 획득하지 못해 다음 처리를 못하는 무한 대기(교착 상태)
•
Blocking : I/O 작업 등을 수행하는 동안 현재 스레드의 실행을 멈추는 것
•
Non-blocking : I/O 작업 등을 수행하더라도 현재 스레드의 실행을 멈추지 않는 것
동기화 기법(Synchronization techniques)
공유 자원에 대한 접근을 제어하고, 프로세스 간의 상호작용을 조절하기 위한 방법
스핀락 | 뮤텍스 | 세마포어 | |
정의 | 공유 자원에 대한 접근을 제어하는 간단한 동기화 방법.공유 자원이 사용 가능해질 때까지 계속해서 자원의 상태를 확인 한다. | 공유 자원에 대한 상호 배제를 제공하는 동기화 방법. 한 번에 하나의 스레드만이 뮤텍스를 소유하고 해당 뮤텍스가 보호하는 코드 영역에 접근할 수 있다. | 카운트를 유지하는 더 일반적인 동기화 메커니즘. 여러 스레드가 공유 자원에 접근할 수 있다. |
특징 | 가장 간단하며, 잠금 해제를 기다리는 시간이 짧을 경우 유용하다. 그러나 잠금 해제 시간이 길어지면 CPU 자원을 낭비하게 될 수 있다. | 스레드가 잠금 해제를 기다리는 동안 블로킹되므로, 자원을 보호하는 코드 영역의 실행 시간이 길어도 효율적이다. | 뮤텍스보다 더 복잡하지만, 동시에 여러 스레드가 자원에 접근하는 것을 가능하게 해서 더 많은 유연성을 제공한다. |
사용 시기 | 공유 자원에 대한 접근이 잠깐 동안만 필요하고, 잠금 해제를 기다리는 시간이 짧을 때 | 공유 자원에 대한 접근 시간이 상대적으로 길 때 또는 한 번에 하나의 스레드만이 자원에 접근해야 할 때 | 동시에 여러 스레드가 자원에 접근해야 하는 상황 또는 공유 자원의 개수가 제한된 상황 |
뮤텍스는 락을 가진 자만 락을 해제할 수 있지만, 세마포어는 그렇지 않다.
상호 배제만 필요하다면 뮤텍스를, 작업간의 실행 순서 동기화가 필요하다면 세마포어를 권장