데이터베이스 개발자 Tip & 강좌

SQLER의 개발자들이 만들어가는 데이터베이스 사용자 Tip & 강좌 게시판입니다. SQL서버, Oracle, MySQL 등 여러 클라우드/오픈소스 기반 데이터베이스 개발 및 운영 관련 팁과 쿼리 노하우를 이곳에서 가장 먼저 접하실 수 있습니다. 많은 도움 되시길 바랍니다.

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
2090 SQL Server DBA 체크리스트 jevida(강성욱) 2017.05.31 6892
2089 SQL Server 데이터베이스 백업이 성공적인지 확인하는 방법 jevida(강성욱) 2017.05.31 3736
2088 트리거가 적용된 메모리 최적화 테이블에서 alter table 실패 jevida(강성욱) 2017.05.31 3251
2087 메모리 최적화 테이블 변수 및 예상 행수 jevida(강성욱) 2017.05.31 2944
2086 백업 파일 복원과 3241 오류 (Microsoft® SQL Server® Backup to Microsoft Azure®Tool 사용) jevida(강성욱) 2017.05.31 3104
2085 In-Memory OLTP를 사용할 때 체크포인트 파일이 너무 많아 지는 이유 jevida(강성욱) 2017.05.31 2675
2084 메모리 최적화 테이블변수와 701 오류 (loop 사용으로 인한 메모리 부족 오류) jevida(강성욱) 2017.05.31 3348
2083 메모리 최적화 테이블에서 해시 인덱스 사용시 버킷 카운트의 중요성 jevida(강성욱) 2017.05.31 2958
2082 인덱스 리빌드시 병렬로 실행계획이 생성되지 않는 이유 jevida(강성욱) 2017.03.13 4938
2081 SQL Server 833오류 (15 Sec Slow IO Detected) jevida(강성욱) 2017.03.13 4343
2080 SQL Server nonpreemptive 모드에서Long Sync IO 오류 jevida(강성욱) 2017.03.13 3110
2079 SQL Server DTC Transaction의 SPID = -2 반환 jevida(강성욱) 2017.03.13 2397
» SQL Server Read/Writer 동기화 작동 원리 jevida(강성욱) 2017.03.13 2752
2077 SQL Server가 논리 및 물리 프로세서를 결정하는 방법 jevida(강성욱) 2017.03.13 2865
2076 데이터베이스에서 사용자 삭제 오류 jevida(강성욱) 2017.03.13 2788
2075 SQL Server ODBC Driver 및 Command package Tool 설치 jevida(강성욱) 2017.01.11 4764
2074 SQL Server Install on Linux (Ubuntu – 16.0.4) jevida(강성욱) 2017.01.11 4997
2073 SQL Azure blob storage 백업을 위한 프록시 세팅 jevida(강성욱) 2017.01.11 4200
2072 SQL on Azure 환경에서 SQL 서버 연결 불능 문제(VNET 설정 문제) jevida(강성욱) 2017.01.11 3287
2071 SQL Server 2016 자동 통계 업데이트 임계값 변경 jevida(강성욱) 2017.01.11 4587





XE Login