EL CONCEPTO DE PROCESO Al discutir sobre distintos aspectos de los sistemas operativos nos encontramos con un gran escollo: ¿Cómo denominamos al conjunto de todas las actividades que efectúa la CPU? Un sistema en lote (BATCH) ejecuta trabajos (JOBS) en tanto un sistema de tiempo compartido (TIME SHARING) ejecuta programas de usuario o tareas (TASKS). En el caso de sistemas mono-usuarios (MS_DOS – MACINTOSH OS) un solo usuario puede estar corriendo varios programas simultáneamente (o concurrentemente). En el caso en que el sistema operativo ejecute un solo programa a la vez, también necesita brindar soporte a sus propias actividades. Por ejemplo el “SPOOLING”. En muchos aspectos todas las actividades son similares, razón por la cual las denominaremos “PROCESOS”. PROCESOS Informantemente un proceso es un programa en ejecución. La ejecución de un proceso debe progresar en una forma secuencial en el sentido de que en cualquier instante se estará ejecutando a lo sumo una instrucción para ese proceso. Un proceso es más que un código de programa (llamada la sección de texto de proceso). El proceso incluye además la actividad actual (representada por el contenido del PROGRAM COUNTER, PSW Y LOS REGISTROS DE USO GENERAL), el stack del proceso (conteniendo los datos temporarios *) un programa no es un proceso, es una entidad pasiva mientras que un proceso es una entidad activa con un PROGRAM COUNTER especificando la próxima instrucción a ejecutar y su conjunto de recursos asociados a dicha posible ejecución. Aunque 2 procesos están asociados con el mismo programa, se los considera dos secuencias de ejecución separadas. Por ejemplo: varios usuarios están usando de manera simultanea copias del programa mail o el mismo usuario está invocando copias del editor de texto. Cada una de estas actividades son un proceso separado, que si bien tienen secciones de textos equivalentes, sus secciones de datos y de stack pueden diferir entre sí. Contenido temporario: parámetros de subrutinas, direcciones de retorno, y variables temporarias. Una sección de datos (contenido de variables globales de texto) ESTADO DE UN PROCESO Mientras que un proceso se ejecutan, cambian sus estados. El estado de un proceso está parcialmente definido por la actividad actual de dicho proceso. Cada proceso puede estar en cualquiera de los siguientes estados: NUEVO: cuando al proceso se lo está creando CORRIENDO: cuando se está ejecutando alguna instrucción del mismo ESPERANDO: cuando el proceso está esperando la ocurrencia de algún evento (recibir una señal, completar una operación de E/S, etc). LISTO: el proceso está esperando que se le asigne algún procesador. TERMINADO: cuando el proceso ha finalizado su ejecución. Estas definiciones son arbitrarias, es decir, pueden variar de SO en SO. En algunos sistemas operativos se distinguen mucho mas estados que estos 5 estados básicos. Es de destacar que en cualquier instante solo un proceso puede estar corriendo (RUNNING) en cualquier procesador. En el SO para cada proceso se representa por medio de un bloque de control de procesos (PCB). Los contenidos de la PCB son los siguientes: 1. Estado del proceso 2. Contenido del PROGRAM COUNTER 3. Registros del procesador (CPU REGISTERS): acumuladores, index registers, stack pointers y registros de uso general. Estos dependen de la arquitectura del computador. 4. Registros de códigos de condición (PROGRAM STATUS WORD). Los elementos 2 a 4 deben preservarse cada vez que ocurre una instrucción. 5. Información para la planificación en el uso de la CPU: prioridad del proceso, punteros a las colas de planificación y cualquier otro parámetro de planificación 6. Información para la administración de la memoria necesaria para ejecutar el proceso: contenidos del registro base y del registro limite, las tablas de páginas, las tablas de segmentos, etc. 7. Información contable: uso dela CPU, tiempo real usado, limites de tiempo, numero de JOB, de proceso y contables 8. Información de estado de las E/S: lista de los dispositivos de E/S asignados al proceso, de los archivos abiertos por proceso, etc. El PCB es el repositorio de cualquier información que pueda variar de proceso a proceso. PLANIFICACION DE PROCESOS El objetivo de la multiprogramación es tener siempre (en la medida de lo posible) un proceso en ejecución (RUNNING) a los efectos de maximizar el uso de la CPU. En tanto el objetivo del TIME SHARING es intercambiar (SWITCH) tan frecuentemente el uso de la CPU entre los procesos. En un sistema monoprocesador nunca vamos a tener más de un proceso en estado RUNNING con lo que el resto de los procesos que quieran hacer uso de la CPU van a tener que quedar a la espera hasta que el proceso en ejecución la libere. Estos van a esperar en una cola de procesos LISTOS. COLAS DE PLANIFICACION A medida que un proceso entra al sistema, se lo coloca en una cola de trabajo (JOB QUEUE). Los procesos residentes en memoria que están esperando su ejecución por tener listos todos sus recursos asociados, se colocan en la cola de listos (READY QUEUE). Una cabecera de cola (READY QUEUE HEADER) contendrá los punteros de comienzo y fin de esta lista encadenada que es la cola de listos. O sea los punteros del primer y del último PCB de la cola. Cada PCB contiene un puntero al próximo PCB de la cola de listos. En el sistema hay además de estas colas otras más. Cuando a un proceso se le asigna CPU este permanece cierto tiempo en uso de la CU hasta que eventualmente finaliza, es interrumpido o se coloca a la espera de la ocurrencia de algún evento (ejemplo, la finalización de un pedido E/S). Los pedidos de E/S podrá ser sobre un dispositivo dedicado (un cinta) o sobre un dispositivo compartido (unidad de disco). En este último caso, como hay muchos procesos en el sistema intentando acceder al mismo dispositivo compartido, existe una cola de pedidos a satisfacer por parte del dispositivo. La lista de procesos que están aguardando por un dispositivo de E/S en particular se llama una cola de dispositivos (DEVICE QUEUE). Cada dispositivo provee su propia cola. Un diagrama de colas es la representación mas usada cuando se trata de hablar sobre la planificación de procesos. En este diagrama cada rectángulo representa una cola, los círculos los recursos servidos a través de cada cola y las flechas indican al recorrido de los procesos en el sistema. Hay 2 tipos de cola de listos y un conjunto de colas de dispositivos. Cola de listos CPU E/S Cola de E/S Pedido de E/S Expiración del TIME SLICE Ejecución del hilo Ocurre la interrupción FORK un hijo Espera por una interrupción Un proceso inicialmente es colocado en la cola de listos, espera en la cola de listos hasta que se asigna uso de CPU (es despachado a la CPU) mietras está ejecutando (RUNNING) sobre la CPU pueden ocurrir algunas de estas alternativas: 1. El proceso emite una solicitud de E/S. entonces se lo coloca en la cola de E/S 2. Expira el tiempo asignado al uso de la CPU (TIME SHARING) con la cual es devuelto a la cola de listos 3. El proceso crea un nuevo subproceso, y queda a la espera de su finalización 4. Al ocurrir una interrupción se fuerza al proceso abandonar el uso de la CPU colacondola nuevamente en la cola de listos. En los casos 1 y 3 el proceso cambia al estado ESPERANDO (o bloqueado). Pasa a la cola de procesos que están a la espera de la ocurrencia de su suceso para poder continuar su ejecución. Y ante la ocurrencia de dicho suceso el proceso cambia al estado listo y por lo tanto debe ser colocado nuevamente en la cola de procesos listos. Un proceso continua este ciclo hasta que termina (EXIT THE SYSTEM). En ese momento se saca el PCB de todas las colas, se desasigna todos los recursos allí asignados (en el PCB) y finalmente se desasigna el PCB en sí (se libera memoria que ocupaba). PLANIFICADORES Durante su ciclo de vida un proceso va migrando entre todas estas colas de planificación. El SO es el encargado de seleccionar procesos de entre todas esas colas, según algún criterio. El proceso de selección lo efectúa mediante el uso de planificador apropiado. En un sistema BATCH siempre hay mas procesos ingresados que lo que se puedan ejecutar (admitidos en el sistema). Los procesos ingresados son “SPOOLEADOS” a un dispositivo de almacenamiento masivo (generalmente un disco) donde se los almacena hasta su posterior ejecución. El JOB SVHEDULER (planificador a largo plazo) es el encargado de seleccionar procesos de este POOL y de cargarlos en memoria para su ejecución (cambio de estado NEW READY) luego de lo cual los ingresa en la cola de listos. El planificador de corto plazo (o planificador de CPU) selecciona un proceso de entre todos los que está en la cola de listos y se asigna CPU. La primera distribución entre estos 2 planificadores es la “frecuencia con que se ejecutan”. El planificador de corto plazo se requiere muy frecuentemente, pues se encarga de seleccionar un proceso para que ejecute sobre la CPU. Un proceso genralmente ejecuta instrucciones durante unos pocos milisegundos (agregado posible, concepto a tener en cuanta para las estadísticas del procesador en el TP). Antes de colocarse en espera por algúna operación de E/S solicitada por el mismo. A menudo el planificador de corto plazo ejecuta al menos cada 100 milisegundos. Debido al corto periodo entre ejecuciones el planificador de corto plazo debe ser muy rápido. Si el decidir que proceso asignar a la CPU le llevara 10 milisegundos, entonces estaría usando 10/(100+10) = 9% del tiempo de la CPU para planificar el trabajo de la CPU. Se desperdicia el 9% del tiempo de la CPU ( y por lo tanto disminuyendo su capacidad de procesamiento en ese 9%) en su planificador de uso. Por lo tanto el planificador de largo plazo ejecuta con mucho menos frecuencia en el sistema. Este planificador regula el nivel de multiprogramación (cantidad de procesos en memoria). Si el nivel de multiprogramación es estable entonces el tiempo promedio de creación de procesos deberá ser igual al tiempo procedió de salida de procesos del sistema. En este caso este planificador solo se va a invocar cada vez que un proceso ( de usuario) abandone el sistema. Debido al largo intervalo de tiempo entre sucesivas ejecuciones el planificador de largo plazo se puede dar el lujo de insumir más tiempo en cada una de sus decisiones acerca de qué proceso admitir en el sistema. Es muy importante para todo el sistema que el planificador de largo plazo haga una selección acertada. Como en general los procesos se pueden clasificar en acotados por E/S (I/O BOUNDED) o acotados por uso del procesador (CPU BOUNDED) es muy importante que este planificador mantenga activa una buena mezcla de estos 2 tipos de procesos. El sistema con mejor desempeño es aquel que posee una mejor mezcla entre estos 2 tipos de procesos. Un proceso acotado por E/S es aquel que pasa la mejor parte de su ejecución realizando operaciones de E/S en lugar de computacionales (CPU). Un proceso acotado por CPU pasa la mayor parte de su tiempo efectuando cálculos y muy rara vez solicita una operación de E/S. En algunos sistemas el planificador de largo plazo esta ausente o tiene una influencia minima. Por ejemplo, los sistemas de tiempo compartido no tienen planificador de largo plazo pues lo que este hace sencillamente es colocar cada proceso nuevo en memoria para que lo administre el planificador de corto plazo. La estabilidad de estos sistemas mas dependerá de: 1. Las limitaciones físicas, tales como el numero de terminales disponibles 2. La naturaleza de auto-ajuste en el comportamiento de los seres humanos. Si un usuario estima que es esos momentos el tiempo de respuesta del sistema esmuy lento entonces puede tomar la determinación de abandonar la terminal (saliendo del sistema) para realizar tareas propias que no requieran el uso del computador y volver a la terminal luego de una largo lapso prolongado (a la espera que el sistema esté menos congestionado) Algunos sistemas de tiempo compartido emplean otro nivel de planificación (un nivel intermedio entre los 2 planificadores mencionados anteriormente): el planificador de mediano plazo. La idea que subyace detrás de este planificador es la siguiente: a veces puede resultar ventajoso quitar procesos de memoria disminuyendo el grado de multiprogramación en el sistema. Transcurrido un tiempo se reintroduce este proceso a memoria y se continúa con su ejecución tal como si nada hubiera ocurrido. Este esquema se denomina swapping. El planificador de mediano plazo es el encargado de efectuar el SWAPP OUT de un proceso en memoria (generalmente a disco) y también el encargado de hacer SWAPP IN (desde el disco) a memoria nuevamente. La operación de SWAPPING puede ser necesaria: 1. Para incrementar la mezcla de procesos BOUNDED 2. Porque un cambio en los requerimientos de memoria la ha sobresaturado en su uso, convirtiendo este recurso en el cuello de botella de todo el sistema, siendo necesario liberar memoria para que todo vuelva a funcionar con normalidad. CONTEXT (OR PROCESS) SWITCH Cambiar (SWITCH) el uso de la CPU a otro proceso requiere salvar el estado del proceso viejo y cargar el estado salvado del nuevo proceso. Esta tarea se conoce como CONTEXT SWITCH. El tiempo que insume un cambio de contexto es sobrecarga pura, pues durante todo el lapso que demora este cambio de contexto la CPU no realiza ningún trabajo productivo. La velocidad del cambio de contexto depende de varios factores que varían de maquina en maquina: 1. Velocidad de la memoria 2. Cantidad de registros a ser salvados 3. La existencia de instrucciones especiales (que permitan salvar y restaurar todos los registros involucrados) Un CONTEXT SWITCH puede varias entre 1 y 1000 microsegundos. El tiempo que demore CONTEXT SWITCH va a depender mucho del soporte HARWARE. También dependerá de la complejidad del SO empleado. Cuanto mas complejo el SO mas lento el cambio de contexto. Cuanto mas flexible sea el uso de la memoria mas datos van a tener que ser manejados en cada cambio de contexto (pues los espacios de direcciones de cada proceso involucrado deberán esatar protegidos adecuadamente) haciendo a su vez mas lento cada CONTEXT SWITCH. Como se preserva el ADRESS SPACE de cada proceso dependerá del método de administración de memoria empleado por SO. El CONTEXT SWITCH se ha convertido en un cuello de botella en el rendimiento del equipo, hasta tal punto que para evitarlo se debieron crear nuevas estructuras los hilos (THREADS)