Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Интерфейс, по которому планировщики взаимодействуют с диспетчером ресурсов среды выполнения с параллелизмом для согласования выделения ресурсов.
Синтаксис
struct ISchedulerProxy;
Участники
Открытые методы
| Имя | Описание |
|---|---|
| ISchedulerProxy::BindContext | Связывает контекст выполнения с прокси-сервером потока, если он еще не связан с ним. |
| ISchedulerProxy::CreateOversubscriber | Создает новый корень виртуального процессора на аппаратном потоке выполнения, связанном с существующим ресурсом выполнения. |
| ISchedulerProxy::RequestInitialVirtualProcessors | Запрашивает первоначальное выделение корней виртуального процессора. Каждый виртуальный процессорный корень представляет возможность выполнять один поток, который может выполнять задачу планировщика. |
| ISchedulerProxy::Shutdown | Уведомляет менеджера ресурсов о завершении работы планировщика. Это заставит диспетчер ресурсов немедленно восстановить контроль над всеми ресурсами, предоставленными планировщику. |
| ISchedulerProxy::SubscribeCurrentThread | Регистрирует текущий поток в Resource Manager, связывая его с этим планировщиком. |
| ISchedulerProxy::UnbindContext | Отсоединяет потоковый прокси от контекста выполнения, указанного параметром pContext, и возвращает его в свободный пул фабрики прокси-потоков. Этот метод может вызываться только в контексте выполнения, который был привязан через метод ISchedulerProxy::BindContext и еще не был запущен, будучи параметром вызова метода IThreadProxy::SwitchTo. |
Замечания
Resource Manager передает каждому планировщику интерфейс ISchedulerProxy, который регистрируется с помощью метода IResourceManager::RegisterScheduler.
Иерархия наследования
ISchedulerProxy
Требования
Заголовок: concrtrm.h
Пространство имен: конкурентность
Метод 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
Уведомляет менеджера ресурсов о завершении работы планировщика. Это заставит диспетчер ресурсов немедленно восстановить контроль над всеми ресурсами, предоставленными планировщику.
virtual void Shutdown() = 0;
Замечания
Все IExecutionContext интерфейсы, которые планировщик получил в результате подписки на внешний поток с помощью методов ISchedulerProxy::RequestInitialVirtualProcessors или ISchedulerProxy::SubscribeCurrentThread, должны быть возвращены в Менеджер ресурсов перед тем, как планировщик завершит свою работу.
Если ваш планировщик имел какие-либо деактивированные виртуальные процессорные корни, вы должны их активировать с помощью
Для планировщика необязательно возвращать все корни виртуальных процессоров, выделенные ему Диспетчером ресурсов через вызовы метода Remove, поскольку все корни виртуальных процессоров будут возвращены Диспетчеру ресурсов при завершении работы системы.
Метод ISchedulerProxy::SubscribeCurrentThread
Регистрирует текущий поток в Resource Manager, связывая его с этим планировщиком.
virtual IExecutionResource* SubscribeCurrentThread() = 0;
Возвращаемое значение
IExecutionResource Интерфейс, представляющий текущий поток в среде рантайма.
Замечания
Используйте этот метод, если вы хотите, чтобы диспетчер ресурсов учитывал текущий поток при распределении ресурсов между вашим планировщиком и другими планировщиками. Особенно полезно, когда поток планирует участвовать в работе, поставленной в очередь для вашего планировщика, наряду с корнями виртуальных процессоров, которые планировщик получает от диспетчера ресурсов. Resource Manager использует сведения, чтобы предотвратить ненужные перезаписи аппаратных потоков в системе.
Ресурс выполнения, полученный с помощью этого метода, должен быть возвращен в Resource Manager с помощью метода IExecutionResource::Remove . Поток, вызывающий Remove метод, должен быть тем же потоком, который ранее вызывал SubscribeCurrentThread метод.
Действие подписки на поток увеличивает уровень подписки базового аппаратного потока на один. Уровень подписки уменьшается на один при завершении подписки. Дополнительные сведения об уровнях подписки см. в разделе IExecutionResource::CurrentSubscriptionLevel.
Метод ISchedulerProxy::UnbindContext
Отсоединяет потоковый прокси от контекста выполнения, указанного параметром pContext, и возвращает его в свободный пул фабрики прокси-потоков. Этот метод может вызываться только в контексте выполнения, который был привязан через метод ISchedulerProxy::BindContext и еще не был запущен, будучи параметром вызова метода IThreadProxy::SwitchTo.
virtual void UnbindContext(_Inout_ IExecutionContext* pContext) = 0;
Параметры
pContext
Контекст выполнения, который отсоединяется от прокси потока.
См. также
Пространство имен параллелизм
Структура IScheduler
Структура IThreadProxy
Структура IVirtualProcessorRoot
Структура IResourceManager