Tareas en Linux · TASK_RUNNING (0): Indica que el proceso en cuestión se está ejecutando o listo para ejecutarse. En este segundo caso, el proceso dispone.

1 Tareas en Linux · TASK_RUNNING (0): Indica que el proce...
Author: Herminia Griego
0 downloads 0 Views

1 Tareas en Linux · TASK_RUNNING (0): Indica que el proceso en cuestión se está ejecutando o listo para ejecutarse. En este segundo caso, el proceso dispone de todos los recursos necesarios excepto el procesador. · TASK_ INTERRUPTIBLE (1) : el proceso está suspendido a la espera de alguna señal para pasar a listo para ejecutarse. Generalmente se debe a que el proceso está esperando a que otro proceso del sistema le preste algún servicio solicitado. · TASK_UNINTERRUPTIBLE (2): el proceso está bloqueado esperando a que se le conceda algún recurso de hardware que ha solicitado (cuando una señal no es capaz de “despertarlo”). · TASK_ZOMBIE (4): el proceso ha finalizado pero aún no se ha eliminado todo rastro del mismo del sistema. Esto es habitualmente causado ha terminado pero el padre no lo espera con un wait(). · TASK_STOPPED (8): el proceso ha sido detenido por una señal o bien mediante el uso de ptrace() para ser trazado.

2 Colas de procesamientoCola de Ejecución o runqueue: procesos en estado TASK_RUNNING . Colas de Espera o wait queues: procesos en estado TASK_ INTERRUPTIBLE ó TASK_ ININTERRUPTIBLE. Los procesos en estado TASK_ZOMBIE ó TASK_STOPPED no necesitan colas para ser gestionados.

3 Identificadores de procesoCada proceso posee un identificador único (PID) Si un proceso es “hijo” de otro, podemos conocer a su “padre” PPID. Podemos ver tanto PID, como PPID con el comando ps. Otro comando es pstree, que permite ver el árbol de procesos

4 Credenciales del proceso

5 Planificación en linuxCombinación de prioridades estáticas y dinámicas (“task’s goodness” o “bondad”) El planificador analiza y calcula la “bondad” de cada una de las tareas. La tarea con mayor “bondad” será la próxima que se ejecute.

6 Funcionamiento del PlanificadorContador que genera una interrupción cada 10 milisegundos. Decremento de prioridad dinámica de la tarea en ejecución. Al llegar a cero, se llama a la función schedule( ) Máxima prioridad es 40. Maximo intervalo sin ser interrumpida por el planificador 0.4 segundos.

7 Task_struct volatile long states: informa del estado de la tarea,indicando si la tarea es ejecutable o si es interrumpible (puede recibir señales) o no. long counter: representa la parte dinámica de la “bondad” de una tarea. Inicialmente se fija al valor de la prioridad estática de la tarea. long priority: representa la parte estática de la “bondad” de la tarea. long need_resched : se analiza antes de volver a la tarea en curso después de haber llamado a una syscall, con el objeto de comprobar si es necesario volver a llamar a schedule( ) para planificar de nuevo la ejecución de las tareas. unsigned long policy: inidica la política de planificación empleada: FIFO, ROUND ROBIN, etc. unsigned rt _priority: se utiliza para determinar la “bondad” de una tarea al utilizar tiempo real por software. struct mm_struct *mm: apunta a la información de gestión de memoria de la tarea. Algunas tareas comparten memoria por lo que pueden compartir una única estructura mm_struct.

8 Señales SIGHUP SIGINT SIGQUIT SIGILL SIGTRAP SIGABRT SIGBUS SIGFPESIGKILL SIGUSR1 SIGSEGV SIGUSR2 SIGPIPE SIGALRM SIGTERM SIGCHLD SIGCONT SIGSTOP SIGTSTP SIGTTIN SIGTTOU SIGURG SIGXCPU SIGXFSZ SIGVTALRM SIGPROF SIGWINCH SIGIO SIGPWR SIGSYS

9 Proceso de señales

10 Manejo de señales (Recepción)Definición de tipo typedef void (*sighandler_t)(int); Función signal sighandler_t signal(int signum, sighandler_t handler); Función de manejo de señal Void handler(int);

11 Ejemplo #include #include void trapper(int); int main(int argc, char *argv[]) { int i; for(i=1;i<=64;i++) signal(i, trapper); printf("Identificativo de proceso: %d\n", getpid() ); pause(); printf("Continuando...\n"); return 0; } void trapper(int sig) signal(sig, trapper); printf("Recibida la señal: %d\n", sig);

12 Manejo de Señales (envío)Desde la Shell: comando kill bash$ kill –Sig Pid Sig son los nombres vistos sin el SIG o bien los números correspondientes Desde un programa: función Kill int kill(pid_t pid, int sig);

13 Ejemplo #include #include #include int main(int argc, char *argv[]) { pid_t pid; int sig; if(argc==3) pid=(pid_t)atoi(argv[1]); sig=atoi(argv[2]); kill(pid, sig); } else printf("%s: %s pid signal\n", argv[0], argv[0]); return -1; return 0;