뮤텍스(Mutex)와 세마포어(Semaphore)
대규모 요청이 동시에 들어오는 데이터베이스 어플리케이션의 경우 데이터의 정합성을 유지하면서 동시성을 높이는 것이 매우 중요하다. DB는 래치와 락이라는 두개의 동기화 기법으로 리소스를 동시작업으로부터 보호한다.
SQL Server에서의 래치
래치는 메모리 자원에 대해 동시변경 및 엑세스를 방지하기 위해 배타적 접근을 허용한다. 그래서 획득 및 반환이 단시간에 실행된다. 여러 스레드가 동일한 메모리 구조에 대한 래치를 동시에 획득하려고 할때 발생하는래치 경합을 해결하기 위해 하나의 큰 버퍼 풀을 여러 개의 인스턴스로 나눈 다중 버퍼 풀 구조로 해결한다. 동시성이 높을 수록 래치 경합이 일어날 가능성이 크다. 왜냐하면 데이터 갱신이 동시에 일어날 경우 버퍼에 접근하기 위해 래치를 반드시 획득해야 하기 때문이다.
래치와 잠금은 성능과 제어 범위, 목적에 차이가 있다. 래치는 메모리 내 구조에 대한 실제 작업 기간 동안에만 유지되며 메모리 내부 구조의 일관성을 유지하며 엔진에서 제어가 된다면 잠금은 트랜잭션 기간동안 유지하며 트랜잭션의 일관성을 보장하려는 목적이다. 또한 내부 엔진에서 제어되는 래치와 달리 사용자가 잠금을 제어 할 수 있다.
임계 구역
서로 다른 두 프로세스, 쓰레드의 처리 단위가 같이 접근해서는 안되는 공유 영역
교착 상태
두가지 이상의 작업이 서로 상대방의 작업이 끝나기를 하염없이 기다리는 상태. 교착상태가 발생하기 위해서 다음과 같은 발생조건이 모두 필요하다.
1. 상호배제 [ Mutual exclusion ]
프로그램이 자원을 점유하는데 있어서 배타적이다. 즉 자원 자체를 동시에 쓸 수 없는 경우를 말한다.
상호배제를 위한 방법에는 대표적으로 뮤텍스(Mutex)와 세마포어(Semaphore)가 있다.
2. 점유 상태로 대기 [ Hold and wait ]
자원을 붙잡은 상태에서 다른 자원을 기다리고 있다. 여러개의 자원을 동시에 써야 하는데 자원을 다른 프로세스가 붙잡고 놔주지 않는 경우, 자원을 사용하지 않으면서 놔주질 않으므로 해당 자원을 기다리는 다른 프로세스들도 무한히 대기해야 한다.
3. 선점 불가 [ No preemption) ]
다른 프로세스가 자원을 뺏어올 방법이 없다.
4. 순환성 대기 [ Circular wait ]
대기가 꼬리를 물고 사이클이 형성된다.
세마포어(Semaphore)
멀티프로그래밍 환경에서 공유 자원에 대한 접근 제어를 하는 방식으로 세마포어의 카운트는 1 이상이며 카운트를 조절하여 진입 가능한 프로세스/스레드 수를 조절할 수 있다. 세마포어 카운트가 항상 1인 것은 아니다.
S(세마포어 변수)
세마포어는 공유자원에 여러 프로세스가 접근하는 것을 막는 것이다. 현재 공유자원에 상태를 나타내는 카운터 변수를 각 프로세스가 확인하고 값을 변경한다. 이를 통해 여러 프로세스가 한꺼번에 접근하는 것을 막는다. 1개의 프로세스만이 자원을 점유하는것이 아니고 변수 값 만큼 프로세스의 개수를 통제한다.
P(프로세스가 임계 구역에 들어가기 전에 수행되어야 함)
프로세스가 임계 구역에 들어가기 전에 수행되고, 변수값을 1감소시킨다. 감소 시킨 값이 0보다 크면 프로세스 접근을 허용하되, 0보다 작으면 프로세스 접근을 금지한다.
V(프로세스가 작업이 끝나고 임계 구역에서 나가면서 수행함)
프로세스가 임계구역에서 나갈때는 변수 값을 1증가시킨다.
뮤텍스(Mutex)
프로세스가 임계구역에 동시에 접근 할 수 없도록 하는 상호배제 기법. 1개의 스레드만이 공유 자원에 접근할 수 있도록 한다. Lock과 Unlock개념을 사용한다.
-
lock: 현재의 임계 구역에 들어갈 권한을 얻어온다. 만일 다른 프로세스/스레드가 임계 구역을 수행 중이라면 종료할때까지 대기한다(entry section)
-
unlock: 현재의 임계 구역을 모두 사용했음을 알린다. 대기중인 다른 프로세스/스레드가 임계 구역에 진입할 수 있다(exit section)
자원을 점유하고 있는 대상이 Lock을 걸 경우 다른 대상들은 Unlock 상태가 될 때까지 기다려야 한다. 임계영역에 들어갈 때 lock을 걸어 다른 프로세스나 쓰레드가 접근하지 못하도록 하고, 임계영역에서 나올 때 lock을 해지한다.