Portada » Informática » Funcionamiento de Sistemas Operativos: Gestión de Procesos, Hebras y Ciclo de Vida
Arranque: Se pulsa el botón reset. El CP (Contador de Programa) toma el valor de la dirección correspondiente a la ROM. Se comienza a ejecutar el programa de arranque alojado en modo privilegiado y con memoria real. En un PC, la ROM contiene, además del iniciador, el programa BIOS. Se comprueba el sistema. Se realiza la lectura de disco y el almacenamiento en RAM del programa Boot. El programa Boot lee el Sistema Operativo (SO) del disco y lo carga en RAM, cediendo finalmente el control al SO.
Los motivos de activación incluyen:
Ciclo de activación:
Comprobación del sistema (HW y sistema de ficheros). El SO residente genera tablas de páginas, de procesos, de interrupciones, etc. Se activa la MMU (Memory Management Unit), pasando a usar memoria virtual. Se habilitan las interrupciones. A partir de este momento, se ejecuta en modo usuario. Crea un proceso init, procesos demonios y un proceso de login por cada terminal. A partir de este momento, el SO solo se ejecuta cuando ocurre una interrupción.
Un proceso es un programa en ejecución, una unidad de procesamiento gestionada por el SO. Los procesos se organizan en jerarquía; todos los procesos tienen un padre. Además, pueden pertenecer a un grupo de procesos. El proceso INIT empieza en modo superusuario y se encarga de arrancar el sistema; su PID = 1 y, al acabar el INIT, se pasa al modo privilegiado. El SO almacena el estado del procesador, la imagen de memoria y las tablas de procesos (BCP), de memoria, de E/S y de ficheros.
El estado del procesador está formado por el contenido de todos sus registros.
Cuando el proceso no está en ejecución, su estado debe quedar almacenado en el Bloque de Control de Proceso (BCP). Cuando el proceso está ejecutando, el estado del procesador reside en los registros y varía de acuerdo al flujo de instrucciones máquina ejecutado. En este caso, la copia que reside en el BCP no está actualizada. La rutina del sistema operativo que trata las interrupciones lo primero que ha de hacer es salvar el estado del procesador del proceso interrumpido en su BCP.
Almacena información de:
Si la información se quiere compartir entre varios procesos, no puede estar en el BCP, puesto que esta estructura es privativa de cada proceso. Si la información tiene tamaños muy diferentes de un proceso a otro, no es eficiente almacenarlas en el BCP. Es el caso de las tablas de páginas (en el BCP solo se almacena la información que permite acceder a esa tabla) y los punteros de posición de ficheros (esta información no puede almacenarse en el BCP ya que este puntero se quiere compartir en varios ficheros).
Nota de refuerzo: Si la información se quiere compartir entre varios procesos, no puede estar en el BCP, puesto que esta estructura es privativa de cada proceso. Si la información tiene tamaños muy diferentes de un proceso a otro, no es eficiente almacenarlas en el BCP. Es el caso de las tablas de páginas (en el BCP solo se almacena la información que permite acceder a esa tabla) y los punteros de posición de ficheros (esta información no puede almacenarse en el BCP ya que este puntero se quiere compartir en varios ficheros). El ciclo de vida incluye la creación (imagen de memoria, BCP, carga de segmentos y pila), activación (planificación), interrupción (salvado de estado) y terminación (recuperación de recursos).
Cada hebra tiene su propia información sobre el contexto de su ejecución (BCT): estado de procesador, pila, estado de la hebra y prioridad de ejecución. Cada hebra comparte con las de su mismo proceso (BCP): espacio de memoria, variables globales, ficheros abiertos, procesos hijos, temporizadores, señales, semáforos y contabilidad.
Ventajas: Separación de tareas, aumenta el aprovechamiento de la CPU, mejores prestaciones que con los procesos y comunicación más sencilla (comparten variables). En hebras KTL, solo se bloquea la que hace la llamada al SO.
Inconvenientes: Programación compleja, necesidad de sincronizar el acceso a regiones críticas mediante mutex; si se produce un error en una hebra, muere todo el proceso.
Ignorar la señal implica que el proceso la recibe y la descarta. Bloquear una señal significa que el proceso no la recibe y queda pendiente de entrega hasta que se desbloquee. Son acciones compatibles y no excluyentes.
sigaction con SIG_IGN como handler (act.sa_handler = SIG_IGN).sigprocmask, sigemptyset, sigaddset, sigdelset.El Bloque de Control de Proceso es una estructura de datos del SO que almacena la información de un proceso: identificadores (PID, PPID, UID, GID…), estado del procesador, control de proceso (estado listo/ejecutado/bloqueado, planificación, memoria, recursos, señales) y contabilidad.
alarm() establece un temporizador que hace que, cuando transcurra un tiempo indicado, el SO envíe al proceso la señal SIGALRM. Si no se arma esta señal, al recibirla el proceso muere. Puede usarse para que un proceso finalice pasado un tiempo o para ejecutar una función específica tras el intervalo.
pthread_exit: Termina el hilo actual (desde cualquier función del hilo).return: Termina la función en la que está (si es la función principal del hilo, termina el hilo).exit: Termina todo el proceso, incluyendo todos sus hilos.Procesos hijos sin wait: Si los hijos terminan antes que el padre, se quedan en estado zombi. Cuando muere el padre, el proceso init hace wait por ellos. Si el padre es un demonio (bucle infinito), los hijos quedarían zombis indefinidamente, acaparando recursos.
Exec y señales: Si un proceso lanza un hijo mediante exec, no se puede mantener el armado de una rutina de tratamiento personalizada, ya que el exec reemplaza el código del proceso por el nuevo ejecutable.
Los sistemas que soportan KTL tienen en el BCP de cada proceso una lista enlazada de BCT (Thread Control Blocks). Los que no los soportan, gestionan las hebras mediante una librería a nivel de usuario.
