SQL Server Read/Writer 동기화 작동 원리
· Version : SQL Server
SQL Server는 스레드 동기화를 제공하여 경쟁을 방지한다. SQL Server 코드에는 다중 스레드 액세스를 고려해야하는 코드가 수많은 곳에 위치 하고 있다. 가장 일반적인 기술은 멀티스레드 코딩에 사용되는 읽기/쓰기 잠금이다.
읽기, 쓰기의 동기화 객체의 기본 개념은 쓰기 동기화와 함께 읽기에 대해서 병렬처리를 허용하는 것이다. 아래 예제는 싱글단일 경로 동기화 객체의 간단한 패턴이다. (EX : Spinlock)
· T1 - 읽기 액세스 획득
· T1 - 일부 작업 시작
· T2 - 읽기 액세스 권한 요청 – spinlock 블럭킹, CPU는 더이상 진행 하지 않음.
· T1 - 액세스 해제
· T2 - 회전을 멈추고 획득 완료
· T2 - 일부 작업
· T2 - 액세스 해재
스핀락은 간단하게 InterlockedCompareExchange를 사용하는 While 루프이다. 교환할 때 값이 0이면 변수에 1을 넣을 수있다.
while(0 != InterlockedCompareExchange(&lock, 1, 0)) { _pause(); } |
위의 단계에 따르면 T1은 잠금으로 1을 교환했을 것이다. 그런 다음 T2는 잠금 변수로 1을 넣으려고 할 때 이전 값이 0이 아닌 1이 이미 있기 때문에 T2는 회전한다. T1 작업이 완료되면 잠금을 다시 0으로 설정하여 T2가 잠금을 획득할 수 있다.
읽기/쓰기 구현은 종종 잠금 변수를 비트 필드로 취급하면서 CPU의 Interlocked * 명령어 세트를 활용 한다. 예를 들어, 4바이트 정수 값을 취하면 비트를 분해하여 비트를 다음과 같은 구조로 처리할 수 있다.
struct MyLock { int WriterBit : 1; int SpinlockBit : 1; int HasWaitersBit : 1; int ReaderCount : 29; } |
읽기는 단일 값을 교환하는 대신 요청 된 모드와 비트를 활용하여 잠금을 획득 할 수 있는지 또는 대기가 필요한지를 결정할 수있다. 이 예제로 돌아가면 읽기/쓰기 구현을 사용할 수 있다.
· T1 – 읽기 액세스 획득
· T1 – 작업 시작
· T2 – 읽기 액세스 획득 시도
· T2 – 약간 일을 시작
· T1 – 해제
· T2 – 해제
알고리즘은 아래와 유사하다.
MyLock myLocalCopy = 0; MyLock originalCopy = lock;
if(read == requestMode) { // A valid reader can only update reader bits so keep other bits zeroed myLocalCopy.ReaderCount = originalCopy .ReaderCount +1;
if(originalCopy != InterlockedCompareExchange(&lock, myLocalCopy, originalCopy)) { retry or add to waiter list }
} |
대기(wait), 쓰기 또는 스핀락 비트가 고정되지 않은 한 읽기 수를 늘릴 수 있다. T1이 잠금을 획득하면 ReaderCount = 1이고 T2가 잠금을 획득하면 ReaderCount는 2로 증가한다. 잠금이 해제되면 카운트는 감소한다. 쓰기가 필요하면 쓰기 비트가설정되어 다른 쓰기 또는 읽기가 되지 못하도록 하고 대기 및 스핀락 비트를 0으로 설정하여 읽기를 늘리고 대기 및 스핀락을 0으로 설정하여 쓰기 비트를 설정한다. 이를 통해 SQL Server 및 관련 구성요소에서 읽기/쓰기 동작을 활용할 수 있다. SQL Server가 캐시에서 무언가를 조회하는 모든 작업을 예상해보면 쓰기 객체를 사용하면 여래개의CPU에 있는 여러 스레드에서병렬로 조회를 수행할 수 있다.
[참고자료]
https://blogs.msdn.microsoft.com/bobsql/2016/07/23/how-it-works-reader-writer-synchronization/
SQL Server, MSSQL, spinlock, lock, lock mechanism, 스핀락, 대기, 잠금, 락 메카니즘, interlock
강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp