Con el propósito de planificar el uso de la CPU, el módulo de planificación del procesador define dos funciones estrechamente relacionadas conocidas como: planificador, tiene la tarea de seleccionar (entre los procesos listos) el próximo proceso al que se le asignará la CPU, despachador, es el responsable de cargar, los registros de la CPU con los valores contenidos en el PCB del proceso escogido por el planificador. Para lograr sus propósitos el SO debe mantener una o varias colas de planificación. Cuando los procesos entran al sistema se ponen en una cola de trabajos que contiene todos los procesos del sistema, los procesos que ya tienen todo lo necesario para ejecutar se ponen en la cola de listos (ready queue). En general existen diversas colas dentro del sistema, por ejemplo una por cada equipo de entrada salida. Observe la figura 1, en las colas se encuentran los PCB que son los representantes de los procesos que esperan por los servicios del módulo correspondiente. 1 Encabezado Cola de listo PCB7 PCB2 cabeza cola registros registros Unidad 0 de cinta magnética cabeza • • • • • • Unidad 1 de cinta magnética cabeza Unidad 0 de disco Terminal 0 cola cola PCB3 PCB14 cabeza cola cabeza PCB5 cola • • Figura 1. Cola• de listo y otras colas asociadas a distintos equipos Planificadores Dependiendo del SO, pueden existir varios planificadores, en general se distinguen tres: de periodo corto, de periodo medio y de periodo largo (vea los nodos correspondientes). Objetivos de la planificación de la CPU La planificación de la CPU es la tarea primordial en los sistemas multiprogramados, los planificadores se encargan de realizarla de manera que el procesador se comparta entre los distintos procesos e hilos que se ejecutan en el sistema. Una vez que el planificador de periodo corto selecciona el próximo proceso a ejecutar, el despachador se encarga de cambiar de contexto (cambiar para el 2 PCB6 nuevo proceso), cambiar el procesador a modo usuario e ir a la instrucción adecuada para comenzar la ejecución del nuevo proceso. Existen diversos criterios que deben tomarse en cuenta para comparar los algoritmos de planificación de la CPU, entre otros se pueden citar: 1. La utilización de la CPU. Se desea tenerla lo más ocupada posible. 2. La cantidad de trabajos que terminan en la unidad de tiempo. 3. El tiempo que toma un trabajo en particular para ejecutarse. 4. El tiempo de espera que pasa el proceso en la cola de listo. 5. El tiempo que tarda en dar la primera respuesta. Operaciones sobre procesos Creación de proceso. Un proceso, denominado padre, puede crear varios procesos hijos, los cuales a su vez pueden tener otros hijos formando un árbol de procesos. La figura 2 presenta un árbol de procesos creado en el SO Solaris, obsérvese los pid de cada proceso. Se puede obtener la lista de procesos en un sistema Unix usando el comando ps. Cuando un proceso crea un hijo, existen dos posibilidades en relación a la ejecución: o El padre continúa ejecutando concurrentemente con el hijo. o El padre espera a que el hijo termine. También existen dos posibilidades con relación a la memoria: o El proceso hijo es un duplicado del padre porque tiene el mismo programa y datos que el padre. Es lo que ocurre con la llamada al sistema fork típica de los sistemas Unix. o El proceso hijo carga un nuevo programa. . Es lo que ocurre con la llamada al sistema fork y una posterior llamada exec (en Unix) 3 Figura 2. Árbol de procesos creados en un sistema Solaris Terminación de procesos. Un proceso termina cuando ejecuta su última sentencia y le pide al SO que lo borre para lo cual usa la llamada al sistema exit. El SO le retira todos los recursos asignados. Un proceso también puede terminar la ejecución de otro (si es que se le permite). Comunicación entre procesos Los procesos que ejecutan en un SO pueden ser independientes o pueden comunicarse entre sí con el propósito de realizar tareas cooperadas. Los procesos que cooperan entre sí necesitan alguna forma de comunicarse. Existen, básicamente, dos formas de cooperación. Pasando mensajes. Útil para intercambiar pequeños volúmenes de información y fácil de implementar. Compartiendo una memoria común. Más rápido. 4 La figura 3 presenta ambos modelos. Proceso A Proceso A M Proceso B Memoria compartida M Proceso B 2 1 1 M Núcleo Núcleo (a) (b) Figura 3. Comunicación entre procesos, a) paso de mensajes, b) memoria compartida. Sistemas de memoria compartida Estos sistemas necesitan la comunicación entre procesos para establecer, de forma precisa, la memoria común a compartir (normalmente el SO no permite que un proceso acceda a la memoria de otro), una vez establecido el acuerdo entre los procesos, el SO no tiene participación del problema. Considérese el problema clásico productor-consumidor. Un proceso, denominado productor, produce información que es consumida por otro proceso, que se llama consumidor. Una solución a ese problema es usar un espacio de memoria común en donde el productor pone la información para que el consumidor la extraiga. El productor puede estar produciendo mientras el consumidor consume con el único cuidado de no estar usando exactamente las mismas direcciones de la memoria compartida, la cual se puede ver como un buffer con diferentes ítems. 5 Existen dos posibilidades con relación al buffer: Que sea no acotado (prácticamente sin limitación de espacio), en ese caso el productor nunca tendrá que esperar (siempre hay donde poner lo que se produce). Que sea acotado. En este caso, si todos los buffer están llenos, el productor tendrá que esperar. En cualquiera de los dos casos el consumidor tendrá que esperar cuando el buffer esté vacío. De todo lo anterior queda claro que debe haber una sincronización entre ambos procesos. 6