다음을 통해 공유


직렬화

이 항목에서는 스레드 일련화에 대해 이해하고 코드에서 병렬로 실행되지 않는 부분을 식별합니다. 스레드 일련화는 서로 다른 스레드에서 발생하는 작업을 특정 순서로 실행해야 할 때 발생합니다. 특정 스레드에서 작업을 완료하기 위해 다른 스레드의 작업이 필요할 때 이러한 현상이 자주 발생합니다.

성능 측면에서 스레드 일련화는 스레드 잠금의 한 형태입니다. 이 패턴은 일반적으로 단일 스레드 알고리즘이 다중 스레드 알고리즘으로 변환될 때 발생하지만 다중 스레드 알고리즘의 각 부분이 이전 부분에서 끝나기를 기다렸다가 시작할 때 발생합니다. 작업 시스템의 작업 간 의존도가 높을 경우에도 이와 유사한 효과가 발생합니다. 이로 인해 다음과 같은 문제가 발생할 수 있습니다.

  • 작업이 병렬로 실행되고 있지 않고 한 번에 하나의 스레드에서만 수행되는 경우 알고리즘은 여전히 단일 스레드로 실행되며 더 빨리 실행되지 않습니다.

  • 스레드 간 전환으로 인한 오버헤드가 추가되었습니다.

스레드 간 또는 CPU 코어 간에 계단 스텝 효과가 발생하는 위치를 중심으로 문제를 해결하려면 스레드 잠금에 나타난내용과 동일한 단계를 사용하세요.

PIX

그림 1은 PIX 타임라인에서 계단 스텝 효과를 보여줍니다.

그림 1. PIX 타이밍 캡처에서 스레드 타임라인의 계단 스텝 패턴

PIX 타이밍 캡처에서 스레드 타임라인의 계단 스텝 패턴 스크린샷

타이틀에 작업을 기다리는 스핀 코드가 있거나 작업에 필요한 코드 부분에 대한 잠금을 획득하려고 할 경우 스핀 주위에 PIX 이벤트를 추가하고 일부를 획득하는 것이 유용할 수 있습니다. 이러한 이벤트를 추가하면 스레드 동작을 빠르게 식별할 수 있으며 이러한 이벤트를 PIX에서 검색하는 것은 대기 시간이 너무 많은 시간을 사용하는 경우를 식별하는 데 도움이 됩니다. 회전 사례에 대한 자세한 내용은 코어 사용률: 스핀을 참조하세요.

참고 항목

컨텍스트 전환을 선택하면 스레드 잠금에 표시되는 요소 세부 정보 창을 사용하여 스레드 직렬화를 발생시키는 정확한 코드 줄을 식별할 수 있습니다.

WPA(Windows Performance Analyzer)

그림 2는 스레드가 병렬로 실행되지 않을 때의 모습을 보여줍니다.

그림 2. 프로세스, 스레드별 타임라인이 병렬로 실행되지 않는 계단 스텝 효과를 보여주는 스레드 창

프로세스, 스레드별 타임라인이 병렬로 실행되지 않는 계단 스텝 효과를 보여주는 스레드 창의 스냅샷

작업자 스레드가 작업을 찾는 동안 타이틀에 회전하는 작업자 스레드가 있는 경우 ETW(Windows용 이벤트 추적) 이벤트를 추가하는 것이 유용합니다. 예를 들어 그림 3을 참조하세요. ETW 추가에 대한 자세한 내용은 사용자 지정 이벤트 공급자 샘플을 참조하세요. (Microsoft GDK(게임 개발 키트) 샘플을 다운로드하려면 Xbox 개발자 다운로드)를 참조하세요. 작업자 스레드의 스핀 블록 및 처리 블록 주위에 이벤트를 추가해야 합니다. WPA의 공급자, 작업, Opcode별 일반 이벤트 활동 창은 각 이벤트가 발생할 때 표시됩니다. 과도하게 회전하는 스레드를 식별하려면 코어 사용률: 스핀을 참조하세요.

그림 3. CustomEventProvider 샘플의 사용자 지정 ETW 이벤트를 표시하는 일반 이벤트 창

CustomEventProvider 샘플의 사용자 지정 ETW 이벤트를 보여주는 일반 이벤트 창의 스크린샷