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


반응형