Поделиться через


Структура ISchedulerProxy

Интерфейс, по которому планировщики взаимодействуют с диспетчером ресурсов среды выполнения с параллелизмом для согласования выделения ресурсов.

Синтаксис

struct ISchedulerProxy;

Участники

Открытые методы

Имя Описание
ISchedulerProxy::BindContext Связывает контекст выполнения с прокси-сервером потока, если он еще не связан с ним.
ISchedulerProxy::CreateOversubscriber Создает новый корневой каталог виртуального процессора в аппаратном потоке, связанном с существующим ресурсом выполнения.
ISchedulerProxy::RequestInitialVirtualProcessors Запрашивает первоначальное выделение корней виртуального процессора. Каждый корневой каталог виртуального процессора представляет возможность выполнять один поток, который может выполнять работу планировщика.
ISchedulerProxy::Shutdown Уведомляет Resource Manager о завершении работы планировщика. Это приведет к немедленному освобождению всех ресурсов, предоставленных планировщику.
ISchedulerProxy::SubscribeCurrentThread Регистрирует текущий поток в Resource Manager, связывая его с этим планировщиком.
ISchedulerProxy::UnbindContext Отсоединяет прокси-сервер потока от контекста выполнения, указанного pContext параметром, и возвращает его в свободный пул фабрики потоков. Этот метод может вызываться только в контексте выполнения, который был привязан через метод ISchedulerProxy::BindContext и еще не был запущен с помощью pContext параметра вызова метода IThreadProxy::SwitchTo .

Замечания

Resource Manager передает интерфейс каждому планировщику ISchedulerProxy , который регистрирует его с помощью метода IResourceManager::RegisterScheduler .

Иерархия наследования

ISchedulerProxy

Требования

Заголовок: concrtrm.h

Пространство имен: concurrency

Метод ISchedulerProxy::BindContext

Связывает контекст выполнения с прокси-сервером потока, если он еще не связан с ним.

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

Параметры

pContext
Интерфейс контекста выполнения для связывания с прокси-сервером потока.

Замечания

Обычно метод IThreadProxy::SwitchTo привязывает прокси-сервер потока к контексту выполнения по запросу. Однако существуют обстоятельства, когда необходимо заранее привязать контекст, чтобы убедиться, что SwitchTo метод переключается на уже привязанный контекст. Это относится к контексту планирования UMS, так как он не может вызывать методы, которые выделяют память, и привязка прокси-сервера потока может включать выделение памяти, если прокси-сервер потока недоступен в свободном пуле фабрики прокси-сервера потоков.

invalid_argument вызывается, если параметр pContext имеет значение NULL.

Метод ISchedulerProxy::CreateOversubscriber

Создает новый корневой каталог виртуального процессора в аппаратном потоке, связанном с существующим ресурсом выполнения.

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

Параметры

pExecutionResource
Интерфейс IExecutionResource , представляющий аппаратный поток, который требуется переподписать.

Возвращаемое значение

Интерфейс IVirtualProcessorRoot.

Замечания

Используйте этот метод, когда планировщик хочет переопределить определенный аппаратный поток в течение ограниченного времени. После завершения работы с корнем виртуального процессора необходимо вернуть его в диспетчер ресурсов, вызвав метод Remove в интерфейсе IVirtualProcessorRoot .

Поскольку интерфейс IVirtualProcessorRoot наследует от интерфейса IExecutionResource, можно даже переподписать существующий корневой виртуальный процессор.

Метод ISchedulerProxy::RequestInitialVirtualProcessors

Запрашивает первоначальное выделение корней виртуального процессора. Каждый корневой каталог виртуального процессора представляет возможность выполнять один поток, который может выполнять работу планировщика.

virtual IExecutionResource* RequestInitialVirtualProcessors(bool doSubscribeCurrentThread) = 0;

Параметры

doSubscribeCurrentThread
Следует ли подписать текущий поток и учетную запись для него во время выделения ресурсов.

Возвращаемое значение

Интерфейс IExecutionResource для текущего потока, если параметр doSubscribeCurrentThread имеет значение true. Если значение равно false, метод возвращает ЗНАЧЕНИЕ NULL.

Замечания

Перед выполнением планировщика любой работы он должен использовать этот метод для запроса корней виртуальных процессоров из Resource Manager. Resource Manager получит доступ к политике планировщика с помощью IScheduler::GetPolicy и будет использовать значения для ключей MinConcurrencyполитики, MaxConcurrency а TargetOversubscriptionFactor также определить, сколько аппаратных потоков для назначения планировщику изначально и сколько корней виртуальных процессоров создавать для каждого аппаратного потока. Дополнительные сведения о том, как политики планировщика используются для определения первоначального выделения планировщика, см. в разделе PolicyElementKey.

Resource Manager предоставляет ресурсы планировщику путем вызова метода IScheduler::AddVirtualProcessors со списком корней виртуального процессора. Метод вызывается как обратный вызов в планировщик перед возвратом этого метода.

Если планировщик запросил подписку для текущего потока, задав параметр doSubscribeCurrentThread в trueзначение, метод возвращает IExecutionResource интерфейс. Подписка должна быть завершена позже с помощью метода IExecutionResource::Remove .

При определении выбранных аппаратных потоков диспетчер ресурсов попытается оптимизировать сопоставление узлов процессора. Если подписка запрашивается для текущего потока, это означает, что текущий поток намерен участвовать в работе, назначенной этому планировщику. В таком случае выделенные корневы виртуальных процессоров находятся на узле процессора, на который выполняется текущий поток, если это возможно.

Действие подписки на поток увеличивает уровень подписки базового аппаратного потока на один. Уровень подписки уменьшается на один при завершении подписки. Дополнительные сведения об уровнях подписки см. в разделе IExecutionResource::CurrentSubscriptionLevel.

Метод ISchedulerProxy::Shutdown

Уведомляет Resource Manager о завершении работы планировщика. Это приведет к немедленному освобождению всех ресурсов, предоставленных планировщику.

virtual void Shutdown() = 0;

Замечания

Все IExecutionContext интерфейсы планировщика, полученные в результате подписки на внешний поток с помощью методов ISchedulerProxy::RequestInitialVirtualProcessors или ISchedulerProxy::SubscribeCurrentThread должны быть возвращены в Resource Manager до IExecutionResource::Remove завершения работы планировщика.

Если планировщик имел какие-либо деактивированные корни виртуального процессора, необходимо активировать их с помощью IVirtualProcessorRoot::Activate, а прокси-серверы потоков, выполняемые на них, оставляют Dispatch метод контекстов выполнения, которые они отправляют перед вызовом Shutdown на прокси-сервере планировщика.

Для планировщика необязательно возвращать все корневые виртуальные процессоры, выданные ему диспетчером ресурсов путем вызовов метода Remove, поскольку все корневые виртуальные процессоры будут возвращены диспетчеру ресурсов при завершении работы.

Метод ISchedulerProxy::SubscribeCurrentThread

Регистрирует текущий поток в Resource Manager, связывая его с этим планировщиком.

virtual IExecutionResource* SubscribeCurrentThread() = 0;

Возвращаемое значение

IExecutionResource Взаимодействие, представляющее текущий поток во время выполнения.

Замечания

Используйте этот метод, если вы хотите, чтобы Resource Manager учитывал текущий поток при выделении ресурсов планировщику и другим планировщикам. Особенно полезно, когда поток планирует участвовать в рабочей очереди планировщика вместе с корнем виртуального процессора, планировщик получает от Resource Manager. Resource Manager использует сведения, чтобы предотвратить ненужные перезаписи аппаратных потоков в системе.

Ресурс выполнения, полученный с помощью этого метода, должен быть возвращен в Resource Manager с помощью метода IExecutionResource::Remove . Поток, вызывающий Remove метод, должен быть тем же потоком, который ранее вызывал SubscribeCurrentThread метод.

Действие подписки на поток увеличивает уровень подписки базового аппаратного потока на один. Уровень подписки уменьшается на один при завершении подписки. Дополнительные сведения об уровнях подписки см. в разделе IExecutionResource::CurrentSubscriptionLevel.

Метод ISchedulerProxy::UnbindContext

Отсоединяет прокси-сервер потока от контекста выполнения, указанного pContext параметром, и возвращает его в свободный пул фабрики потоков. Этот метод может вызываться только в контексте выполнения, который был привязан через метод ISchedulerProxy::BindContext и еще не был запущен с помощью pContext параметра вызова метода IThreadProxy::SwitchTo .

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

Параметры

pContext
Контекст выполнения, который будет отсоединяться от прокси-сервера потока.

См. также

Пространство имен concurrency
Структура IScheduler
Структура IThreadProxy
Структура IVirtualProcessorRoot
Структура IResourceManager