1

在 2.6.28-11 Linux 内核上,我使用 setpriority 来调整不同用户进程接收的 cpu 时间量。用户 1 将获得用户 2 的两倍 CPU 功率。使用 Linux 的 setpriority,我为用户 2 分配了较低的优先级(在 nice 值方面较高)。当我在计算机负载下通过 shell 运行完全相同的程序时,用户 2 的执行时间是用户 1 的两倍。但是,如果我以 root 身份运行程序,然后使用 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 回答