SQL Server/SQL Server Tip

SQL Server Read/Writer 동기화 작동 원리

SungWookKang 2017. 3. 13. 03:05
반응형

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/

 

 

2017-01-30 / 강성욱 / http://sqlmvp.kr

 

SQL Server, MSSQL, spinlock, lock, lock mechanism, 스핀락, 대기, 잠금, 락 메카니즘, interlock


반응형