operación no permitida al establecer una nueva prioridad para el hilo
Frecuentes
Visto 21,959 veces
7
He creado dos hilos. Por defecto tienen una prioridad de 0
que puedo ver usando pthread_getschedparam y luego trato de aumentar su prioridad para decir 2
y 3
respectivamente Pero cuando intento hacerlo, aparece un error.
error setting priority for T1: (1), Operation not permitted
error setting priority for T2: (1), Operation not permitted
He utilizado la política de programación de SCHED_RR
para ellos
int sched = SCHED_RR;
y luego realizó esto: -
if (pthread_setschedparam(t1, sched, &t1_param) != 0)
{
std::cout << "error setting priority for T1: (" << errno << "), " <<
strerror(errno) << std::endl;
}
¿Cuál es la razón por la que no puedo modificar la prioridad de mis subprocesos porque la prioridad está dentro del límite de 1
a 99
para SCHED_RR.
4 Respuestas
12
DESCARGO DE RESPONSABILIDAD: no soy un experto en seguridad de Linux, y los siguientes consejos pueden comprometer o dañar su computadora.
En versiones recientes de Linux, hay un límite de recursos, RLIMIT_RTPRIO
, que especifica la máxima prioridad en tiempo real que puede usar. Puedes verificar esto desde el shell:
> ulimit -r
0
En mi versión de Ubuntu (y probablemente también en la tuya) también hay un límite estricto de cero, por lo que no puedes simplemente usar ulimit
or setrlimit
para subir esto. Una forma de aumentar el límite estricto es agregar una línea a /etc/security/limits.conf
así (reemplazando <username>
con tu nombre de usuario):
<username> hard rtprio 99
Entonces deberías poder usar ulimit
(de la cáscara) o setrlimit
(desde su programa) para establecer el límite suave a la prioridad que necesita; alternativamente, puede configurarlo automáticamente agregando una segunda línea a limits.conf
, reemplazando hard
con soft
.
> ulimit -Hr # show hard limit
99
> ulimit -r
0
> ulimit -Sr 1 # set soft limit
> ulimit -r
1
Tenga cuidado al ejecutar programas con prioridad en tiempo real; puede matar el sistema si comienza a comportarse mal.
contestado el 22 de mayo de 12 a las 17:05
2
Vea este artículo para una explicación.
De forma predeterminada, las tareas de usuario en Linux tienen la política de programación SCHED_OTHER
. Para cambiar eso a una política en tiempo real (es decir, SCHED_RR
como está intentando hacer), necesita ser root. Podría intentar ejecutar su programa como root para verificar esto.
(También tenga en cuenta que este artículo está un poco desactualizado: Linux 2.2. Es posible que desee investigar esto para ver si el comportamiento ha cambiado en los kernels más nuevos)
contestado el 22 de mayo de 12 a las 16:05
ejecutar el programa desde la raíz del ID de usuario tampoco funciona. Escribí el mismo programa con el ID de usuario root y lo ejecuté, pero no funciona. Invictus
Hmm... Consulte "Privilegios y límites de recursos" en la página de manual para sched_setscheduler para una discusión de cómo cambiaron las políticas en el kernel 2.6. Es posible que desee examinar los valores actuales y máximos para RLIMIT_RTPRIO
usar getrlimit()
para ver si eso te está calentando? - bjlaub
0
puedes probar con SCHED_BATCH
?
Es posible que lo anterior no requiera permisos de root
contestado el 22 de mayo de 12 a las 16:05
0
Otra razón por la que esta llamada falla si es root y trabaja dentro de los límites es cgroups, consulte: https://unix.stackexchange.com/a/511261/232485
Respondido el 13 de junio de 19 a las 15:06
No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas c++ pthreads or haz tu propia pregunta.
¿Qué plataforma/SO estás usando? - bjlaub
Estoy usando Linux ubuntu 3.0.0-12-generic #20-Ubuntu SMP Vie Oct 7 14:50:42 UTC 2011 i686 i686 i386 GNU/Linux - Invictus
De acuerdo con el programa de ejemplo en el página man, debe ser root para establecer la prioridad de programación. - Adam Rosenfield
Hice sudo -i y me convertí en usuario root y ejecuté el programa, pero no funciona para mí ... sigue siendo el mismo error - Invictus