프로세스, 스레드 및 아파트

프로세스는 가상 메모리 공간, 코드, 데이터 및 시스템 리소스의 컬렉션입니다. 스레드는 프로세스 내에서 직렬로 실행될 코드입니다. 프로세서는 프로세스가 아닌 스레드를 실행하므로 각 애플리케이션에는 하나 이상의 프로세스가 있으며 프로세스에는 항상 주 스레드라고 하는 하나 이상의 실행 스레드가 있습니다. 프로세스에는 주 스레드 외에도 여러 스레드가 있을 수 있습니다.

프로세스는 Microsoft의 RPC(원격 프로시저 호출) 기술을 사용하여 서로 정보를 전달하여 메시지를 통해 서로 통신합니다. 호출자는 원격 컴퓨터의 프로세스에서 오는 호출과 동일한 컴퓨터의 다른 프로세스에서 오는 호출 간에 차이가 없습니다.

스레드가 실행되기 시작하면 스레드가 종료되거나 우선 순위가 높은 스레드(사용자 작업 또는 커널의 스레드 스케줄러에 의해)에 의해 중단될 때까지 계속됩니다. 각 스레드는 별도의 코드 섹션을 실행하거나 여러 스레드가 동일한 코드 섹션을 실행할 수 있습니다. 동일한 코드 블록을 실행하는 스레드는 별도의 스택을 유지 관리합니다. 프로세스의 각 스레드는 해당 프로세스의 전역 변수 및 리소스를 공유합니다.

스레드 스케줄러는 프로세스의 우선 순위 클래스 특성과 스레드의 기본 우선 순위의 조합에 따라 스레드를 실행할 시기와 빈도를 결정합니다. SetPriorityClass 함수 를 호출하여 프로세스의 우선 순위 클래스 특성을 설정하고 SetThreadPriority를 호출하여 스레드의 기본 우선 순위를 설정합니다.

다중 스레드 애플리케이션은 교착 상태경합이라는 두 가지 스레딩 문제를 피해야 합니다. 교착 상태는 각 스레드가 다른 스레드가 작업을 수행할 때까지 대기할 때 발생합니다. COM 호출 컨트롤은 개체 간의 호출에서 교착 상태를 방지하는 데 도움이 됩니다. 경합 상태는 한 스레드가 종속된 다른 스레드 앞에 완료될 때 발생하며, 후자는 아직 유효한 스레드를 제공하지 않았기 때문에 전자가 초기화되지 않은 값을 사용합니다. COM은 Out-of-process 서버의 경합 상태를 방지하기 위해 특별히 설계된 몇 가지 기능을 제공합니다. ( Out-of-Process 서버 구현 도우미를 참조하세요.)

아파트 및 COM 스레딩 아키텍처

COM은 여러 스레드 실행이 도입되기 전에 널리 사용되는 단일 스레드당 단일 스레드 모델을 지원하지만, 여러 스레드를 활용하는 코드를 작성하면 다른 스레드가 시간이 많이 걸리는 작업이 완료되기를 기다리는 동안 한 스레드를 실행하도록 허용하여 보다 효율적인 애플리케이션을 만들 수 있습니다.

참고

여러 스레드를 사용하는 것이 성능 향상을 보장하는 것은 아닙니다. 실제로 스레드 팩터링이 어려운 문제이므로 여러 스레드를 사용하면 성능 문제가 발생하는 경우가 많습니다. 핵심은 사용자가 수행하는 작업을 잘 모르는 경우에만 여러 스레드를 사용하는 것입니다.

 

일반적으로 COM 스레딩 아키텍처를 보는 가장 간단한 방법은 프로세스의 모든 COM 개체를 아파트라는 그룹으로 나눈 것으로 생각하는 것입니다. COM 개체는 해당 아파트에 속한 스레드에서만 합법적으로 직접 호출할 수 있다는 점에서 정확히 하나의 아파트에 살고 있습니다. 개체를 호출하려는 다른 스레드는 프록시를 통과해야 합니다.

아파트의 두 가지 유형이 있습니다: 단일 스레드 아파트, 다중 스레드 아파트.

  • 단일 스레드 아파트는 정확히 하나의 스레드로 구성되므로 단일 스레드 아파트에 사는 모든 COM 개체는 해당 아파트에 속한 하나의 스레드에서만 메서드 호출을 받을 수 있습니다. 단일 스레드 아파트의 COM 개체에 대한 모든 메서드 호출은 단일 스레드 아파트의 스레드에 대한 windows 메시지 큐와 동기화됩니다. 단일 실행 스레드가 있는 프로세스는 이 모델의 특별한 경우일 뿐입니다.
  • 다중 스레드 아파트는 하나 이상의 스레드로 구성되므로 다중 스레드 아파트에 거주하는 모든 COM 개체는 다중 스레드 아파트에 속한 스레드에서 직접 메서드 호출을 받을 수 있습니다. 다중 스레드 아파트의 스레드는 프리 스레딩이라는 모델을 사용합니다. 다중 스레드 아파트의 COM 개체에 대한 호출은 개체 자체에 의해 동기화됩니다.

참고

동일한 프로세스 내에서 단일 스레드 아파트와 다중 스레드 아파트 간의 통신에 대한 설명은 단일 스레드 및 다중 스레드 통신을 참조하세요.

 

프로세스에는 0개 이상의 단일 스레드 아파트와 0개 또는 1개의 다중 스레드 아파트가 있을 수 있습니다.

이 과정에서 기본 아파트가 가장 먼저 초기화됩니다. 단일 스레드 프로세스에서, 이것은 유일한 아파트입니다. 호출 매개 변수는 아파트 간에 마샬링되고 COM은 메시징을 통해 동기화를 처리합니다. 프로세스에서 여러 스레드를 자유 스레드로 지정하는 경우 모든 무료 스레드는 단일 아파트에 상주하며 매개 변수는 아파트의 모든 스레드에 직접 전달되며 모든 동기화를 처리해야 합니다. 무료 스레딩과 아파트 스레딩을 모두 사용하는 과정에서 모든 무료 스레드는 단일 아파트에 상주하며 다른 모든 아파트는 단일 스레드 아파트입니다. COM 작업을 수행하는 프로세스는 대부분의 다중 스레드 아파트 하나와 단일 스레드 아파트의 수와 아파트의 컬렉션입니다.

COM의 스레딩 모델은 서로 다른 스레딩 아키텍처를 사용하여 함께 작동하는 클라이언트 및 서버에 대한 메커니즘을 제공합니다. 서로 다른 프로세스에서 서로 다른 스레딩 모델을 가진 개체 간의 호출은 자연스럽게 지원됩니다. 호출하는 개체의 관점에서 프로세스 외부의 개체에 대한 모든 호출은 호출되는 개체가 스레드되는 방식에 관계없이 동일하게 작동합니다. 마찬가지로 호출되는 개체의 관점에서 호출자의 스레딩 모델에 관계없이 도착 호출이 동일하게 동작합니다.

클라이언트와 개체가 서로 다른 프로세스에 있기 때문에 서로 다른 스레딩 모델을 사용하는 경우에도 클라이언트와 out-of-process 개체 간의 상호 작용은 간단합니다. 클라이언트와 서버 간에 상호 연결된 COM은 표준 마샬링 및 RPC를 사용하여 스레딩 모델이 상호 운용할 수 있는 코드를 제공할 수 있습니다. 예를 들어 여러 개의 자유 스레드 클라이언트에서 단일 스레드 개체를 동시에 호출하는 경우 해당 창 메시지를 서버의 메시지 큐에 배치하여 COM에서 호출을 동기화합니다. 개체의 아파트는 메시지를 검색하고 디스패치할 때마다 한 번의 호출을 받습니다. 그러나 프로세스 내 서버가 클라이언트와 제대로 상호 작용하도록 하려면 주의해야 합니다. ( In-Process 서버 스레딩 문제를 참조하세요.)

다중 스레드 모델을 사용한 프로그래밍에서 가장 중요한 문제는 특정 스레드에 대한 메시지가 해당 스레드로만 이동하고 스레드에 대한 액세스가 보호되도록 코드 스레드를 안전하게 만드는 것입니다.

자세한 내용은 아래 항목을 참조하세요.