개인공부) 서버 실습(8) - Lock 기초

Justin·2022년 5월 30일
0

서버공부

목록 보기
7/45

✅ 지난 시간 회고 및 새로운 개념

지난 시간에 원자성에 대한 개념을 배웠고, 원자성이 보장되지 않았을 때 생기는 문제 예시를 시작으로 Interlocked을 통해 해결하는 방법을 배웠다.

예시로 배웠던 문제점과 같이 동시 다발적으로 사용(Write)하게 되면 발생하는 이슈를 피하기위해, 문제가 발생하지 않도록 독점 보장을 해줘야 한다.

독점이 보장되어 한 번에 하나의 프로세스만 동작하는 영역을 임계영역(Critical Section)이라고 표현한다.

⬜ Interlocked의 아쉬운점

Interlocked.Increment(ref num);

Interlocked의을 위와 같이 사용했을 때는 정수형 밖에 사용하지 못한다거나, 코드가 여러줄일 경우에는 굉장히 비효율적이다 라는 단점들이 발생한다.

💻 Monitor.Enter, Montior.Exit 등장

object key = new object();
	Monitor.Enter(key);
	//작성하고자 하는 내용
	Monitor.Exit(key);

Enter를 통해 잠구어 Critical Section이 보장된 환경을 만들어주고, 사용후에 Exit을 통해 잠금을 해제 하는 것과 같이 다시 되돌려 주며 사용한다.

lock을 사용해주면 원하는 결과를 얻을 수 있다. 위와 같이 Enter를 통해 나만 접근해 사용하고, 반납하는 걸 상호배제(Mutual Exclusive)라고 표현하기도 한다.

💻💣 Monitor.Enter, Montior.Exit 문제점

다만 이렇게 사용하다보면 코드 작성 시 실수로 Exit을 해주지 않고 return을 해버리는 상황이 발생할 수 있다.

그러면 lock 속에 갇혀버리게 되는데 이런 상황을 Dead Lock이라고 표현한다. 이렇게 데드락이 생기는 과정을 막기 위해서는 try catch 구문에 try finally를 사용하기도 한다.

finally에 Exit를 넣어 어떤 상황에서도 문은 제대로 잠구고 나올 수 있게 해주며 Dead Lock이 발생 확률을 감소 시키는 경우도 있다.

🔒 결국은 lock이 가장 편하다

사실 Monitor 방식은 거의 사용하지 않고,잘 구현되어있는 lock 방식을 쓰면 가장 편리하게 사용할 수 있다.

사용 방법도 lock(object){}해주면 되고, 사용 후에는 문을 잠궈주지 않아도, 오류가 나서 종료가 되더라도 알아서 뒷처리를 해주는 편리한 녀석이다.


📝 오늘정리

다른 Velog의 글을 보며 이모지를 통해 더 직관적으로 글 작성하는 법을 배우고 있다. 나도 깔끔하게 정리하고자 노력해봐야지 :)

lock 키워드 역시 내부적으로는 Monitor 작동과 유사하게 되어있다 한다. 이 강의는 아래 부터 천천히 올라오면서 문제를 만들고 해결하고, 결국엔 쉬운 사용법을 알려준다.

단순히 이거 쓰면 됩니다. 가 아닌, 이건 이런 구조에서 어떤 문제를 잘 해결하고, 뭐가 편리하게 사용되니까 이게 좋다 까지 빌드업이 잘 되는 강의라 참 좋은 것 같다.

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

0개의 댓글