spinLock, context switching, AutoResetEvent
- 스핀 락 구현
- 계속 뺑뺑이를 돌면서 내가 이 락을 획득 할 때까지 계속 무한정 트라이를 하는 방법
- 넥슨이나 NC 봤을 때도 나왔던 자주 나오는 질문임
- 계속 뺑뺑이를 돌면서 컴패어 연산을 해서 구현하는 락이다.
context switching
- 바로 영혼이 넘어가는 것이 아닌 관리자 단계로 한번 거쳤다가 간다.
- 빙의를 하겠다고 가정을 하면 메모리에 있던 정보들중에서 프로그램과 관련된 정보를 다 뽑아와야한다.
- 또한 레지스터에도 온갖 정보가 다 들고 있는데 빙의를 할때마다 있는 정보를 싸그리 날리고, 이 정보는 다시 메모리에다가 저장해서 나중에 다시 빙의가 되면 꺼내 쓸 수 있도록 만들어줘야 한다. 어디까지 코드가 실행되고 있었는지, 어떤 상태였는지도 복원해야한다. 이런 저장하고 복원하는 단계가 핵심적인 부담이 된다.
- 추가로 식당에 대한 정보, 예를 들면 주방의 위치 계산대의 위치 테이블의 위치등 다 복원을 시켜줘야 하는데 가상메모리라는 개념과 관련이 있다.
- 빙의한 직원과 전 직원이 같은 식당에서 일하고 있었다면 가상메모리를 안 바꿔줘도 되지만, 그게 아니라면 가상 테이블도 바꿔치기 해야한다.
- 이런 식으로 커널모드로 옮ㅁ긴 다음에 정보를 복원시키는 과정, 결론? 쓰레드 슬립을 하건 일드를 하건 자기의 소유권을 포기하고 남한테 준다는 과정역시 부담이 크다..
- 자물쇠가 열리면 알려달라고 직원에게 부탁을 하는 방법
- 사실 이 직원은 식당 직원이 아닌 커널레벨 즉 아래 레벨에 있는 관리자쪽에 있는 직원임
- 따라서 커널 레벨로 왔다갔다 하는 것 즉 컨텍스트 스위칭이 개입이 되니까 어마어마하게 느리다.
- c#에서 이벤트를 사용할때는 두가지 방법이 있다.
- 오토 리셋 이벤트, 일종의 톨게이트, 차 한 대가 지나가면 자동으로 톨게이트가 닫혀서 다음 차는 또 다시 대기를 해야하는 상황
- 메뉴얼 리셋 이벤트, 방문 같은 개념, 문이 수동으로 잠기기 때문에 문을 열고 나간 다음에 문을 안 닫으면 신나게 몇 대의 차가 통과할 수 있는 개념
- 오토가 붙어있듯이 문을 자동으로 닫아준다.
- 이 두가지 방법 모두다 커널 단으로 가서 요청을 한다는 사실을 명심하자.
- 스핀락 같은 경우에는 계속 뻉뻉이를 돌면서 유저모드에서 실행되는 반면, 얘네들은 운영체제한테 요청하기 때문에 큰 부담이 된다.
- 뮤텍스 방법도 추가적으로 참고해두자. 오토 리셋과는 다르게 쓰레드 아이디등 여러가지 역할을 더 하다보니 비용이 더 많이 든다.