본문 바로가기
게임개발/게임서버

동기화

by do_ng 2024. 4. 18.

동기화란?

1. 프로세스나 스레드의 실행 순서를 제어

ex) Reader 작업을 하는 스레드와 Writer 작업을 하는 스레드가 있을 때 Writer 작업이 먼저 끝나야지 Reader 작업을 해야한다고 했을 때 동시에 실행 될 수 있는 스레드를 작업 순서대로 진행하게 함

 

2. 동시에 접근해서는 안 되는 자원에 하나의 프로세스 또는 스레드만 접근하게 하기

동시에 접근해서는 안되는 자원 즉, 공유자원(전역변수, 파일, DB ..등)의 동시 접근을 막는 것이다. 

동시에 실행하면 문제가 발생하는 자원에 접근하는 코드 영역을 "임계 구역"이라고 한다.

두 개 이상의 스레드가 임계 구역에 진입하고자 하면 둘 중 하나는 대기해야 됨

여러개의 스레드가 동시에 "임계 구역"의 코드를 실행해서 문제가 발생하는 경우 이를 "레이스 컨디션" 이라고 한다.

고급 언어가 실행 과정에서 저급 언어(어셈블리 언어)로 변환되어 실행되는데 홍길동 계좌에 김철수씨의 돈 1억을 이체한다는 것을 고급언어에서 코드 한 줄로 작성할 수 있지만 컴퓨터 내부에서는 여러 줄의 저급언어로 변환되어 실행된다.

홍길동 계좌 += 김철수씨 이체 금액 1억

 

아래와 같이 저급언어로 실행되는 과정에서 중간에 갑자기 문맥 교환이 일어나서 해당 작업을 하고 있는 쓰레드가 중지되고 다시 재개했을 때 문제가 발생할 수 있다.

int temp = 김철수씨 이체 금액 1억
temp = 홍길동 계좌 + 김철수씨 이체 금액 1억
홍길동 계좌 = temp;

 

 

대표적인 동기화 기법 3가지 

1. 뮤텍스 락

lock() -> lock을 이용해 임계구역에 다른 스레드나 프로세스가 들어오지 못하도록 막음 

acquire() -> 임계구역에 들어갈 수 있는지 체크하는 역할(임계구역에 들어갈 수 있다면 들어가서 lock을 수행)

release() -> 작업이 끝나고 임계구역에서 탈출하고 나서 lock을 해제

 

2. 세마포

뮤텍스와 다른 점은 공유자원을 누군가 점유하고 있는 상황에서 공유자원에 접근이 가능한지 

계속 체크하는 작업(CPU의 주기를 낭비)을 하는게 아니라 대기 큐를 만들어서 효율적으로 기다리게 한다. 

ThreadA의 점유가 종료 될 때 임계구역에서 대기하고 있는 스레드에게 점유해도 좋다는 신호를 주면 

대기 큐에 있는 스레드는 준비 큐로 이동하고 공유자원을 점유하게 된다. 

 

3. 모니터 

세마포에서 업그레이된 동기화 버전

'게임개발 > 게임서버' 카테고리의 다른 글

멀티 스레드 환경에서 소켓 프로그래밍  (0) 2024.05.18
네트워크 기초  (0) 2024.04.22
멀티스레드 InterLocked  (1) 2024.04.18
메모리 배리어  (0) 2024.04.18
멀티 쓰레드 프로그래밍  (0) 2024.04.17