Структура 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