Структура IVirtualProcessorRoot
Абстракция для аппаратного потока, в котором может выполняться прокси-поток.
Синтаксис
struct IVirtualProcessorRoot : public IExecutionResource;
Участники
Открытые методы
Имя | Описание |
---|---|
IVirtualProcessorRoot::Activate | Приводит к тому, что прокси-сервер потока, связанный с интерфейсом pContext контекста выполнения, начнет выполняться в этом корневом каталоге виртуального процессора. |
IVirtualProcessorRoot::D eactivate | Приводит к тому, что прокси-сервер потока, выполняемый в данный момент в корневом каталоге виртуального процессора, перестает отправлять контекст выполнения. Прокси-сервер потока возобновляет выполнение вызова Activate метода. |
IVirtualProcessorRoot::EnsureAllTasksVisible | Приводит к тому, что данные, хранящиеся в иерархии памяти отдельных процессоров, становятся видимыми для всех процессоров в системе. Это гарантирует, что на всех процессорах выполняется полная забор памяти перед возвратом метода. |
IVirtualProcessorRoot::GetId | Возвращает уникальный идентификатор для корневого каталога виртуального процессора. |
Замечания
Каждый корневой каталог виртуального процессора имеет связанный ресурс выполнения. Интерфейс IVirtualProcessorRoot
наследует от интерфейса IExecutionResource . Несколько корней виртуального процессора могут соответствовать одному и тому же базовому потоку оборудования.
Resource Manager предоставляет корням виртуальных процессоров планировщикам в ответ на запросы ресурсов. Планировщик может использовать корневой каталог виртуального процессора для выполнения работы, активировав его с помощью контекста выполнения.
Иерархия наследования
IVirtualProcessorRoot
Требования
Заголовок: concrtrm.h
Пространство имен: concurrency
Метод IVirtualProcessorRoot::Activate
Приводит к тому, что прокси-сервер потока, связанный с интерфейсом pContext
контекста выполнения, начнет выполняться в этом корневом каталоге виртуального процессора.
virtual void Activate(_Inout_ IExecutionContext* pContext) = 0;
Параметры
pContext
Интерфейс контекста выполнения, который будет отправлен в этом корневом каталоге виртуального процессора.
Замечания
Resource Manager предоставит прокси-сервер потока, если он не связан с интерфейсом контекста выполнения pContext
Этот Activate
метод можно использовать для запуска работы с новым корневым процессором виртуального процессора, возвращаемого диспетчером ресурсов, или для возобновления прокси-сервера потока в корневом каталоге виртуального процессора, который деактивирован или будет деактивирован. Дополнительные сведения об деактивации см. в разделе IVirtualProcessorRoot::D eactivate . При возобновлении деактивированного корневого каталога виртуального процессора параметр pContext
должен совпадать с параметром, используемым для деактивации корневого каталога виртуального процессора.
После первого активации корневого каталога виртуального процессора последующие пары вызовов Deactivate
и Activate
могут гонки друг с другом. Это означает, что диспетчер ресурсов может получить звонок Activate
, прежде чем он получит Deactivate
звонок, для него он был предназначен.
При активации корневого каталога виртуального процессора вы сигнализируете resource Manager о том, что этот корневой каталог виртуального процессора в настоящее время занят работой. Если планировщик не может найти какую-либо работу для выполнения в этом корневом каталоге, он должен вызвать Deactivate
метод, сообщающий Resource Manager, что корневой каталог виртуального процессора неактивен. Resource Manager использует эти данные для балансировки нагрузки системы.
invalid_argument
вызывается, если аргумент pContext
имеет значение NULL
.
invalid_operation
вызывается, если аргумент pContext
не представляет контекст выполнения, который был недавно отправлен этим корнем виртуального процессора.
Действие активации корня виртуального процессора увеличивает уровень подписки базового аппаратного потока на один. Дополнительные сведения об уровнях подписки см. в разделе IExecutionResource::CurrentSubscriptionLevel.
Метод IVirtualProcessorRoot::D eactivate
Приводит к тому, что прокси-сервер потока, выполняемый в данный момент в корневом каталоге виртуального процессора, перестает отправлять контекст выполнения. Прокси-сервер потока возобновляет выполнение вызова Activate
метода.
virtual bool Deactivate(_Inout_ IExecutionContext* pContext) = 0;
Параметры
pContext
Контекст, который в настоящее время отправляется этим корнем.
Возвращаемое значение
Значение boolean. Значение true
указывает, что прокси-сервер потока, возвращенный методом Deactivate
в ответ на вызов Activate
метода. Значение false
указывает, что прокси-сервер потока, возвращенный методом в ответ на событие уведомления в Resource Manager. В планировщике потоков в пользовательском режиме (UMS) это означает, что элементы появились в списке завершения планировщика, а планировщик требуется для их обработки.
Замечания
Используйте этот метод, чтобы временно остановить выполнение корневого каталога виртуального процессора, если вы не можете найти любую работу в планировщике. Вызов Deactivate
метода должен происходить из Dispatch
метода контекста выполнения, с которым был активирован корневой каталог виртуального процессора. Другими словами, прокси-сервер потока, вызывающий Deactivate
метод, должен быть тем, который в настоящее время выполняется в корневом каталоге виртуального процессора. Вызов метода в корневом каталоге виртуального процессора, на который вы не выполняете, может привести к неопределенному поведению.
Деактивированный корень виртуального процессора может проснуться с вызовом Activate
метода с тем же аргументом, который был передан методу Deactivate
. Планировщик отвечает за обеспечение связывания вызовов Activate
и Deactivate
методов, но они не требуются для получения в определенном порядке. Resource Manager может обрабатывать получение вызова метода, прежде чем он получает вызов Activate
Deactivate
метода, для него он был предназначен.
Если корневой каталог виртуального процессора просыпается и возвращаемое значение из Deactivate
метода является значением false
, планировщик должен запрашивать список завершения UMS с помощью IUMSCompletionList::GetUnblockNotifications
метода, действовать по этой информации, а затем снова вызывать Deactivate
метод. Это должно повторяться до тех пор, Deactivate
пока метод не возвращает значение true
.
invalid_argument
вызывается, если аргумент pContext
имеет значение NULL.
invalid_operation
Вызывается, если корневой каталог виртуального процессора никогда не был активирован, или аргумент pContext
не представляет контекст выполнения, который был недавно отправлен этим корнем виртуального процессора.
Действие деактивации корня виртуального процессора уменьшает уровень подписки базового аппаратного потока на один. Дополнительные сведения об уровнях подписки см. в разделе IExecutionResource::CurrentSubscriptionLevel.
Метод IVirtualProcessorRoot::EnsureAllTasksVisible
Приводит к тому, что данные, хранящиеся в иерархии памяти отдельных процессоров, становятся видимыми для всех процессоров в системе. Это гарантирует, что на всех процессорах выполняется полная забор памяти перед возвратом метода.
virtual void EnsureAllTasksVisible(_Inout_ IExecutionContext* pContext) = 0;
Параметры
pContext
Контекст, который в настоящее время отправляется этим корнем виртуального процессора.
Замечания
Этот метод может оказаться полезным, если вы хотите синхронизировать деактивацию корня виртуального процессора с добавлением новой работы в планировщик. По соображениям производительности вы можете решить добавить рабочие элементы в планировщик без выполнения барьера памяти, что означает, что рабочие элементы, добавленные потоком, выполняемым на одном процессоре, не сразу видны всем остальным процессорам. Используя этот метод в сочетании с методом Deactivate
, вы можете убедиться, что планировщик не деактивирует все корни виртуального процессора во время существования рабочих элементов в коллекциях планировщика.
Вызов EnsureAllTasksVisibleThe
метода должен происходить из Dispatch
метода контекста выполнения, с которым был активирован корневой каталог виртуального процессора. Другими словами, прокси-сервер потока, вызывающий EnsureAllTasksVisible
метод, должен быть тем, который в настоящее время выполняется в корневом каталоге виртуального процессора. Вызов метода в корневом каталоге виртуального процессора, на который вы не выполняете, может привести к неопределенному поведению.
invalid_argument
вызывается, если аргумент pContext
имеет значение NULL
.
invalid_operation
Вызывается, если корневой каталог виртуального процессора никогда не был активирован, или аргумент pContext
не представляет контекст выполнения, который был недавно отправлен этим корнем виртуального процессора.
Метод IVirtualProcessorRoot::GetId
Возвращает уникальный идентификатор для корневого каталога виртуального процессора.
virtual unsigned int GetId() const = 0;
Возвращаемое значение
Целочисленный идентификатор.