Frage

Auf dem Linux-Kernel 2.6.28-11, ich bin mit setpriority vorzuspannen die Menge der CPU-Zeit unterschiedliche Benutzerprozesse erhalten. Benutzer 1 ist die doppelte CPU-Leistung von Benutzer zu empfangen 2. Linux setpriority verwenden, habe ich Benutzer zugewiesen 2 eine niedrigere Priorität (höher in Bezug auf die schönen Werte). Wenn ich genau das gleiche Programm über die Shell mit dem Computer unter Last ausführen, dauert zweimal Ausführung Benutzer 2 ist, solange Benutzer 1. Jedoch, wenn ich das Programm als Root ausgeführt, und dann setuid- verwenden, seteuid, Setgid, setegid und setgroups Benutzer werden 2 (wieder ist der Computer unter Last mit dem exakt gleichen Programm der ausgeführt wird durch den Benutzer 1 in derselben Art und Weise) , nehmen Sie die Programme, die genau die gleiche Menge an Zeit auszuführen; Benutzer 2 des Prozess wurde nicht weniger als 1 den Benutzer geplant werden. Wie kann ich das umgehen? Muß ich Satz noch etwas für den Scheduler zu erkennen, dass der Prozess nun Teil eines anderen Benutzers ist?

Das Programm abgearbeitet wird in Python.

War es hilfreich?

Lösung

Richtig, das ist das Verhalten ausgelegt, auch wenn es nicht das, was Sie wollen. Sie können Ihre eigene Priorität übereinstimmen aktualisieren, was Sie geerbt haben sollte, wenn man normal gestartet wurden:

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

oder natürlich Sie anderen Prozesses Priorität beheben könnte, mit den entsprechenden Berechtigungen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top