C#2009.02.24 22:20
개발을 하면서, 효과적이면서도 치명적 오류를 범할수 있는 프로그래밍 방법이 스레드 이다.
동기화 라는 욕심을 부리지 않고, 무기나 의료 장비 관련 프로그래밍이 아닐때에는 스레드를 남발(?) CPU 자원을 최대로 끌어올려 빠른 처리를 할 수가 있다. 물론 잘못 사용해서 커다란 오류가 생겨나면 문제가 되겠지만...

보통 스레드 라는 개념을 처음 접하는 개발자의 경우 책을 보면 대체적으로 이렇게 겁나게 설명되어 있어 약간 접하기 무서워 하는 경우를 많이 본다.

주로 책에서는 특정 순서로 수행되어야 할 때마다 스레드 동기를 시킨다고 하는데, 내 생각에는 꼭 그렇지만은 않다는 것이다. 나같은 경우는 주로 스레드를 쓸때 비동기 작업에 관련된 결과 레포팅이 필요없는 경우에 많이 쓴다.

특히 네트웍쪽으로 쓰면, 아주 훌륭하다. Request/Response 사이에 시간차가 생기는데, 이 시간차 동안 CPU가 노는게 싫어서 스레드를 많이 쓴다. 하지만, 다른경우, 하나의 Job 이 높은 cost를 요구하는데, 이런 작업들에 멀티 쓰레드를 걸면 CPU가 아주 죽어난다. 물론 어쩔수 없는 경우에는 priority를 lowest 로 설정하여 사용하는데, 높은 cost의 job 을 꼭 스레드를 이용할 필요는 없는것 같다. 사람처럼 중요한것은 한번에 하나씩 처리하는게 젤 좋다는 생각이다.

왜 이런경우에 쓸 필요가 없는지는 컴퓨터구조학에 파이프라이닝을 배울때 상세하게 배울수 있다. 꼭 컴퓨터공학 전공자가 아니더라도, 멀티스레드를 가능하게 하는 CPU 의 pipelining 을 살짝~ 보면 도움이 된다.

 

* 앞서 cost가 높다는것은 위 그림처럼 하나의 job이 길때를 얘기한다.

그렇다면, 스레드 동기화는 왜 하는것일까?
두 개의 스레드에서 동시에 같은 리소스를 공유(read/write) 하는 경우에 동기화가 꼭 필요하다.
대표적인 예로 로그파일 남길때, 여러 프로세스에서 하나의 로그파일을 공유할때 access deny 가 발생하면 중요한 로그를 못 남길수 있기때문에 이때는 여러가지 동기화 기법 중 하나를 택하여 접근하기 전에 다른 스레드의 작업이 끝나면 접근하도록 lock을 걸수 있다.

동기화 기술중 가장 단순한 방식이 스레드 풀링 방식인데, 이 방법은 각각의 스레드를 관리하기 위해서 스케쥴 자료구조를 가지고 있는 manager가 필요하다(물론 개념적인 설명이고, 실제롤 loop 문 하나와 변수 두개 정도가 필요하다)


스레드 풀링을 할때 닷넷의 경우 IsAlive 속성을 사용 할 수 있다. 그림을 잘 보면, 풀링 방법이 그리 좋지 못하다는 이유가 보일것 인데, 그건 FIFO(First In First Out) 자료구조를 가지고 있어서 일것이다.

이렇게 공유자원에 대해서 하나의 스레드만 허락하는 것이 스레드 동기화 이다.

그러면 뮤텍스(Mutex; Mutual Exclusion)란 뭐길래? 제목에 뮤텍스라고 했을까? 그냥 동기화 기법 중 하나이다. ㅡㅡ;

즉, 말 그대로 상호배제 라는건데 프로그래밍에서 동시에 공유 불가능한 자원의 사용을 막기 위해 설계된 알고리즘으로 주로 게임개발자가 자주 쓰는 크리티컬섹션(임계영역; Critical Section)으로 불리는 코드 영역에 의해 구현된다.

이 말은 여러 자원을 같이 쓰는게 아니라... 한 프로세스가 독점해 버리는것이다. 독점하면 다른 프로세스는 자연스레 사용할수 없게 되는것이다. 이 말은 다른 스레드가 공유자원이 사용가능한지 주기적으로 체크할 필요가 없는것이다. 사용이 끝난 스레드가 "나 사용 다 했어요~ 다음 사용할 스레드님아~ 누구삼?" 이라고 하는것이랑 똑같다. 어떻게 보면 인심 고약한 식당 화장실 열쇠와도 같은 개념이다.

단, 뮤텍스가 중단되면 코드에 심각한 오류가 있는것이다. 왜냐하면 뮤텍스를 해제 하지 않고 스레드를 종료해 버리면 뮤텍스가 보호하는 데이터 구조의 상태에 일관성이 없을 수 있다. 즉, 좀전에 식당에서 화장실 열쇠를 가지고 제자리에 놓지 않고 집에 가져가 버리면 다음 사용자는 봉변(?) 을 당할수 있다는 말이다.

간략한 사용법 C#
저작자 표시 비영리 동일 조건 변경 허락
신고
Posted by dotnetpower

티스토리 툴바