Domanda

sul kernel 2.6.28-11 Linux, sto usando setpriority per polarizzare la quantità di tempo di CPU differenti processi utente ricevono. Utente 1 è quello di ricevere il doppio della potenza della CPU dell'utente 2. Utilizzo setpriority di Linux, ho assegnato all'utente 2 una priorità più bassa (più alta in termini di valori belle). Quando si esegue lo stesso programma esatto mediante il guscio con il computer sotto carico, l'esecuzione di utente 2 prende due volte finchè utente 1 di. Tuttavia, se si esegue il programma come root, e quindi utilizzare setuid, seteuid, setgid, setegid e setgroups diventare utente 2 (ancora una volta il computer è sotto carico con l'esatto stesso programma eseguito dallo utente 1 nello stesso modo) , i programmi prendono la stessa esatta quantità di tempo di esecuzione; processo di utente 2 di non veniva prevista alcuna meno di 1 utente del. Come posso ottenere intorno a questo? Ho bisogno di impostare qualsiasi altra cosa per lo scheduler per rendersi conto che il processo è ora parte di un altro utente?

Il programma è in esecuzione in Python.

È stato utile?

Soluzione

A destra, questo è il comportamento progettato, anche se non è quello che vuoi. È possibile aggiornare il proprio priorità a corrispondere a ciò che si dovrebbe avere ereditato, se sono stati avviati normalmente:

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

O, naturalmente, si potrebbe risolvere la priorità di un altro processo, con i privilegi appropriati.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top