これはちょうど実験であることを私に教えてください:)私は本当にそのような異端を試みることから出てくる良いものは本当に見ることができません。
これは私の試しです。まず、サンドボックスを取得する必要があります。私は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, ¶m);
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
。
本当にすべてのプロセスのスケジューリングを変更したいのですか、または単一プロセスのリアルタイムスケジューリングのみを有効にしますか? – koalo
単一のプロセスでは、 'sched_setscheduler()'関数を使ってスケジューリングポリシーを簡単に変更できます。すべてのプロセスのスケジューリングを変更したいと思います。 @koalo – Jarvis
あなたは[Unix&Linux Stack Exchange](http://unix.stackexchange.com)でより良い回答を得るでしょうか? – torkleyy