1 votes

La planification de groupe Linux pour l'utilisateur n'est pas appliquée au processus setuid-ed

Sur le noyau Linux 2.6.28-11, j'utilise setpriority pour biaiser la quantité de temps cpu que les différents processus utilisateurs reçoivent. L'utilisateur 1 doit recevoir le double de la puissance CPU de l'utilisateur 2. En utilisant setpriority de Linux, j'ai assigné à l'utilisateur 2 une priorité inférieure (supérieure en termes de valeurs agréables). Lorsque j'exécute exactement le même programme via le shell avec l'ordinateur sous charge, l'exécution de l'utilisateur 2 prend deux fois plus de temps que celle de l'utilisateur 1. Cependant, si j'exécute le programme en tant que Root, puis que j'utilise setuid, seteuid, setgid, setegid et setgroups pour devenir l'utilisateur 2 (une fois encore, l'ordinateur est sous charge et le même programme est exécuté par l'utilisateur 1 de la même manière), les programmes mettent exactement le même temps à s'exécuter ; le processus de l'utilisateur 2 n'est pas moins planifié que celui de l'utilisateur 1. Comment puis-je contourner ce problème ? Dois-je définir autre chose pour que le planificateur réalise que le processus fait maintenant partie d'un utilisateur différent ?

Le programme exécuté est en Python.

2voto

ephemient Points 87003

C'est vrai, c'est le comportement prévu, même si ce n'est pas ce que vous voulez. Vous pouvez mettre à jour votre propre priorité pour qu'elle corresponde à celle dont vous auriez dû hériter, si vous aviez commencé normalement :

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

Ou bien, bien sûr, vous pouvez fixer la priorité d'un autre processus, avec les privilèges appropriés.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X