目录
1 背景
在Linux操作系统中,进程调度负责在并发运行的进程之间,合理分配CPU资源,是Linux内核的核心功能之一。进程调度决定了系统的整体性能,合理的进程调度能够确保系统的响应速度,提供良好的用户体验,还能够实现资源的有效利用,充分发挥CPU的性能。
进程任务在运行过程中根据其特性有不同的要求,有的对吞吐量要求高,有的对延指标要求高,有的长时间占用CPU资源,有的长时间占用网络资源。Linux内核提供了多种调度器,以满足不同场景下的任务需求。主要有Deadline调度器、实时调度器、公平调度器等,本文主要解析Deadline调度器的原理和使用方式。
Deadline调度算法是实时调度算法的重要成员,核心原则是根据任务的截止时间来分配优先级。截止时间越早,任务优先级越高,就越优先被调度执行。该算法的实现机制精巧。当系统中有新任务到达,调度器会依据任务的截止时间设置调度顺序。调度器维护一个按截止时间排序的任务队列,每次调度时,从队列头部选取截止时间最早的任务执行。在执行过程中,若有新任务加入且其截止时间比当前执行任务更早,调度器会立即暂停当前任务,执行新任务。
Deadline调度算法适合实时性要求高、任务数量多的场景。在工业自动化中、自动驾驶、多媒体实时播放、音视频流处理、交通、医疗等领域都有着极高的应用场景。Deadline调度算法也面临挑战,系统过载时,无法保证所有任务按时完成。
管理人员在使用Deadline算法时需要合理的规划调度器的使用,结合准入控制机制,合理拒绝无法按时执行的任务、设置任务截止时间不合理的任务。为了避免进程使用Deadline调度时过载,Deadline调度器有一个准入机制,在任务配置好了period、runtime和deadline参数之后并准备加入到系统的时候,Deadline调度器会对该任务进行评估,只有评估通过的进程才允许添加到调度队列中,否则会被拒绝。
Deadline调度器任务优先级的确定
Deadline调度器判断任务重要性的标准就是任务的截止时间。任务创建时,调度器会获取其截止时间信息,并将其作为优先级分配的核心依据。类似于快递包裹上标着“限时30分钟送达”时,自然会被快递处理人员赋予高优先级。
2 Deadline调度器任务优先级的确定
Deadline调度器判断任务重要性的标准就是任务的截止时间。任务创建时,调度器会获取其截止时间信息,并将其作为优先级分配的核心依据。类似于快递包裹上标着“限时30分钟送达”时,自然会被快递处理人员赋予高优先级。
3 Deadline调度器任务队列管理
Deadline调度器存在一个或者多个按照任务截止时间进行排序任务队列,任务创建时,会根据其截止时间插入到合适位置;当任务执行完毕或被移除时,队列会重新调整,确保截止时间顺序不变。
4 Deadline调度器执行过程
Deadline调度器从任务队列头部选取任务,将CPU资源分配给任务并执行。在任务执行期间,调度器时刻监控是否有优先级更高的任务,如果有调度器会立即触发抢占机制。Deadline调度器通常采用抢占式调度策略,以应对突发的紧急任务。
5 Deadline调度器准入条件
为保证任务能够在规定的时间内完成。Deadline调度器使用带宽来判断。带宽的判断方法如下:
每个任务通过 任务deadline(scheduling deadline)与任务剩余的运行时间(remaining runtime)来描述任务使用时间的情况。当任务被唤醒时,系统会对该任务做以下校验:
- 校验任务是否已经错过了当前deadline(scheduling deadline < now);
- 校验带宽是否溢出,即在当前period中,CPU是否已经无法满足该任务的带宽要求(remaining runtime / (scheduling deadline - now) > runtime / period)。
如果二者都不成立,则说明该任务状态良好,否则则说明该任务已经无法在当前period内按时完成了,需要将其往后顺移。调度器会对其状态做如下修改(scheduling deadline = now + deadline remaining runtime = runtime)。
当 remaining runtime <= 0 时,任务已经没法在deadline完成,此时该任务的状态会被设置为throttled, 调度器将暂停对其进行调度。调度器会重新设置调度时间。
6 Deadline调度器控制参数
Deadline调度器专注于队任务截止时间有要求的实时任务,满足任务的时间期限要求,确保任务在截止时间之前完成执行。Deadline调度器采用最早截止时间优先(EDF,Earliest Deadline First)算法和恒定带宽服务器(CBS,Constant Bandwidth Server)算法来确定任务的执行顺序和调度行为。可以用在工业控制系统、航空航天、金融交易系统等对时间精度要求极高的领域,够为这些关键系统提供稳定可靠的时间保障。
Deadline调度器主要有三个控制参数:runtime,period,deadline。Runtime表示任务在一个周期内的运行时间;period标识运行周期的长短;deadline表示任务在运行周期内最晚完成的时间。可以通过chrt指令设置这三个参数。如
chrt -d --sched-runtime 5000000 --sched-deadline 10000000 \ --sched-period 16666666 0 test_deadline
-d参数表示设置的调度策略是Deadline调度器。0为优先级占位符,chrt命令所需,deadline调度器并不使用,其它的对应runtime、deadline和period,单位都是纳秒。通过这样的配置,在每16毫秒的周期内,分配给该任务5毫秒的CPU运行时间,而且这个5毫秒的CPU时间会在10毫秒内的截止时间之前完成。
7 Deadline调度器的使用方法
为进程设置Deadline调度器的时候,需要合理规划当前进行的调度能力。如果使用实时调度进程数量少于CPU核心数量,可以简单的设置进程的调度器就可以了;如果使用实时调度进程数量多于CPU的核心数量,就需要管理人员合理的规划实时进程运行的CPU位置,必要时可以联合cpuset机制完成调度策略的设置。
启动进程的时候设置进程使用Deadline调度器
![]()
检测该进程是否使用Deadline调度器

通过sched_setattr函数设置进程为使用Deadline调度器
struct sched_attr attr;
unsigned int flags = 0;
attr.sched_policy = SCHED_DEADLINE;
attr.sched_runtime = 10 * 1000 * 1000;
attr.sched_period = attr.sched_deadline = 30 * 1000 * 1000;
sched_setattr(0, &attr, flags);
523

被折叠的 条评论
为什么被折叠?



