operación no permitida al establecer una nueva prioridad para el hilo

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.

preguntado el 22 de mayo de 12 a las 16:05

¿Qué plataforma/SO estás usando? -

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 -

De acuerdo con el programa de ejemplo en el página man, debe ser root para establecer la prioridad de programación. -

Hice sudo -i y me convertí en usuario root y ejecuté el programa, pero no funciona para mí ... sigue siendo el mismo error -

4 Respuestas

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

Cuando corro ulimit -Hr, el valor sigue siendo 0 en Ubuntu 16.04. También intenté volver a abrir la terminal, pero sin efecto. - gsamaras

Descubrí que tenía que configurar <username> hard rtprio 99 y <username> soft rtprio 99 y reiniciar para que funcione. - Den-Jason

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

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

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 or haz tu propia pregunta.