C# 서버

Lock

영춘권의달인 2024. 4. 29. 14:08

Critical Section (임계 영역)

Critical Section이란 두개 이상의 쓰레드가 동시에 공유 자원을 접근할 수 있는 코드의 부분을 말한다. 멀티쓰레드 프로그래밍에서는이 Critical Section에 한번에 하나의 쓰레드만 접근이 가능하도록 설계를 해야 한다.

그래서 Lock 등의 방법을 사용하여 Critical Section에는 한번에 하나의 쓰레드만 접근하도록 할 수 있고, 이렇게 한번에 하나의 쓰레드만 접근하도록 하여 공유 자원의 동시 사용을 막는 것을 Mutual Exclusion(상호 배제)라고 한다.

 

DeadLock (데드락, 교착상태)

경우에 따라서 Lock 안에서 또 Lock을 잡아야 하는 경우가 있을 수 있다.

1번 쓰레드에서 1번 Lock을 잡고 그 안에서 2번 Lock을 잡는 것과 동시에

2번 쓰레드에서 2번 Lock을 잡고 그 안에서 1번 Lock을 잡는 상황이 있다고 가정했을때,

만약 1번 쓰레드에서 1번 Lock을 잡는 순간에 2번 쓰레드에서 2번 Lock을 잡았다면 1번 쓰레드에서는 2번 Lock이 풀려야 다음 로직을 수행할 수 있고, 2번 쓰레드에서는 1번 Lock이 풀려야 다음 로직을 수행할 수 있는데 서로 Lock을 물고 풀어주지 않으니 아무것도 할 수 없는 상황이 발생한다.

 

이렇게 서로가 서로의 Lock을 물고있는 상황을 DeadLock이라고 한다.

위와 같이 멍청하게 코드를 짜는 일이 있겠냐고 생각할 수 있지만 저건 그저 예시일 뿐이고 코드가 방대해지다보면 예상하지 못한 곳에서 위와 같은 상황이 발생할 수 있고, 생각보다 자주 일어난다고 한다.

 

그렇다면 이것을 어떻게 예방할 수 있을까?

일정시간이 지나면 잡고있는 Lock을 놔주는 방법, Lock의 순서를 정하는 방법 등 여러가지 방법이 있지만 DeadLock이 발생한다는 것 자체가 Lock 구조에 문제가 있다는 뜻이고, 이런 경우를 대비하여 추가적인 코드를 작성하기보단, DeadLock이 발생했다면 그때 원인을 분석하여 수정하는 것이 일반적이다.

'C# 서버' 카테고리의 다른 글

게임 입장  (0) 2024.05.04
서버 - Unity클라 통신 테스트  (0) 2024.05.03
Race Condition(경합 조건), Atomic(원자성)  (0) 2024.04.29
캐시  (1) 2024.04.28
멀티쓰레드 프로그래밍  (0) 2024.04.28