Pergunta

No kernel Linux 2.6.28-11, estou usando o SetPriority para influenciar a quantidade de tempo de CPU que diferentes processos do usuário recebem. O usuário 1 deve receber o dobro da potência da CPU do usuário 2. Usando o setPriority do Linux, atribuí o usuário 2 uma prioridade mais baixa (maior em termos de valores interessantes). Quando executo exatamente o mesmo programa através do shell com o computador sob carga, a execução do usuário 2 leva o dobro do tempo que o Usuário 1. No entanto, se eu executar o programa como root, e depois usar setuid, setEuid, setGid, setEgid e SetGroups para se tornar o usuário 2 (mais uma vez o computador está sob carga com o mesmo programa que está sendo executado pelo usuário 1 da mesma maneira) , os programas levam exatamente a mesma quantidade de tempo para executar; O processo do usuário 2 não estava sendo agendado menos que o usuário 1. Como posso resolver isso? Preciso definir mais alguma coisa para o agendador perceber que o processo agora faz parte de um usuário diferente?

O programa que está sendo executado está em Python.

Foi útil?

Solução

Certo, esse é o comportamento projetado, mesmo que não seja o que você deseja. Você pode atualizar sua própria prioridade para corresponder ao que deveria ter herdado, se foi iniciado 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())))

Ou, é claro, você pode corrigir a prioridade de outro processo, com privilégios apropriados.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top