sttsのソースコードMemoブログ

色々やってみた結果のMemo

Linuxでプロセスの優先度を上げて、ずっと俺のターン

Linuxカーネル徹底理解に載っていた、Linuxで他のプロセスにCPUを使わせないぐらい優先度を上げる方法のメモです。

2008/02/15追記
わざわざコードを書かなくてもLinuxにスケジューリングを変更するコマンドが用意されていました。

chrt [options] [prio] [pid | command [arg]...]

Linuxカーネル徹底理解 (日経BPパソコンベストムック)

解説

Linuxでは、sched_setschedulerシステムコールを使いスケジューリングアルゴリズムや優先度を変更します。

sched_setscheduler(pid, policy, &spp)

選べるスケジューリングポリシーは、4つあります。

SCHED_FIFO 入出力待ちまで他に制御が移らない
SCHED_RR 入出力待ち以外にも時間切れで他のプロセスに制御が移る
SCHED_OTHER デフォルトのスケジューリングポリシー
SCHED_BATCH バッチ処理

入出力待ちをしないプロセスに、SCHED_FIFOを設定すると、ずっと俺のターンになります。

ソース

$ cat setRealTime.c
#include <stdio.h>
#include <stdlib.h>
#include <sched.h>
#include <sys/types.h>
#include <unistd.h>

int main (int argc, char *argv[]) {
        int i=0;
        int res=0;
        int policy = SCHED_FIFO;
        //int policy = SCHED_RR;
        //int policy = SCHED_OTHER;
        struct sched_param spp;
        int policy_max;
        pid_t pid;

        //pid = getpid();
        policy_max = sched_get_priority_max(policy);
        if (policy_max == -1) {
                perror("Error setscheduler");
                exit(99);
        } else {
                printf("policy_max=%d\n", policy_max);
        }
        spp.sched_priority = policy_max;
        for (i=1; i<argc; i++) {
                pid = atoi(argv[i]);
                printf("Set schedule. pid=%d\n", pid);
                if (pid <= 1) {
                        exit(98);
                }
                res = sched_setscheduler(pid, policy, &spp);
                if (res == -1) {
                        perror("Error setscheduler");
                        exit(99);
                }
        }
}

使い方

引数に、プロセスIDを指定します。
適度に入出力待ちをするプロセス以外のスケジューリングを変更してしまうと制御が戻ってこなくなって、何もできなくなってしまうので気をつけてください。
*1

*1:loopするだけのプロセスのスケジューリングを変更してシェルに制御が回らなくリセットしてしまいました。