다음을 통해 공유


IVirtualProcessorRoot 구조체

스레드 프록시가 실행될 수 있는 하드웨어 스레드의 추상화입니다.

구문

struct IVirtualProcessorRoot : public IExecutionResource;

멤버

공용 메서드

이름 설명
IVirtualProcessorRoot::Activate 실행 컨텍스트 인터페이스 pContext 와 연결된 스레드 프록시가 이 가상 프로세서 루트에서 실행을 시작하도록 합니다.
IVirtualProcessorRoot::D활성화 이 가상 프로세서 루트에서 현재 실행 중인 스레드 프록시가 실행 컨텍스트 디스패치를 중지하도록 합니다. 스레드 프록시는 메서드 호출에서 Activate 실행을 다시 시작합니다.
IVirtualProcessorRoot::EnsureAllTasksVisible 개별 프로세서의 메모리 계층 구조에 저장된 데이터가 시스템의 모든 프로세서에 표시되도록 합니다. 메서드가 반환되기 전에 모든 프로세서에서 전체 메모리 펜스가 실행되었는지 확인합니다.
IVirtualProcessorRoot::GetId 가상 프로세서 루트에 대한 고유 식별자를 반환합니다.

설명

모든 가상 프로세서 루트에는 연결된 실행 리소스가 있습니다. 인터페이스는 IVirtualProcessorRoot IExecutionResource 인터페이스에서 상속됩니다. 여러 가상 프로세서 루트는 동일한 기본 하드웨어 스레드에 해당할 수 있습니다.

Resource Manager는 리소스 요청에 대한 응답으로 스케줄러에 가상 프로세서 루트를 부여합니다. 스케줄러는 가상 프로세서 루트를 사용하여 실행 컨텍스트로 활성화하여 작업을 수행할 수 있습니다.

상속 계층 구조

IExecutionResource

IVirtualProcessorRoot

요구 사항

헤더: concrtrm.h

네임스페이스: 동시성

IVirtualProcessorRoot::Activate 메서드

실행 컨텍스트 인터페이스 pContext 와 연결된 스레드 프록시가 이 가상 프로세서 루트에서 실행을 시작하도록 합니다.

virtual void Activate(_Inout_ IExecutionContext* pContext) = 0;

매개 변수

pContext
이 가상 프로세서 루트에 디스패치될 실행 컨텍스트에 대한 인터페이스입니다.

설명

실행 컨텍스트 인터페이스와 연결되지 않은 경우 Resource Manager에서 스레드 프록시를 제공합니다. pContext

이 메서드를 Activate 사용하여 Resource Manager에서 반환된 새 가상 프로세서 루트에서 작업을 시작하거나 비활성화되었거나 비활성화하려고 하는 가상 프로세서 루트에서 스레드 프록시를 다시 시작할 수 있습니다. 비활성화에 대한 자세한 내용은 IVirtualProcessorRoot::D활성화를 참조하세요. 비활성화된 가상 프로세서 루트를 다시 시작하면 매개 변수 pContext 는 가상 프로세서 루트를 비활성화하는 데 사용되는 매개 변수와 동일해야 합니다.

가상 프로세서 루트가 처음으로 활성화되면 후속 호출 쌍이 서로 경합할 Deactivate Activate 수 있습니다. 즉, Resource Manager가 의도한 호출을 받기 전에 호출 ActivateDeactivate 수신하는 것이 허용됩니다.

가상 프로세서 루트를 활성화하면 이 가상 프로세서 루트가 현재 작업 중임을 Resource Manager에 알릴 수 있습니다. 스케줄러가 이 루트에서 실행할 작업을 찾을 수 없는 경우 가상 프로세서 루트가 유휴 상태임을 Resource Manager에 알리는 메서드를 호출 Deactivate 해야 합니다. Resource Manager는 이 데이터를 사용하여 시스템의 부하를 분산합니다.

invalid_argument 는 인수 pContext 에 값 NULL이 있으면 throw됩니다.

invalid_operation 인수 pContext 가 이 가상 프로세서 루트에 의해 가장 최근에 디스패치된 실행 컨텍스트를 나타내지 않으면 throw됩니다.

가상 프로세서 루트를 활성화하면 기본 하드웨어 스레드의 구독 수준이 1씩 증가합니다. 구독 수준에 대한 자세한 내용은 IExecutionResource::CurrentSubscriptionLevel을 참조하세요.

IVirtualProcessorRoot::D eactivate 메서드

이 가상 프로세서 루트에서 현재 실행 중인 스레드 프록시가 실행 컨텍스트 디스패치를 중지하도록 합니다. 스레드 프록시는 메서드 호출에서 Activate 실행을 다시 시작합니다.

virtual bool Deactivate(_Inout_ IExecutionContext* pContext) = 0;

매개 변수

pContext
현재 이 루트에 의해 디스패치되는 컨텍스트입니다.

Return Value

부울 값입니다. 값은 true 메서드 호출에 대한 응답으로 메서드에서 Deactivate 반환된 스레드 프록시를 Activate 나타냅니다. 값은 Resource Manager의 false 알림 이벤트에 대한 응답으로 메서드에서 반환된 스레드 프록시를 나타냅니다. UMS(사용자 모드 예약 가능) 스레드 스케줄러에서 이는 항목이 스케줄러의 완료 목록에 표시되었고 이를 처리하려면 스케줄러가 필요했음을 나타냅니다.

설명

스케줄러에서 작업을 찾을 수 없는 경우 이 메서드를 사용하여 가상 프로세서 루트 실행을 일시적으로 중지합니다. 메서드에 대한 호출은 Deactivate 가상 프로세서 루트가 Dispatch 마지막으로 활성화된 실행 컨텍스트의 메서드 내에서 시작되어야 합니다. 즉, 메서드를 호출하는 Deactivate 스레드 프록시는 가상 프로세서 루트에서 현재 실행 중인 프록시여야 합니다. 실행하지 않는 가상 프로세서 루트에서 메서드를 호출하면 정의되지 않은 동작이 발생할 수 있습니다.

비활성화된 가상 프로세서 루트는 메서드에 Activate 전달된 Deactivate 것과 동일한 인수를 사용하여 메서드를 호출하여 해제될 수 있습니다. 스케줄러는 호출과 Deactivate 메서드가 쌍을 Activate 이루는지 확인해야 하지만 특정 순서로 수신할 필요는 없습니다. Resource Manager는 메서드가 의도한 메서드에 Activate 대한 호출을 받기 전에 메서드에 대한 호출 수신을 처리할 Deactivate 수 있습니다.

가상 프로세서 루트가 깨어나고 메서드의 Deactivate 반환 값이 값 false인 경우 스케줄러는 메서드를 통해 IUMSCompletionList::GetUnblockNotifications UMS 완료 목록을 쿼리하고 해당 정보에 대해 작업한 다음 메서드를 Deactivate 다시 호출해야 합니다. 메서드가 값을 true반환할 때까지 Deactivate 반복해야 합니다.

invalid_argument 는 인수 pContext 에 NULL 값이 있으면 throw됩니다.

invalid_operation 는 가상 프로세서 루트가 활성화되지 않았거나 인수 pContext 가 이 가상 프로세서 루트에 의해 가장 최근에 디스패치된 실행 컨텍스트를 나타내지 않는 경우 throw됩니다.

가상 프로세서 루트를 비활성화하면 기본 하드웨어 스레드의 구독 수준이 1씩 감소합니다. 구독 수준에 대한 자세한 내용은 IExecutionResource::CurrentSubscriptionLevel을 참조하세요.

IVirtualProcessorRoot::EnsureAllTasksVisible 메서드

개별 프로세서의 메모리 계층 구조에 저장된 데이터가 시스템의 모든 프로세서에 표시되도록 합니다. 메서드가 반환되기 전에 모든 프로세서에서 전체 메모리 펜스가 실행되었는지 확인합니다.

virtual void EnsureAllTasksVisible(_Inout_ IExecutionContext* pContext) = 0;

매개 변수

pContext
현재 이 가상 프로세서 루트에 의해 디스패치되는 컨텍스트입니다.

설명

이 메서드는 가상 프로세서 루트의 비활성화를 스케줄러에 새 작업 추가와 동기화하려는 경우에 유용할 수 있습니다. 성능상의 이유로 메모리 장벽을 실행하지 않고 스케줄러에 작업 항목을 추가하도록 결정할 수 있습니다. 즉, 한 프로세서에서 실행되는 스레드에서 추가한 작업 항목이 다른 모든 프로세서에 즉시 표시되지 않습니다. 이 메서드를 메서드와 함께 Deactivate 사용하면 작업 항목이 스케줄러 컬렉션에 있는 동안 스케줄러가 모든 가상 프로세서 루트를 비활성화하지 않도록 할 수 있습니다.

메서드에 대한 호출은 EnsureAllTasksVisibleThe 가상 프로세서 루트가 Dispatch 마지막으로 활성화된 실행 컨텍스트의 메서드 내에서 시작되어야 합니다. 즉, 메서드를 호출하는 EnsureAllTasksVisible 스레드 프록시는 가상 프로세서 루트에서 현재 실행 중인 프록시여야 합니다. 실행하지 않는 가상 프로세서 루트에서 메서드를 호출하면 정의되지 않은 동작이 발생할 수 있습니다.

invalid_argument 는 인수 pContext 에 값 NULL이 있으면 throw됩니다.

invalid_operation 는 가상 프로세서 루트가 활성화되지 않았거나 인수 pContext 가 이 가상 프로세서 루트에 의해 가장 최근에 디스패치된 실행 컨텍스트를 나타내지 않는 경우 throw됩니다.

IVirtualProcessorRoot::GetId 메서드

가상 프로세서 루트에 대한 고유 식별자를 반환합니다.

virtual unsigned int GetId() const = 0;

Return Value

정수 식별자입니다.

참고 항목

concurrency 네임스페이스