다음을 통해 공유


ISchedulerProxy 구조체

스케줄러가 리소스 할당을 협상하기 위해 동시성 런타임의 리소스 관리자와 통신하는 데 사용되는 인터페이스입니다.

구문

struct ISchedulerProxy;

멤버

공용 메서드

이름 설명
ISchedulerProxy::BindContext 실행 컨텍스트를 스레드 프록시와 연결합니다(아직 연결되지 않은 경우).
ISchedulerProxy::CreateOversubscriber 기존 실행 리소스와 연결된 하드웨어 스레드에 새 가상 프로세서 루트를 만듭니다.
ISchedulerProxy::RequestInitialVirtualProcessors 가상 프로세서 루트의 초기 할당을 요청합니다. 모든 가상 프로세서 루트는 스케줄러에 대한 작업을 수행할 수 있는 하나의 스레드를 실행하는 기능을 나타냅니다.
ISchedulerProxy::Shutdown 스케줄러가 종료되고 있음을 Resource Manager에 알깁니다. 이로 인해 Resource Manager는 스케줄러에 부여된 모든 리소스를 즉시 회수합니다.
ISchedulerProxy::SubscribeCurrentThread 현재 스레드를 Resource Manager에 등록하여 이 스케줄러와 연결합니다.
ISchedulerProxy::UnbindContext 매개 변수에 지정된 pContext 실행 컨텍스트에서 스레드 프록시를 연결 해제하고 스레드 프록시 팩터리의 사용 가능한 풀로 반환합니다. 이 메서드는 ISchedulerProxy::BindContext 메서드를 통해 바인딩된 실행 컨텍스트에서만 호출될 수 있으며 IThreadProxy::SwitchTo 메서드 호출의 매개 변수를 pContext 통해 아직 시작되지 않았습니다.

설명

Resource Manager는 IResourceManager::RegisterScheduler 메서드를 사용하여 등록하는 모든 스케줄러에 인터페이스를 전달 ISchedulerProxy 합니다.

상속 계층 구조

ISchedulerProxy

요구 사항

헤더: concrtrm.h

네임스페이스: 동시성

ISchedulerProxy::BindContext 메서드

실행 컨텍스트를 스레드 프록시와 연결합니다(아직 연결되지 않은 경우).

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

매개 변수

pContext
스레드 프록시와 연결할 실행 컨텍스트에 대한 인터페이스입니다.

설명

일반적으로 IThreadProxy::SwitchTo 메서드는 요청 시 실행 컨텍스트에 스레드 프록시를 바인딩합니다. 그러나 메서드가 이미 바인딩된 컨텍스트로 전환되도록 SwitchTo 컨텍스트를 미리 바인딩해야 하는 상황이 있습니다. UMS 예약 컨텍스트에서는 메모리를 할당하는 메서드를 호출할 수 없으며 스레드 프록시를 스레드 프록시 팩터리의 무료 풀에서 쉽게 사용할 수 없는 경우 스레드 프록시 바인딩에 메모리 할당이 포함될 수 있습니다.

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

ISchedulerProxy::CreateOversubscriber 메서드

기존 실행 리소스와 연결된 하드웨어 스레드에 새 가상 프로세서 루트를 만듭니다.

virtual IVirtualProcessorRoot* CreateOversubscriber(_Inout_ IExecutionResource* pExecutionResource) = 0;

매개 변수

pExecutionResource
IExecutionResource 초과 구독하려는 하드웨어 스레드를 나타내는 인터페이스입니다.

Return Value

IVirtualProcessorRoot 인터페이스입니다.

설명

스케줄러가 제한된 시간 동안 특정 하드웨어 스레드를 초과 구독하려는 경우 이 메서드를 사용합니다. 가상 프로세서 루트가 완료되면 인터페이스에서 Remove 메서드를 호출하여 리소스 관리자로 IVirtualProcessorRoot 반환해야 합니다.

IVirtualProcessorRoot 인터페이스가 IExecutionResource 인터페이스에서 상속하기 때문에 기존 가상 프로세서 루트를 초과 구독할 수도 있습니다.

ISchedulerProxy::RequestInitialVirtualProcessors 메서드

가상 프로세서 루트의 초기 할당을 요청합니다. 모든 가상 프로세서 루트는 스케줄러에 대한 작업을 수행할 수 있는 하나의 스레드를 실행하는 기능을 나타냅니다.

virtual IExecutionResource* RequestInitialVirtualProcessors(bool doSubscribeCurrentThread) = 0;

매개 변수

doSubscribeCurrentThread
리소스 할당 중에 현재 스레드를 구독하고 해당 스레드를 고려할지 여부입니다.

Return Value

IExecutionResource 매개 변수 doSubscribeCurrentThread 에 값true이 있는 경우 현재 스레드에 대한 인터페이스입니다. 값이 false면 메서드는 NULL을 반환합니다.

설명

스케줄러가 작업을 실행하기 전에 이 메서드를 사용하여 Resource Manager에서 가상 프로세서 루트를 요청해야 합니다. Resource Manager는 IScheduler::GetPolicy를 사용하여 스케줄러의 정책에 액세스하고 TargetOversubscriptionFactor 정책 키 MinConcurrencyMaxConcurrency 값을 사용하고, 처음에 스케줄러에 할당할 하드웨어 스레드 수와 모든 하드웨어 스레드에 대해 만들 가상 프로세서 루트 수를 결정합니다. 스케줄러 정책을 사용하여 스케줄러의 초기 할당을 결정하는 방법에 대한 자세한 내용은 PolicyElementKey를 참조 하세요.

Resource Manager는 가상 프로세서 루트 목록을 사용하여 IScheduler::AddVirtualProcessors 메서드를 호출하여 스케줄러에 리소스를 부여합니다. 이 메서드가 반환되기 전에 메서드가 스케줄러에 대한 콜백으로 호출됩니다.

스케줄러가 매개 변수 doSubscribeCurrentThread 를 설정하여 현재 스레드에 대한 구독을 true요청한 경우 메서드는 인터페이스를 IExecutionResource 반환합니다. IExecutionResource::Remove 메서드를 사용하여 나중에 구독을 종료해야 합니다.

선택한 하드웨어 스레드를 결정할 때 Resource Manager는 프로세서 노드 선호도 최적화를 시도합니다. 현재 스레드에 대한 구독이 요청되면 현재 스레드가 이 스케줄러에 할당된 작업에 참여하려고 했음을 나타냅니다. 이러한 경우 할당된 가상 프로세서 루트는 가능하면 현재 스레드가 실행 중인 프로세서 노드에 있습니다.

스레드를 구독하면 기본 하드웨어 스레드의 구독 수준이 1씩 증가합니다. 구독이 종료되면 구독 수준이 1씩 줄어듭니다. 구독 수준에 대한 자세한 내용은 IExecutionResource::CurrentSubscriptionLevel을 참조하세요.

ISchedulerProxy::Shutdown 메서드

스케줄러가 종료되고 있음을 Resource Manager에 알깁니다. 이로 인해 Resource Manager는 스케줄러에 부여된 모든 리소스를 즉시 회수합니다.

virtual void Shutdown() = 0;

설명

스케줄러가 메서드 ISchedulerProxy::RequestInitialVirtualProcessors 를 사용하여 외부 스레드를 구독한 결과로 받은 모든 IExecutionContext 인터페이스이거나 ISchedulerProxy::SubscribeCurrentThread 스케줄러가 자체적으로 종료되기 전에 Resource Manager에 IExecutionResource::Remove 반환되어야 합니다.

스케줄러에 비활성화된 가상 프로세서 루트가 있는 경우 IVirtualProcessorRoot::Activate를 사용하여 활성화해야 하며, 실행 중인 스레드 프록시가 스케줄러 프록시에서 호출 Shutdown 하기 전에 디스패치하는 실행 컨텍스트의 메서드를 그대로 유지해야 Dispatch합니다.

모든 가상 프로세서 루트는 종료 시 리소스 관리자로 반환되기 때문에 리소스 관리자가 Remove 메서드 호출을 통해 부여한 모든 가상 프로세서 루트를 스케줄러가 개별적으로 반환할 필요는 없습니다.

ISchedulerProxy::SubscribeCurrentThread 메서드

현재 스레드를 Resource Manager에 등록하여 이 스케줄러와 연결합니다.

virtual IExecutionResource* SubscribeCurrentThread() = 0;

Return Value

IExecutionResource 런타임의 현재 스레드를 나타내는 상호 연결입니다.

설명

Resource Manager가 스케줄러 및 기타 스케줄러에 리소스를 할당하는 동안 현재 스레드를 고려하도록 하려면 이 메서드를 사용합니다. 특히 스레드가 스케줄러가 Resource Manager에서 수신하는 가상 프로세서 루트와 함께 스케줄러에 대기 중인 작업에 참여하도록 계획할 때 특히 유용합니다. Resource Manager는 정보를 사용하여 시스템에서 하드웨어 스레드의 불필요한 초과 구독을 방지합니다.

이 메서드를 통해 받은 실행 리소스는 IExecutionResource::Remove 메서드를 사용하여 Resource Manager로 반환되어야 합니다. 메서드를 Remove 호출하는 스레드는 이전에 메서드를 호출 SubscribeCurrentThread 한 스레드와 동일해야 합니다.

스레드를 구독하면 기본 하드웨어 스레드의 구독 수준이 1씩 증가합니다. 구독이 종료되면 구독 수준이 1씩 줄어듭니다. 구독 수준에 대한 자세한 내용은 IExecutionResource::CurrentSubscriptionLevel을 참조하세요.

ISchedulerProxy::UnbindContext 메서드

매개 변수에 지정된 pContext 실행 컨텍스트에서 스레드 프록시를 연결 해제하고 스레드 프록시 팩터리의 사용 가능한 풀로 반환합니다. 이 메서드는 ISchedulerProxy::BindContext 메서드를 통해 바인딩된 실행 컨텍스트에서만 호출될 수 있으며 IThreadProxy::SwitchTo 메서드 호출의 매개 변수를 pContext 통해 아직 시작되지 않았습니다.

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

매개 변수

pContext
스레드 프록시에서 연결을 끊을 실행 컨텍스트입니다.

참고 항목

concurrency 네임스페이스
IScheduler 구조체
IThreadProxy 구조체
IVirtualProcessorRoot 구조체
IResourceManager 구조체