티스토리 뷰
[Spin Lock]
Lock과 Unlock을 busy-waiting 방식으로 하는 것. 단일 프로세서의 경우 비지웨이팅에 들어가면 임계영역에 존재하는 프로세스들이 작업을 할 수 없기 때문에 무한루프에 빠지게 된다. 스핀락은 멀티프로세서 시스템의 운영체제에서 내부적으로 임계영역 문제를 해결하기 위해 수행한다.
CPU를 선점하고 있는 비지웨이팅 상태로 대기하기 때문에 권한이 해제되는 대로 빨리 작업을 수행할 수 있는 장점이 있지만, 선점 기간동안 다른 프로세스 작업이 지연될 수 있는 오버헤드도 존재한다. 그래서 짧게 수행할 수 있는 작업에 주로 사용된다.
스핀락은 크리티컬 섹션처럼 스레드가 임계 영역을 획득하지 못하게 되면(Lock을 획득하지 못하게 되면) 스레드가 블로킹 되는 것을 극복하기 위해 착안된 동기화 방법이다. 스레드 블로킹은 이후 스레드 컨텍스트 스위칭을 불러오게 되며 성능의 하락을 유발시킨다. 이 단점을 극복하기 위해 스핀락은 락을 점유하지 못할 때 스레드가 Bakc-off되어 다른 쓰레드에게 넘기는 것이 아니라, Loop를 돌면서 해당 스레드를 비지 웨이팅 상태로 만들어 버린다. 그러면 스레드 스위칭이 발생하지 않게 되어 컨텐그슽 스위칭이 발생하지 않게 되는 것이다.
[Critical Section]
스레드 동기화시 커널의 기능을 사용하지 않고 동기화 하는 유저 모드 동기화와 커널로 전환한 후 커널 모드로 행하는 동기화(유저 모드보다 많은 기능)로 나뉘는데, 크리티컬 섹션은 유저 동기화 방법이다.
따라서, 커널 객체를 사용하지 않기 때문에 가볍고 빠르며 핸들을 사용하지 않고, CRITICAL_SECTION이라는 타입을 정의하여 사용한다. 또한, 서로 다른 프로세스간에 접근이 불가능하며 내부적으로 인터락 함수를 사용하고 있다. 즉, 한 프로세스 내의 쓰레드 사이에서만 동기화가 가능(베타적 제어)하며 보통의 경우 가볍고 쉽게 쓸 수 있는 동기화 객체이다.(동시에 하나의 쓰레드만 실행되게 한다.)
현재 수행중인 스레드가 크리티컬 섹션을 벗어나기 전까지 동일 리소스에 접근하려고 하는 다른 리소스를 스케쥴 하지 않게 한다. 먼저 접근한 스레드는 EnterCriticalSection을 통해 락을 획득하고, 그 이후에 들어오고자 하는 스레드는 대기시킨다. 대기중인 스레드는 다른 스레드에게 CPU를 양도해야하므로 컨텍스트 스위칭이 발생하고 대기 시간동안에는 CPU점유를 하지 않게 된다.
단점으로는 크리티컬 섹션은 동일한 프로세스 내의 스레드 동기화에 사용할 수 있지만, 다른 프로세스 간 동기화에는 사용할 수 없다.
[Semaphore]
https://jhnyang.tistory.com/101
임계 영역에 접근 가능한 프로세스의 수를 가지고 있는 Counter.
서버에 프린터가 다섯 대가 물려있어요. 사용자가 프린트를 사용하려고 서버에 요청합니다. 그러면 공유자원 즉 프린터가 5개가 있으니까 5로 설정이 되는거예요. 그리고 프린터를 사용자가 사용할때마다 하나씩 감소하는겁니다. 그러다가 사용할 프린터가 없어지면 세마포어는 0이되고 누군가가 프린터를 다 쓰고 반환하면 세마포어가 다시 1이 증가하겠죠? 이런식으로 생각하면 됩니다. 다시 말하지만 여기서 세마포어는 단순히 변수예요. 공유자원의 개수를 나타내는 변수요!
스핀락과 뮤텍스와 달리 세마포어는 해제의 주체가 획득과 같지 않아도 된다. 즉, 어떤 프로세스가 세마포어의 값을 감소시켜도 다른 프로세스가 풀어줄 수 있다. 이 특징을 고려해 세마포어를 시그널 원리로 사용할 수 있다.
[Mutex]
공유된 자원의 데이터를 여러 쓰레드가 접근하는 것을 막는 것.
하나 이상의 컴포넌트가 공유자원에 접근하도록 허용할 수 있다. 지정된 수만큼의 스레드가 동시에 실행되도록 동기화하는것이 가능.
획득, 해제 두가지 상태가 존재해 하나의 컴포넌트만 공유 영역에 접근할 수 있고 획득과 해제의 주체가 동일행야 한다. 스핀락과 동일하나 권한을 획득할 때 까지 비지웨이팅 상태에 머무르지 않고 슬립 상태로 들어가고 웨이크업 되면 다시 권한 획득을 시도한다. 시스템 전반의 성능에 영향을 주고 싶지 않고 길게 처리해야 하는 작업인 경우에 주로 사용한다.
[Semaphore와 Mutex의 차이]
세마포어는 뮤텍스가 될 수 있지만, 뮤텍스는 세마포어가 될 수 없다.
세마포어는 소유할 수 없으며, 뮤텍스는 소유할 수 있고, 고유주가 그에 대한 책임을 진다.
뮤텍스의 경우 뮤텍스를 소유하고 있는 스레드가 이 뮤텍스를 해제할 수 있다. 하지만, 세마포어는 소유하지 않고 있는 스레드가 세마포어를 해제할 수 있다.
세마포어는 시스템 범위에 걸쳐있고 파일 시스템 상의 파일 형태로 존재한다. 하지만, 뮤텍스는 프로세스 범위를 가지고 프로그램이 종료될 때 자동으로 지워진다.
세마포어는 동기화 대상이 여러개 일 때, 뮤텍스는 동기화 대상이 오로지 하나 일 때 사용한다.