개인공부) 서버실습(13) - Event(Auto, Manual, Mutex)

Justin·2022년 6월 5일
0

서버공부

목록 보기
12/45

✅ 지난 시간

Context Switching이 발생하며 내부적으로는 발생하는 비용들에 대해 자세하게 알 수 있었다. 오늘도 역시 Auto Reset Event 시에 발생하는 구조에 대해 설명을 들을 수 있을 것 같다.

❓ 왜 Auto Reset Event를 사용할까?

Lock의 세가지 구조 중 가장 마지막으로 소개해줬었던 일명 '갑질 메타'의 케이스이다.

간략하게 설명하면 lock이 동작하고 있다면, 관리자에게 획득 가능할 때 알려달라고 요청하는 것이다.

관리자에게 부탁을 한다는 것 자체가 부담이 될 수 있지만, 쓰레드는 아무것도 안하고 마음편히 쉬게하고자할 때 사용할 수 있다.

상황 자체를 이해하고 보니 웃긴 상황이다. 자기 편하게 쉴라고 자신보다 더 힘든 작업을 하는 관리자를 시켜먹다니..

➕ 빠른 작업이 필요할 때는 지양하자
관리자 쪽에 요청을 하게 될 경우에는 지난 시간에 배운 Context Switching이 발생하게 되는데, 이럴 경우는 확실히 비용 소모가 크기 때문에 굉장히 느릴 수 있다.

📋 어떻게 사용할까?

0️⃣ Auto Reset Event

문을 자동을 잠구는 구조

이 기능 역시 이미 C#에서 제공해주기에 해주 쉽게 인스턴스해서 사용할 수 있습니다.

AutoResetEvent auto = new AutoResetEvent(true);

여기서 AutoResetEvent(false); bool 매개변수를 정해주어야 하는데, true일 경우 문이 오픈된 상태로 시작(즉, 아무나 들어올 수 있는 상태) false라면 문이 닫힌 상태로 시작 한다고 이해하면 된다.

auto.WaitOne()을 사용해주면 입장을 대기하는 것과 같다. 문이 열려있다면 lock을 획득하고, 아니라면 획득하지 못하고 대기를 하게 된다.

AutoReset의 특징으로는 lock을 획득하고 들어간후 문을 자동으로 잠구어 다른 쓰레드가 접근하지 못하는 임계영역이 보장된 공간을 만들어준다.(AutoReset = false 상태)

AutoReset의 false로 설정되어 입장이 제한되어있다면 auto.Set()을 해줄 경우 AutoReset의 true 값으로 변경해주어 lock을 획득 가능하도록 변경해준다.

아무래도 관리자(커널) 영역에서 일을 해야하기에 기존 SpinLock과 같은 구조에 비해 속도가 느리다.

1️⃣ Manual Reset Event

Auto Reset과의 차이점
ManualResetEvent는 AutoReset과 큰 차이는 없고, 단순하게 Auto는 하나의 쓰레드가 접근하고 바로 문을 닫아버리는 거고, Manual을 닫기 전 까지 다른 쓰레드들이 계속 접근할 수 있다는 것이다.


사용법 역시 큰 차이는 없지만 lock 획득 후에는 닫아주어야 하기에 Reset()을 해주어야 한다. 다만, 접근하고 닫는 과정이 나누어져 있다면

쓰레드가 한 번만 들어가는 것이 아닌 아주 빠른 속도로 여러번 들어 갈 수도 있어 우측 결과창가 같이 예상과는 다른 결과(0이 나와야함)가 나올 수 있다.

고로 예제 처러 하나만 넣고 사용하고자 하는 상황이라면 AutoReset을 사용하는게 맞고, 여러개가 한 번에 처리 되어도 상관이 없을 경우에는 Manual을 쓰는 등 상황에 맞게 처리를 해주어야 한다.

2️⃣ Mutex

Mutex는 뭐고, 왜 사용하지?
커널 영역에서 작업을 할 수 있는 추가적인 방법으로 Auto, Manual 보다는 더 많은 정보를 담고 있어 사용 시에 무겁지만 다양한 활용이 가능하다.

사용법은 동일하다고 생각해도 된다. 역시 인스턴스 후에 WaitOne() 을 통해 입장/입장 대기를 하고 lock을 잠구고, ReleaseMutex() 를 통해 풀어주는 개념이다.

하지만 동작을 해보면 위에 Auto나 Manual 보다 조금 더 느리게 작동하는데, 그 이유가 앞서 말한 다양한 기능들을 제공한다.

  • 쓰레드 ID 체크
    : 정확하게 원하는 쓰레드의 접근, Release 관리에 용이

  • 몇개의 lOCK을 잡았는지 체크
    : 예상치 못하는 변수를 막을 수 있음

예시로 위 두가지 이지만 더 많은 기능을 가지고 있는 듯 하다.

profile
인디 게임을 만들며 공부하고 있습니다.

0개의 댓글