2017-01-31 2 views
2

Linuxカーネルは、リアルタイムプロセスのスケジューリングのデフォルトスケジューリングアルゴリズムとしてCompletely Fair Scheduling (SCHED_NORMAL)アルゴリズムを実装しています。Linuxデフォルトスケジューラの代替

デフォルトスケジューリングポリシーがround-robin (SCHED_RR)または他のスケジューリングポリシーに設定されているようにLinuxカーネルを変更するにはどうすればよいですか?これを行う一般的な方法はありますか?ここで正確にどのファイルを変更する必要がありますか?

私はUbuntu 16.04で作業しています。

+0

本当にすべてのプロセスのスケジューリングを変更したいのですか、または単一プロセスのリアルタイムスケジューリングのみを有効にしますか? – koalo

+0

単一のプロセスでは、 'sched_setscheduler()'関数を使ってスケジューリングポリシーを簡単に変更できます。すべてのプロセスのスケジューリングを変更したいと思います。 @koalo – Jarvis

+0

あなたは[Unix&Linux Stack Exchange](http://unix.stackexchange.com)でより良い回答を得るでしょうか? – torkleyy

答えて

2

これはちょうど実験であることを私に教えてください:)私は本当にそのような異端を試みることから出てくる良いものは本当に見ることができません。

これは私の試しです。まず、サンドボックスを取得する必要があります。私はUser Mode Linux(UML)を使用しました。カーネルの場合、私はランダム4.10.0-rc1レポを取得しましたが、どのバージョンでも可能です。 rootfsの場合、UMLページにはhere(ピットフォール:すべて正常に動作するわけではありません)の束が用意されています。カーネルを構築する

手順は非常に短いです:あなたはSlackwareのrootfsのを持っている場合

export ARCH=um 
make x86_64_defconfig 
make 

、あなたが今のように実行することができます:クール

./vmlinux ubda=./Slamd64-12.1-root_fs 

OK、。そこで、私たちはいくつかのカーネルを破る安全な場所を持っています。それに行きましょう。ご存じのように、init(pid = 1)は、最初のプロセスであり、他のすべてのプロセスの親です。 RTスケジューリングクラスは継承されています(フラグが指定されていない場合は、man 7 schedのSCHED_RESET_ON_FORKを参照)。つまり、initプロセスのスケジューリングクラスを変更し、その子プロセスがデフォルトでスケジューリングクラスを継承するようにすることができます。

diff --git a/init/main.c b/init/main.c 
index b0c9d6facef9..015f72b318ef 100644 
--- a/init/main.c 
+++ b/init/main.c 
@@ -951,8 +951,11 @@ static inline void mark_readonly(void) 

static int __ref kernel_init(void *unused) 
{ 
+  struct sched_param param = { .sched_priority = MAX_RT_PRIO - 1 }; 
     int ret; 

+  /* Sit tight and fasten your seat belt! */ 
+  sched_setscheduler_nocheck(current, SCHED_FIFO, &param); 
     kernel_init_freeable(); 
     /* need to finish all async __init code before freeing the memory */ 
     async_synchronize_full(); 

そして、それは動作します:

これは、このようなもので簡単になんとかです! (man 7 schedに述べたような方法により、SCHED_DEADLINEは、継承することができない)

[email protected]:~# sleep 60 & 
[1] 549 
[email protected]:~# ps -c 
    PID CLS PRI TTY   TIME CMD 
    536 FF 139 tty0  00:00:00 bash 
    549 FF 139 tty0  00:00:00 sleep 
    550 FF 139 tty0  00:00:00 ps 

0

私はカーネルコードを見て、実際にはいくつかの場所でSCHED_NORMALがハードコードされています。 https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/tree/kernel/sched/core.c#n2394

すべての場所でSCHED_RRに変更することは可能かもしれませんが、コメントに書かれているように、そのことはお勧めしません。たとえば、長時間実行される計算がCPUをブロックするなど、システムがクラッシュする可能性があります。