문제

2.6.28-11 Linux 커널에서는 setpriority를 ​​사용하여 다양한 사용자 프로세스가 받는 CPU 시간의 양을 바이어스합니다.사용자 1은 사용자 2의 CPU 성능을 두 배로 받습니다.Linux의 setpriority를 ​​사용하여 사용자 2에게 더 낮은 우선순위(좋은 값 측면에서 더 높은 우선순위)를 할당했습니다.컴퓨터가 로드된 상태에서 셸을 통해 똑같은 프로그램을 실행하면 사용자 2의 실행 시간이 사용자 1의 실행 시간보다 두 배나 걸립니다.그러나 프로그램을 루트로 실행한 다음 setuid, seteuid, setgid, setegid 및 setgroups를 사용하여 사용자 2가 되면(다시 한번 컴퓨터는 사용자 1이 동일한 방식으로 실행하는 동일한 프로그램으로 로드 상태가 됩니다) , 프로그램을 실행하는 데 정확히 같은 시간이 걸립니다.사용자 2의 프로세스는 사용자 1의 프로세스보다 적게 예약되지 않았습니다.이 문제를 어떻게 해결할 수 있나요?프로세스가 이제 다른 사용자의 일부라는 것을 스케줄러가 인식하도록 하려면 다른 것을 설정해야 합니까?

실행중인 프로그램은 Python입니다.

도움이 되었습니까?

해결책

맞습니다. 이는 원하는 동작이 아니더라도 의도된 동작입니다.정상적으로 시작된 경우 상속해야 하는 우선순위와 일치하도록 자신의 우선순위를 업데이트할 수 있습니다.

/* 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())))

또는 적절한 권한을 사용하여 다른 프로세스의 우선순위를 수정할 수도 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top