Pregunta

En el núcleo de Linux 2.6.28-11, estoy usando setpriority al sesgo de la cantidad de tiempo de CPU diferentes procesos de usuario reciben. El usuario 1 es para recibir el doble de la potencia de la CPU del usuario 2. Usando setpriority de Linux, he asignado por el usuario 2 una prioridad más baja (mayor en términos de valores agradables). Cuando funciono con el mismo programa exacto a través de la cáscara con el equipo bajo carga, la ejecución del usuario de 2 toma doble de tiempo que el usuario 1 de. Sin embargo, si ejecutar el programa como raíz, y luego usar setuid, seteuid, setgid, setegid, y setgroups para convertirse en usuario 2 (una vez más el ordenador está bajo carga con el mismo programa exacto que se ejecute por el usuario 1 de la misma manera) , los programas tienen exactamente la misma cantidad de tiempo para su ejecución; proceso de usuario de 2 no estaba siendo programada cualquier menos de usuario 1 de. ¿Cómo puedo evitar esto? ¿Es necesario establecer cualquier otra cosa para el programador para darse cuenta de que el proceso es ahora parte de un usuario diferente?

El programa que se está ejecutando es en Python.

¿Fue útil?

Solución

Bien, este es el comportamiento diseñado, incluso si no es lo que quiere. Puede actualizar su propia prioridad para que coincida con lo que debería haber heredado, si se iniciaron con normalidad:

/* 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, por supuesto, usted podría fijar la prioridad de otro proceso, con privilegios apropiados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top