Справочник по Ada (Ada 2022)
D.16 Реализация на многопроцессорных платформах
Этот подпункт позволяет настроить реализации на многопроцессорных платформах.
Статическая семантика
Существует следующая определяемая языком библиотечная пакет:
package System.Multiprocessors
with Preelaborate, Nonblocking, Global => in out synchronized is
with Preelaborate, Nonblocking, Global => in out synchronized is
type CPU_Range is range 0 .. определяемое реализацией;
Not_A_Specific_CPU : constant CPU_Range := 0;
subtype CPU is CPU_Range range 1 .. CPU_Range'Last;
Not_A_Specific_CPU : constant CPU_Range := 0;
subtype CPU is CPU_Range range 1 .. CPU_Range'Last;
function Number_Of_CPUs return CPU;
end System.Multiprocessors;
end System.Multiprocessors;
Вызов Number_Of_CPUs возвращает количество процессоров, доступных программе. В рамках заданного раздела каждый вызов Number_Of_CPUs вернёт одно и то же значение.
Для типа задачи (включая анонимный тип single_task_declaration), типа защищённого объекта (включая анонимный тип single_protected_declaration) или подпрограммы, можно указать следующий определяемый языком аспект представления:
CPU
Аспект CPU представляет собой выражение, которое должно быть типа System.Multiprocessors.CPU_Range.
Правила легальности
Если аспект CPU указан для подпрограммы, то выражение должно быть статическим.
Аспект CPU не должен быть указан для типа задачи или интерфейса защищённого объекта.
Динамическая семантика
Выражение, указанное для аспекта CPU задачи или защищённого типа, вычисляется каждый раз, когда создаётся объект соответствующего типа (см. 9.1 и 9.4). Значение CPU затем связывается с объектом.
Аспект CPU не оказывает никакого влияния, если он указан для подпрограммы, отличной от главной подпрограммы; значение CPU не связывается ни с какой задачей.
Значение CPU связывается с задачей среды, если аспект CPU указан для главной подпрограммы. Если аспект CPU не указан для главной подпрограммы, то на каком процессоре будет выполняться задача среды определяется реализацией.
Для задачи значение CPU определяет процессор, на котором задача будет активирована и выполняться; говорят, что задача назначена этому процессору. Если значение CPU равно Not_A_Specific_CPU, то задача не назначена процессору. Задача без указанного аспекта CPU будет активирована и выполняться на том же процессоре, что и её активирующая задача, если активирующей задаче назначен процессор. Если значение CPU не входит в диапазон System.Multiprocessors.CPU_Range или превышает Number_Of_CPUs, то задача считается завершившейся ошибкой, и она становится завершённой задачей (см. 9.2).
Для защищённого типа значение CPU определяет процессор, на котором выполняющие задачи будут выполнять вызовы; говорят, что защищённый объект назначен этому процессору. Если значение CPU равно Not_A_Specific_CPU, то защищённый объект не назначен процессору. Вызов защищённого объекта, назначенного процессору, из задачи, не назначенной процессору или назначенной другому процессору, вызывает исключение Program_Error.
Рекомендации по реализации
Запуск защищённого действия на защищённом объекте, статически назначенном процессору, должен быть реализован без ожидания.