1

2.6.28-11 Linux カーネルでは、setpriority を使用して、さまざまなユーザー プロセスが受け取る CPU 時間の量にバイアスをかけています。ユーザー 1 は、ユーザー 2 の 2 倍の CPU パワーを受け取ります。Linux の setpriority を使用して、ユーザー 2 に低い優先度 (nice 値の点で高い) を割り当てました。負荷がかかっているコンピューターでシェルを介してまったく同じプログラムを実行すると、ユーザー 2 の実行にユーザー 1 の 2 倍の時間がかかります。ただし、プログラムをルートとして実行し、setuid、seteuid、setgid、setegid、および setgroups を使用してユーザー 2 になると (もう一度、ユーザー 1 がまったく同じプログラムを同じ方法で実行して、コンピューターに負荷がかかります)。 、プログラムの実行にはまったく同じ時間がかかります。ユーザー 2 のプロセスは、ユーザー 1 よりも少なくスケジュールされていませんでした。どうすればこれを回避できますか? プロセスが別のユーザーの一部であることをスケジューラが認識できるようにするには、他に何か設定する必要がありますか?

実行中のプログラムは Python です。

4

1 に答える 1

2

そうです、これは設計された動作です。たとえそれがあなたが望むものでなくても。通常どおりに開始した場合は、継承する必要があるものと一致するように独自の優先度を更新できます。

/* C */
#include <sys/resource.h>
int proc_prio = getpriority(PRIO_PROCESS, getpid()),
    pgrp_prio = getpriority(PRIO_PGRP, getpgrp()),
    user_prio = getpriority(PRIO_USER, getuid());
setpriority(PRIO_PROCESS, getpid(),
    proc_prio < pgrp_prio ? pgrp_prio < user_prio ? user_prio
                                                  : pgrp_prio
                          : proc_prio < user_prio ? user_prio
                                                  : proc_prio);

# Python
import ctypes
import os
PRIO_PROCESS, PRIO_PGRP, PRIO_USER = 0, 1, 2
libc = ctypes.CDLL('libc.so.6')
libc.setpriority(PRIO_PROCESS, os.getpid(),
    max(libc.getpriority(PRIO_PROCESS, os.getpid()),
        libc.getpriority(PRIO_PGRP, os.getpgrp()),
        libc.getpriority(PRIO_USER, os.getuid())))

またはもちろん、適切な特権を使用して、別のプロセスの優先順位を修正することもできます。

于 2009-12-17T21:48:16.600 に答える