Version 1.3 of ai05s/ai05-0171-1.txt

Unformatted version of ai05s/ai05-0171-1.txt version 1.3
Other versions for file ai05s/ai05-0171-1.txt

!standard D.13.1(4/2)          10-02-23 AI05-0171-1/03
!standard D.16
!class Amendment 09-10-22
!status work item 09-10-22
!status received 09-10-22
!priority Medium
!difficulty Easy
!subject Ravenscar Profile for Multiprocessor Systems
!summary
The Ravenscar Profile, originally designed for single processors, has proven remarkably useful for modelling verifiable real-time single-processor systems. It can be extended to support multi-processor systems using a fully partitioned approach. The implementation of this scheme is simple, and it can be used to develop applications amenable to schedulability analysis.
!problem
The Ravenscar Profile defines a deterministic and analysable tasking model for single processors which can be supported with a run-time system of reduced size and complexity. For multi-processor systems, the Ravenscar Profile could be extended using a fully partitioned approach, with each task allocated statically to a concrete processor. This scheme could be supported by a streamlined run-time system, and applications built following this approach can apply timing analysis techniques on each processor separately.
!proposal
We propose to allow the implementation of the Ravenscar Profile on multi-processor systems following a fully partitioned approach.
The first part of the proposal is a general package that will be used by Ravenscar.
!wording
Add a new clause:
D.16 Multiprocessor Implementation
This clause allows implementations on multiprocessor platforms to be configured.
Syntax
The form of a pragma CPU is as follows:
pragma CPU (expression);
Name Resolution Rules
The expected type for the expression is Integer.
A CPU pragma is allowed only immediately within a task_definition, or the declarative_part of a subprogram_body. At most one such pragma shall appear within a given construct.
For a CPU pragma that appears in the declarative_part of a subprogram_body, the expression shall be static, and its value shall be in the range of System.Multiprocessors.CPU.
Static Semantics
The following language-defined library package exists
package System.Multiprocessors is type CPU_Range is range 0 .. <implementation-defined> subtype CPU is CPU_Range range 1 .. CPU_Range'last; function Number_Of_CPUs return CPU; end System.Multiprocessors;
Dynamic Semantics
A CPU pragma has no effect if it occurs in the declarative part of the subprogram_body of a subprogram other then the main subprogram.
The CPU value determines the processor on which the task will activate and execute. A task without a pragma will execute on the same processor as its activating task. It is implementation defined where the environment task executes.
A call of Number_Of_CPUs returns the number of processors available to the program.
---
Add to D.13.1(4/2) a new restriction:
No_Dependence => System.Multiprocessors.Dispatching_Policies;
--- Add after D.13.1(4/2):
Implementation Advice
On a multi-processor system, an implementation should support a fully partitioned approach, with each task allocated statically to a concrete processor and no task migration. Each processor should have separate and disjoint ready queues. A task should only be on the ready queues of one processor, and the processor to which a task belongs should be defined statically. Whenever a task running on a processor reaches a task dispatching point, it goes back to the ready queues of the same processor.
!discussion
Although there are many dispatching approaches that make use of task migration this significantly complicates the run-time and adds overheads. For Ravenscar and its focus on static properties it is in keeping to disallow migration. The scheduling problem for partitioned allocation is a combination of bin packing followed by single processor dispatching. These are known techniques and do not add complications to the Ravenscar model.
!example
A task type that defines worker tasks to be allocated to different CPUs would have the form:
task type Worker (W : integer) is pragma CPU(W); end Worker;
Alan : Worker(1);
--!corrigendum D.13.1(4/2)
!ACATS test
Add an ACATS C-Test of this package.
!appendix

****************************************************************



Questions? Ask the ACAA Technical Agent