Spec-Zone.ru › Ada 2012
Справочник по Ada 2012

D.16.1 Домены диспетчеризации для многопроцессорных платформ

Этот подпункт позволяет реализациям на многопроцессорных платформах разделить их на отдельные домены диспетчеризации во время запуска программы.

Статическая семантика

Существует следующий определённый языком библиотечный пакет:
with Ada.Real_Time;
with Ada.Task_Identification;
package System.Multiprocessors.Dispatching_Domains is
Dispatching_Domain_Error : exception;
type Dispatching_Domain (<>) is limited private;
System_Dispatching_Domain : constant Dispatching_Domain;
function Create (First : CPU; Last : CPU_Range) return Dispatching_Domain;
function Get_First_CPU (Domain : Dispatching_Domain) return CPU;
function Get_Last_CPU (Domain : Dispatching_Domain) return CPU_Range;
type CPU_Set is array(CPU range <>) of Boolean;
function Create (Set : CPU_Set) return Dispatching_Domain;
function Get_CPU_Set (Domain : Dispatching_Domain) return CPU_Set;
function Get_Dispatching_Domain
(T : Ada.Task_Identification.Task_Id :=
Ada.Task_Identification.Current_Task)
return Dispatching_Domain;
procedure Assign_Task
(Domain : in out Dispatching_Domain;
CPU : in CPU_Range := Not_A_Specific_CPU;
T : in Ada.Task_Identification.Task_Id :=
Ada.Task_Identification.Current_Task);
procedure Set_CPU
(CPU : in CPU_Range;
T : in Ada.Task_Identification.Task_Id :=
Ada.Task_Identification.Current_Task);
function Get_CPU
(T : Ada.Task_Identification.Task_Id :=
Ada.Task_Identification.Current_Task)
return CPU_Range;
procedure Delay_Until_And_Set_CPU
(Delay_Until_Time : in Ada.Real_Time.Time; CPU : in CPU_Range);
private
... -- не определено языком
end System.Multiprocessors.Dispatching_Domains;
Домен диспетчеризации представляет собой набор процессоров, на которых может выполняться задача. Каждый процессор содержится ровно в одном домене диспетчеризации. Объект типа Dispatching_Domain идентифицирует домен диспетчеризации. System_Dispatching_Domain идентифицирует домен, содержащий процессор или процессоры, на которых выполняется системная задача. При запуске программы все процессоры содержатся в этом домене.
Для типа задачи (включая анонимный тип single_task_declaration), может быть указан следующий аспект представления, определённый языком:
Dispatching_Domain

Значение аспекта Dispatching_Domain — это выражение, которое должно быть типа Dispatching_Domains.Dispatching_Domain. Этот аспект является доменом, к которому назначена задача (или все объекты типа задачи).

Правила легитимности

Аспект Dispatching_Domain не должен быть задан для интерфейса задачи.

Динамическая семантика

Выражение, указанное для аспекта Dispatching_Domain типа задачи, вычисляется каждый раз, когда создаётся объект типа задачи (см. 9.1). Если идентифицированный домен диспетчеризации пуст, то возникает Dispatching_Domain_Error; в противном случае только что созданная задача назначается домену, определяемому значением выражения.
Если задача не назначена явно ни одному домену, она назначается домену активирующей задачи. Задача всегда выполняется на каком-либо процессоре в своём домене.
Если для задачи указаны и домен диспетчеризации, и процессор, и значение процессора не содержится в множестве процессоров для данного домена (и не является Not_A_Specific_CPU), то считается, что активация задачи не удалась, и она становится завершённой задачей (см. 9.2).
Функция Create с параметрами First и Last создаёт и возвращает домен диспетчеризации, содержащий все процессоры в диапазоне First .. Last. Функция Create с параметром Set создаёт и возвращает домен диспетчеризации, содержащий процессоры, для которых Set(I) равно True. Эти процессоры удаляются из System_Dispatching_Domain. Вызов Create вызовет Dispatching_Domain_Error, если любой указанный процессор в настоящее время не находится в System_Dispatching_Domain, или если система не может поддерживать отдельный домен над указанными процессорами, или если процессору назначена задача, или если выделение оставит System_Dispatching_Domain пустым. Вызов Create вызовет Dispatching_Domain_Error, если вызывающая задача не является системной задачей, или если Create вызван после вызова основной подпрограммы.
Функция Get_First_CPU возвращает первый процессор в Domain, или CPU'First, если Domain пуст; Get_Last_CPU возвращает последний процессор в Domain, или CPU_Range'First, если Domain пуст. Функция Get_CPU_Set(D) возвращает массив, низкая граница которого равна Get_First_CPU(D), а высокая — Get_Last_CPU(D), с истинными значениями в Set, соответствующими процессорам, которые находятся в данном Domain.
Функция Get_Dispatching_Domain возвращает домен диспетчеризации, к которому назначена задача.
Вызов процедуры Assign_Task назначает задачу T процессору внутри домена диспетчеризации Domain. Задача T теперь может выполняться только на процессоре CPU, если CPU не обозначает Not_A_Specific_CPU, в этом случае она может выполняться на любом процессоре в Domain. Исключение Dispatching_Domain_Error распространяется, если Domain пуст, T уже назначена в другой домен диспетчеризации, отличном от System_Dispatching_Domain, или если CPU не является одним из процессоров Domain (и не является Not_A_Specific_CPU). Вызов Assign_Task является точкой диспетчеризации задачи T, если T не находится внутри защищённого действия, в противном случае действие на задачу T откладывается до её следующей точки диспетчеризации. Если T является Current_Task, эффект происходит немедленно, если T не находится в защищённом действии, в противном случае эффект происходит как можно скорее. Назначение задачи, уже назначенной System_Dispatching_Domain, этому же домену, не имеет эффекта.
Вызов процедуры Set_CPU назначает задачу T процессору. Задача T теперь может выполняться только на процессоре CPU, если CPU не обозначает Not_A_Specific_CPU, в этом случае она может выполняться на любом процессоре в её домене диспетчеризации. Исключение Dispatching_Domain_Error распространяется, если CPU не является одним из процессоров домена диспетчеризации, к которому назначена T (и не является Not_A_Specific_CPU). Вызов Set_CPU является точкой диспетчеризации задачи T, если T не находится внутри защищённого действия, в противном случае действие на задачу T откладывается до её следующей точки диспетчеризации. Если T является Current_Task, эффект происходит немедленно, если T не находится в защищённом действии, в противном случае эффект происходит как можно скорее.
Функция Get_CPU возвращает процессор, назначенный задаче T, или Not_A_Specific_CPU, если задача не назначена процессору.
Вызов Delay_Until_And_Set_CPU откладывает вызывающую задачу на указанное время, а затем назначает задачу указанному процессору по истечении отложенного времени. Исключение Dispatching_Domain_Error распространяется, если P не является одним из процессоров домена диспетчеризации вызывающей задачи (и не является Not_A_Specific_CPU).

Требования к реализации

Реализация должна выполнять операции Assign_Task, Set_CPU, Get_CPU и Delay_Until_And_Set_CPU атомарно по отношению к любой из этих операций в том же домене диспетчеризации, процессоре или задаче.
Любая задача, принадлежащая системному домену диспетчеризации, может выполняться на любом процессоре в этом домене, если не указано другое назначение задачи.

Рекомендации по реализации

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

Требования к документации

Реализация должна задокументировать процессор(ы), на котором обрабатывается прерывание таймера, и, следовательно, где происходят манипуляции с очередью отложенных задач и очередью готовности. Для любого Interrupt_Id, обработчик которого может выполняться на нескольких процессорах, реализация также должна задокументировать этот набор процессоров.

Разрешения на реализацию

Реализация может ограничить количество создаваемых доменов диспетчеризации и вызвать Dispatching_Domain_Error, если будет предпринята попытка превысить это количество.


Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API