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

No. Subject Author Date Views
Notice SQL강좌: 챗GPT와 함께 배우는 SQL Server 무료 강좌 목차와 소개 (2023년 9월 업데이트) 코난(김대우) 2023.08.18 34061
Notice Python 무료 강좌 - 기초, 중급, 머신러닝(2023년 6월 업데이트) 코난(김대우) 2021.01.01 17177
2094 SQL Linux에서 기본 백업 디렉토리 변경 jevida(강성욱) 2017.09.13 3937
2093 Linux에서 DISK I/O 사용량 확인 jevida(강성욱) 2017.09.13 3918
2092 Linux에서 CPU 사용량 확인 jevida(강성욱) 2017.09.13 2302
2091 SQL Linux에서 SQL Server 시작, 중지, 활성, 비활성 jevida(강성욱) 2017.09.13 1537
2090 SQL Server DBA 체크리스트 jevida(강성욱) 2017.05.31 8254
2089 SQL Server 데이터베이스 백업이 성공적인지 확인하는 방법 jevida(강성욱) 2017.05.31 3808
2088 트리거가 적용된 메모리 최적화 테이블에서 alter table 실패 jevida(강성욱) 2017.05.31 3375
2087 메모리 최적화 테이블 변수 및 예상 행수 jevida(강성욱) 2017.05.31 3027
2086 백업 파일 복원과 3241 오류 (Microsoft® SQL Server® Backup to Microsoft Azure®Tool 사용) jevida(강성욱) 2017.05.31 3261
2085 In-Memory OLTP를 사용할 때 체크포인트 파일이 너무 많아 지는 이유 jevida(강성욱) 2017.05.31 2737
2084 메모리 최적화 테이블변수와 701 오류 (loop 사용으로 인한 메모리 부족 오류) jevida(강성욱) 2017.05.31 3453
2083 메모리 최적화 테이블에서 해시 인덱스 사용시 버킷 카운트의 중요성 jevida(강성욱) 2017.05.31 3103
2082 인덱스 리빌드시 병렬로 실행계획이 생성되지 않는 이유 jevida(강성욱) 2017.03.13 5067
2081 SQL Server 833오류 (15 Sec Slow IO Detected) jevida(강성욱) 2017.03.13 4517
2080 SQL Server nonpreemptive 모드에서Long Sync IO 오류 jevida(강성욱) 2017.03.13 3297
2079 SQL Server DTC Transaction의 SPID = -2 반환 jevida(강성욱) 2017.03.13 2460
» SQL Server Read/Writer 동기화 작동 원리 jevida(강성욱) 2017.03.13 2819
2077 SQL Server가 논리 및 물리 프로세서를 결정하는 방법 jevida(강성욱) 2017.03.13 2955
2076 데이터베이스에서 사용자 삭제 오류 jevida(강성욱) 2017.03.13 2928
2075 SQL Server ODBC Driver 및 Command package Tool 설치 jevida(강성욱) 2017.01.11 4857





XE Login