SCHED_DEADLINE
is a CPUscheduler available in theLinux kernel since version 3.14,[1][2] based on theearliest deadline first (EDF) and constant bandwidth server (CBS)[3] algorithms, supporting resource reservations: each task scheduled under such policy is associated with abudget Q (akaruntime), and aperiod P, corresponding to a declaration to the kernel that Q time units are required by that task every P time units, on any processor. This makesSCHED_DEADLINE
particularly suitable forreal-time applications, like multimedia or industrial control, where P corresponds to the minimum time elapsing between subsequent activations of the task, and Q corresponds to the worst-case execution time needed by each activation of the task.
The Linux kernel contains different scheduler classes.[4] By default, the kernel uses a scheduler mechanism called theCompletely Fair Scheduler (CFS) introduced in the 2.6.23 version of the kernel.[5] Internally, this default scheduler class is also known asSCHED_NORMAL
, and the kernel also contains two POSIX-compliant[6] real-time scheduling classes namedSCHED_FIFO
(realtimefirst-in-first-out) andSCHED_RR
(realtimeround-robin) both of which take precedence over the default class.[4] TheSCHED_DEADLINE
scheduling class was added to the Linux scheduler in version 3.14 of theLinux kernel mainline, released on 30 March 2014,[7][8]and takes precedence over all the other scheduling classes.
The default scheduler, CFS, makes a very good job in coping with different use cases. For example, when mixing batch workloads such as long-running code compilations or number crunching, and interactive applications such as desktop applications, multi-media or others, the CFS dynamically de-prioritizes batch tasks in favour of interactive ones. However, when an application needs a predictable and precise schedule, normally it has to recur to one of the other real-time schedulers, SCHED_RR or SCHED_FIFO, which apply fixed-priority to schedule tasks by priorities, and whose tasks are scheduled before any task in the SCHED_NORMAL class.
When mixing real-time workloads with heterogeneous timing requirements on the same system, a well-known problem ofSCHED_RR
andSCHED_FIFO
is that, as these are based on tasks priorities, higher-priority tasks running for longer than expected may arbitrarily delay lower-priority tasks in an uncontrolled way.
WithSCHED_DEADLINE
, instead, tasks declare independently their timing requirements, in terms of a per-taskruntime needed every per-taskperiod (and due within a per-taskdeadline since each period start), and the kernel accepts them in the scheduler after a schedulability test. Now, if a task tries to run for longer than its assigned budget, the kernel will suspend that task and defer its execution to its next activation period. Thisnon-work conserving property of the scheduler allows it to providetemporal isolation among the tasks. This results in the important property that, on single-processor systems, or on partitioned multi-processor systems (where tasks are partitioned among available CPUs, so each task is pinned down on a specific CPU and cannot migrate), all acceptedSCHED_DEADLINE
tasks are guaranteed to be scheduled for an overall time equal to their budget in every time window as long as their period, unless the task itself blocks and doesn't need to run. Also, a peculiar property of the CBS algorithm is that it guarantees temporal isolation also in presence of tasks blocking and resuming execution: this is done by resetting a task scheduling deadline to a whole period apart, whenever a task wakes up too late. In the general case of tasks free to migrate on a multi-processor, asSCHED_DEADLINE
implements global EDF, the general tardiness bound for global EDF applies, as explained in.[9]
In order to better understand how the scheduler works, consider a set ofSCHED_DEADLINE
tasks with potentially different periods, having the deadline equal to the period. For each task, in addition to the configured runtime and (relative) period, the kernel keeps track of acurrent runtime and acurrent (absolute) deadline. Tasks are scheduled on CPUs based on their current deadlines, using global EDF. When a task scheduling policy is initially set toSCHED_DEADLINE
, the current deadline is initialized to the current time plus the configured period, and the current budget is set equal to the configured budget. Each time a task is scheduled to run on any CPU, the kernel lets it run for at most the available current budget, and whenever the task is descheduled its current budget is decreased by the amount of time it has been run. Once the current budget goes to zero, the task is suspended (throttled) till the next activation period, when the current budget is refilled again to the configured value, and the deadline is moved forward by a value equal to the task period.
This is not sufficient to guaranteetemporal isolation. A task suspending itself shortly after its activation, and then waking up close to its current deadline or even beyond, would wake up with nearly the whole of its configured budget, with a current deadline that is very close to expire, or even in the past. In such condition, that task would be scheduled before any other one, and on a single-processor system it would be able to delay execution of any other deadline task for as long as its budget. In order to avoid this problem,SCHED_DEADLINE
adopts the wake-up scheduling rule defined in the CBS algorithm. When a task wakes up, if a relatively small time has elapsed since the task blocked, then the previous current deadline and budget are kept unchanged for the task. However, if an excessive amount of time has elapsed, then the kernel resets the current deadline to the current time plus the reservation period, and the current budget to the allocated reservation budget. For a longer explanation with examples, see.[9]
On a multi-processor or multi-core system,SCHED_DEADLINE
implements global EDF, so tasks are able to migrate across available CPUs. In such a case, the configured budget is the total cumulative amount of time the task is allowed to run on any CPU during each period. However, the scheduler also respects tasks'affinity masks, so one can easily create partitioned scheduling scenarios, partitioning tasks in groups where each group is restricted to a specific CPU, or clustered scheduling scenarios, obtained by also partitioning CPUs and each tasks partition is pinned down to a specific CPUs partition.
For technical details aboutSCHED_DEADLINE
, refer to the documentation available within the kernel source tree.[9]For further details on the CBS and how it enables temporal isolation, refer to the original CBS paper,[3] or the section about the CBS in this article[10] appeared on lwn.net.
The initial idea of a Linux scheduling class based on the Earliest Deadline First (EDF) algorithm was born in the small context of the Real-Time Systems (ReTiS) Lab ofScuola Superiore Sant'Anna[11] and its Spin-Off company Evidence Srl.[12] Then, Evidence Srl leveraged the funding of the ACTORS project,[13][14] supported by theEuropean Commission through the FP7 framework programme, for financing and promoting the development of the first versions of the patch.The original version has been developed by Dario Faggioli (contract by Evidence Srl for the development of the first three versions) and Juri Lelli (since the fourth version)[15] with sporadic help from Michael Trimarchi and Fabio Checconi. Johan Eker has been in charge of coordination within ACTORS and supporting from Ericsson. Juri Lelli, Luca Abeni and Claudio Scordino have collaborated to the development of the reclaiming (i.e. GRUB[16]) and frequency-scaling (i.e. GRUB-PA[17]) features.
The patch has been periodically released to the kernel community through theLinux kernel mailing list (LKML). Each release aligned the code to the latest version of the kernel and took into account comments received at the previous submission.As the popularity of the scheduler increased, a higher number of kernel developers started providing their feedback and their contribution.
The project was originally calledSCHED_EDF
and presented to the Linux kernel community in 2009.[18] With this name was also presented to the Real-Time Linux Workshop after a few weeks.[19] The name has been then changed to SCHED_DEADLINE after the request of the Linux kernel community.[20]
In the course of the years, the following versions have been released:
SCHED_EDF
.[18]SCHED_DEADLINE
was submitted to LKML on October 16, 2009.[21]Articles onLinux Weekly News[31] andPhoronix[32] websites argued thatSCHED_DEADLINE
may be merged into the mainline kernel in the very next releases. Finally, after more than four years and the submission of nine releases, the patch has been accepted and merged into the Linux kernel 3.14.[7][8]
Before SCHED_DEADLINE, the Real-Time Systems (ReTiS) Lab[11] ofScuola Superiore Sant'Anna had provided various other open-source implementations of CBS and its variants within the Linux kernel, in the context of other European research projects, including OCERA,[33] theAQuoSA architecture within the FRESCOR project,[34] and IRMOS.[35] However, these prior efforts started with an academic approach where the main aim was to gather experimental results for research projects, rather than providing an implementation suitable for integration within the mainline kernel. With IRMOS, the lab had a first serious contact with Linux kernel developers.[10]
Since kernel 4.13, SCHED_DEADLINE completed[36] CBS with the Greedy Reclamation of Unused Bandwidth (GRUB) algorithm.[37] The support has been developed by ReTiS Lab with the collaboration of Evidence Srl.
Since kernel 4.16, SCHED_DEADLINE has been further evolved to reduce energy consumption on ARM platforms by implementing the GRUB-PA algorithm.[17] The work has been done by ARM Ltd. in collaboration with Evidence Srl and Scuola Superiore Sant'Anna.[38]
SCHED_DEADLINE
has been presented through some academic workshops, conferences and journals:
The project has been also presented at the Kernel Summit in 2010,[49][50] at the Linux Plumbers Conference 2012,[51][52] and at the Embedded Linux Conference 2013.[53]
The project has an official page.[54] Before mainline integration, the code used to be publicly available on a GitHub website,[55] which replaced the previous repository on Gitorious.[56] Since mainline integration, the official code is included in the Linux kernel source tree.
Several articles have appeared onLinux Weekly News,[1][57]Slashdot,[58] OSNews[2][59] and LinuxToday.[60]A video has been uploaded on YouTube[61] as well.
Before integration in the mainline kernel,SCHED_DEADLINE
was already integrated into theYocto Project.[28]and there had also been some interest for inclusion inLinaro projects.[62]