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





profile

강성욱 / jevida@naver.com
Microsoft SQL Server MVP
Blog : http://sqlmvp.kr
Facebook : http://facebook.com/sqlmvp

Kakao Talk : SQLMVP

Line : jevida


현재 LA에 거주하고 있으며 SQL에 관심있는 분이면 언제든 친추 환영합니다.