viernes, 5 de marzo de 2010

sys_nice( )




Prioridades Estáticas


Cuando se crea un proceso de usuario, se le asocia una prioridad base igual a la del proceso padre. Esta prioridad es denominada Prioridad Estática, ya que es la que tendrá este nuevo proceso a lo largo de su vida.

El nivel de prioridad al que pertenecen estos procesos es almacenado en el campo static_prio de la estructura task_t.


typedef struct task_struct task_t;

struct task_struct
{
prio_array_t *array; // Array de prioridades en el que está
struct list_head run_list; // Puntero a la siguiente tarea en el Array de prioridades
int prio; // Prioridad efectiva del proceso
int static_prio; // Prioridad estática del proceso
unsigned int time_slice; // Tiempo de ejecución
unsigned long sleep_avg; // Tiempo medio que pasa suspendido
volatile long state; // Estado del proceso
int activated; // Estado en el que estaba suspendido
unsigned long rt_priority; // Prioridad en tiempo real
unsigned long policy; // Esquema de planificación
cpumask_t cpus_allowed; // CPUs permitidas para este proceso
spinlock_t switch_lock; // Lock para los cambios de contexto.
struct thread_info *thread_info; // Acceso eficiente al Descriptor de Proceso.
struct sched_info sched_info; // Estadísticas a nivel de proceso.
};



Llamada al sistema SYS_NICE()

Es posible modificar la prioridad estática de un proceso de usuario mediante la llamada al sistema nice(). Al invocarla, se ejecuta en kernel/sched.c el método sys_nice(), el cual, aparte de algunas comprobaciones, llama a set_user_nice(). Esta función establece la nueva Prioridad Estática del proceso y actualiza su posición en el Array de Prioridades.

Sin embargo, en esta llamada al sistema, el valor de la nueva prioridad introducido como parámetro, no es uno de los 40 niveles de prioridad en el que se ejecutan los procesos de usuario, sino una conversión al rango [-19..0..20].

Los valores de este nuevo rango se denominan también nice. De esta manera, los procesos con mayor prioridad serán aquellos que tengan un nice negativo, mientras que los positivos tendrán menor prioridad (solo el superusuario puede asignar valores negativos de nice).
Se puede consultar el nice de un proceso de usuario, a través de las funciones task_nice() y task_prio() en kernel/sched.c.

Cabe destacar que nice() sólo afecta a los procesos de usuario.



Sintaxis

#include
int nice(int inc);



Valor de regreso

(-1 ) - Si ocurre algún error.
(NewNiceValue) - Si se realizo correctamente.


Ejemplo

#inlude
#include

int main()
{
int ret=9;
int incr = 6;

printf(”\tEJEMPLO NICE\n\nValor nice: %d\n”, ret);
ret = nice(incr);
printf(”Valor nice nuevo: %d”, ret);
}




Referencias

http://eprints.ucm.es/8867/1/memoria.pdf
http://sopa.dis.ulpgc.es/ii-dso/leclinux/interrupciones/system_call/LEC2_INT_SOFT.pdf
http://www.kernel.org/doc/man-pages/online/pages/man2/nice.2.html

No hay comentarios:

Publicar un comentario