스레드 사용

Greg Ewing
Clarity Consulting Inc.

요약: 기사에서는 스레딩의 다른 모델(단일, 아파트 자유) 모델의 사용에 대해 설명합니다. 스레드를 이용하는 응용 프로그램을 작성하는 도움을 있도록 스레드를 사용하는 C# 코드 샘플도 소개합니다. 또한 다중 스레딩 코드에 포함된 중요한 문제에 대해서도 설명합니다(9페이지/인쇄 페이지 기준).

목차

소개
스레딩에 대한 배경 지식
예제 응용 프로그램
다중 스레드 코드의 문제
결론

소개

다중 스레드 MSMQ(Microsoft Message Queuing) 트리거 응용 프로그램을 작성하는 일은 일반적으로 까다로운 작업이었습니다. 그러나 .NET Framework 스레딩 메시징 클래스의 도입으로 어느 때보다 쉬워졌습니다. 클래스를 사용하면 .NET Framework 대상으로 하는 모든 언어로 다중 스레드 응용 프로그램을 작성할 있습니다. 이전에 Microsoft Visual Basic 같은 도구는 스레딩에 대한 지원이 매우 제한되어 있었습니다. 따라서 C++ 사용하여 다중 스레드 코드를 작성하거나 Visual Basic에서 여러 프로세스나 ActiveX DLL 구성되는 이상적이지 않은 솔루션을 작성하거나 또는 다중 스레딩을 완전히 무시하는 밖에 없었습니다. .NET Framework에서는 어떤 언어를 사용하는지에 관계없이 풍부한 다중 스레드 응용 프로그램을 작성할 있습니다.

기사에서는 Microsoft 메시지 대기열의 메시지를 수신하고 처리하는 다중 스레드 응용 프로그램을 작성하는 프로세스를 단계적으로 소개하며, 특히 System.Threading System.Messaging이라는 가지 네임스페이스에 초점을 둡니다. 샘플 코드는 C#으로 작성되어 있지만 원하는 다른 언어로 쉽게 변환할 있습니다.

스레딩에 대한 배경 지식

Win32 환경에서 스레딩의 기본 모델은 단일, 아파트 자유 가지입니다.

단일 스레딩

처음에 작성한 응용 프로그램은 아마 응용 프로그램의 프로세스에 해당하는 스레드만 포함된 단일 스레드였을 것입니다. 프로세스는 해당 응용 프로그램의 메모리 공간을 차지하는 응용 프로그램의 인스턴스로 정의할 있습니다. 대부분의 Windows 응용 프로그램은 단일 스레드에서 모든 작업을 수행하는 단일 스레드 응용 프로그램입니다.

아파트 스레딩

아파트 스레딩은 단일 스레드보다 복잡한 스레딩 모델입니다. 아파트 스레딩으로 표시된 코드는 자체의 아파트로 제한된 고유 스레드에서 실행될 있습니다. 스레드는 처리 시간 동안 일어날 프로세스에서 소유하는 엔터티로 정의할 있습니다. 아파트 스레딩 모델에서 모든 스레드는 기본 응용 프로그램의 메모리에서 각각의 하위 섹션 내에서만 작동합니다. 모델에서는 코드의 여러 인스턴스를 동시에 그리고 독립적으로 실행할 있습니다. 예를 들어 .NET 이전의 Visual Basic에서는 아파트 스레드 구성 요소와 응용 프로그램을 만드는 것으로 제한되어 있었습니다.

자유 스레딩

자유 스레딩은 가장 복잡한 스레딩 모델입니다. 자유 스레딩 모델에서는 동시에 여러 스레드가 같은 메서드와 구성 요소로 호출됩니다. 아파트 스레딩과 달리 자유 스레딩은 분리된 메모리 공간에 제한되지 않습니다. 예를 들어 응용 프로그램에서 매우 비슷하지만 독립적인 수학 계산을 대량으로 실행해야 하는 경우에 자유 스레드 개체를 사용할 있습니다. 경우 같은 코드 인스턴스를 사용하여 계산을 실행하는 여러 스레드를 만듭니다. Visual Basic 6.0 같은 언어에서는 이와 같은 작업이 거의 불가능하므로 자유 스레드 응용 프로그램을 작성한 경험이 있는 응용 프로그램 개발자는 아마 C++ 개발자뿐일 것입니다.

스레딩 모델 작업

스레딩 모델에 대한 개념의 이해를 돕는 예로 집에서 다른 집으로 이사하는 일을 있습니다. 단일 스레드 방법은 포장에서 상자 운반과 풀기까지의 모든 일을 직접하는 것이라고 있습니다. 아파트 스레딩 모델로 작업하는 경우는 절친한 친구 몇에게 도움을 청하는 것과 같습니다. 친구는 각기 다른 방에서 일하고 다른 방에서 일하는 사람을 도울 없습니다. 그들은 각자의 공간과 이삿짐을 맡습니다. 자유 스레드 방법을 선택하는 경우, 친구들에게 도움을 요청하는 것은 아파트 스레딩 모델과 동일하지만 친구들이 모두 어느 시간이나 어느 방에서든 함께 이삿짐을 꾸릴 있다는 점이 다릅니다. 비유에서 집은 모든 스레드가 작동하는 프로세스이고 친구는 코드의 인스턴스이며 이삿짐은 응용 프로그램의 리소스와 변수입니다.

위의 예에서는 모델의 장점과 단점을 보여 줍니다. 아파트 스레딩은 구성 요소의 여러 인스턴스가 작동하므로 단일 스레딩보다 빠릅니다. 자유 스레딩에서는 모든 일이 동시에 일어나고 모든 리소스가 공유되므로 어떤 경우에는 아파트 스레딩보다 빠르고 훨씬 효율적입니다. 그러나 여러 스레드에서 공유 리소스를 변경하는 경우 문제가 일어날 있습니다. 사람이 상자를 사용해 부엌 물건을 다음 다른 친구가 와서 같은 상자에 침실 물건을 포장하는 경우를 생각해 보십시오. 번째 친구는 상자에 '부엌'이라는 레이블을 붙였는데 친구가 위에 '침실'이라는 레이블을 붙입니다. 결국 짐을 때는 부엌 물건을 침실에서 풀게 것입니다.

예제 응용 프로그램

단계로 예제 응용 프로그램의 디자인을 검토합니다. 응용 프로그램에서는 여러 스레드를 만들고 스레드는 MSMQ 대기열의 메시지를 수신합니다. 예제에서는 기본 Form 클래스와 사용자 지정 MQListen 클래스의 가지 클래스를 사용합니다. Form 클래스는 사용자 인터페이스를 처리하는 것과 아울러 작업자 스레드를 만들고 관리하고 소멸시킵니다. MQListen 클래스에는 메시지 대기열 항목을 비롯해 작업자 스레드를 실행하는 필요한 모든 코드가 포함됩니다.

다중 스레드 코드의 문제

샘플 코드 작업을 완료했으므로, 이제 다중 스레드 응용 프로그램을 작성하는 필요한 도구를 가지게 되었습니다. 스레딩은 응용 프로그램의 성능과 확장성을 극적으로 개선할 있습니다. 이런 강력함과 더불어 스레딩의 위험에 대해서도 알고 있어야 합니다. 어떤 경우에는 스레드 사용으로 응용 프로그램에 해를 끼칠 있습니다. 스레드로 인해 작업이 다운되거나 예상치 못한 결과가 일어날 있으며 심지어 응용 프로그램이 응답을 중지할 수도 있습니다.

스레드가 여러 개인 경우 스레드 서로가 특정 지점에 도달하거나 종료할 때까지 대기하고 있지 않은지 확인합니다. 제대로 수행하지 않으면 스레드가 서로 대기하고 있으므로 아무 스레드도 종료되지 않는 교착 상태를 초래할 있습니다.

여러 스레드에서 쉽게 공유될 없는 리소스(: 플로피 디스크 드라이브, 직렬 포트 또는 적외선 포트) 액세스해야 하는 경우 스레드 사용을 방지하거나 synclock 또는 mutex 같은 고급 스레딩 도구를 사용하여 동시성을 관리할 있습니다. 스레드가 리소스 하나를 동시에 액세스하려 하면 스레드에서는 리소스를 얻을 없고 데이터 손상이 일어납니다.

스레딩의 다른 일반적인 문제는 경쟁 조건입니다. 스레드가 파일에 데이터를 쓰는 동안 다른 스레드에서 해당 파일을 읽고 있는 경우 어떤 스레드가 먼저 종료할지 없습니다. 문제는 스레드가 파일경쟁 조건이라고 합니다. 읽는 스레드가 쓰는 스레드보다 앞서는 경우 없는 결과가 반환됩니다.

스레드를 사용할 모든 스레드가 다른 스레드와 별도로 완전히 작업을 마칠 있을지 여부도 생각해 보아야 합니다. 데이터를 앞뒤로 전달해야 하는 경우 데이터가 비교적 간단해야 합니다. 복잡한 개체를 전달하는 경우 개체를 앞뒤로 이동하기 위해 막대한 마샬링 비용이 들어가기 시작합니다. 이에 따라 운영 체제에서 관리하는 오버헤드가 생기고 전체 성능이 떨어집니다.

다른 문제로는 코드를 다른 개발자에게 넘겨주는 따른 전환 비용이 있습니다. .NET으로 스레딩이 훨씬 쉬워졌지만 코드를 유지 관리하는 다음 개발자가 스레딩 작업을 하기 위해서는 스레딩에 대해 알고 있어야 합니다. 그러나 점은 스레드 사용을 피해야 이유라기 보다는 적절한 코드 주석을 제공해야 이유입니다.

이런 문제들로 인해 스레딩 자체를 사용하지 않는 보다는 응용 프로그램을 디자인하고 스레드를 사용할지 여부를 결정할 모든 문제들을 기억하고 있는 것이 좋습니다. 불행히도 백서에서는 이런 문제를 방지하기 위한 방법을 설명하지 않습니다. 스레드를 사용하기로 했으나 위에서 언급한 문제가 발생한 경우 synclock이나 mutex 검토하여 문제를 해결하거나 다른 솔루션을 찾아 보십시오.

결론

여기에 있는 내용으로 스레딩을 이용하는 응용그러나 이렇게 하는 동안 관련된 문제를 기억하십시오. 스레딩은 제대로 사용하면 응용 프로그램의 성능과 확장성을 단일 스레드 응용 프로그램에 비해 훨씬 개선할 있지만, 올바로 사용하지 못하는 경우 정반대의 결과를 가져올 있으며 응용 프로그램이 불안정하게 있습니다.

출처: http://blog.naver.com/ansysda?Redirect=Log&logNo=19257436

+ Recent posts