デッドラインスケジューリングポリシー(SCHED_DEADLINE)とは
SCHED_DEADLINEは、Linux 3.14で導入されたリアルタイムスケジューリングポリシー。
デッドライン駆動型のスケジューリングを実現する。
タスクごとに、
- 実行時間(Runtime)
- デッドライン(Deadline)
- 周期(Period)
を指定し、期限内に処理が完了するよう管理する。
ハードリアルタイム性が求められる自動運転、ロボティクス、金融取引などの分野で有用。
SCHED_FIFOやSCHED_RRよりも精密なスケジューリングが可能で、Linux上でリアルタイム制御を実現する選択肢の一つ。
スケジューリングポリシーごとの優先度
スケジューリングポリシー | 概要 |
---|---|
SCHED_DEADLINE | 最高優先度。指定した期限内に処理が完了するよう管理 |
SCHED_FIFO | 優先度が高いタスクが終了するまで CPU を独占。固定優先度 |
SCHED_RR | SCHED_FIFO と同じ優先度だが、一定時間ごとに CPU を譲る(ラウンドロビン方式)。 |
SCHED_OTHER(CFS) | Linux におけるデフォルト優先度。各プロセスに平等にCPU時間を割り当てる |
サンプル
コード(参考文献より引用)
#include<linux/sched.h>
#include<linux/sched/types.h>
#include<memory.h>
#include<stdio.h>
#include<unistd.h>
#include<sys/syscall.h>
int sched_setattr(pid_t pid, const struct sched_attr *attr, unsigned int flags)
{
return syscall(__NR_sched_setattr, pid, attr, flags);
}
int main(int argc, char **argv){
struct sched_attr attr;
memset(&attr, 0, sizeof(attr));
attr.size = sizeof(attr);
attr.sched_policy = SCHED_DEADLINE;
attr.sched_runtime = 500000;
attr.sched_deadline = 900000;
attr.sched_period = 10000000;
if ( sched_setattr(0, &attr, 0)) {
perror("sched_setattr");
return 1;
}
for(;;){
printf("test\n");
}
return 0;
}
実行結果
$ gcc sample.c
$ sudo ./a.out
$ ps -eo 'pid,class,comm'
PID CLS COMMAND
・
・
28972 TS sudo
28973 DLN a.out
29041 TS ps
CLS が DLN (デッドライン) として動作していることが確認できる。
参考文献