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
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