Manipulación de procesos Las primeras computadoras solo podían manipular un programa a la vez. El programa tenía control absoluto sobre todo el sistema. Con el desarrollo vertiginoso del hardware ese panorama ha cambiado radicalmente y hoy en día es posible cargar varios programas en memoria para que se ejecuten concurrentemente. La situación anterior ha obligado a establecer un control más estricto sobre los recursos ya que, al ser estos finitos y tener que compartirlos, surgen diferentes conflictos que puede entorpecer la idea de realizar más tareas en el mismo tiempo físico. Concepto de proceso. Un proceso es un programa en ejecución, resulta de suma importancia comprender este concepto en toda la magnitud de la palabra y nunca debe confundirse con el concepto de programa ya que mientras el primero es un ente activo que posee recursos y tiene vida (realiza determinada actividad) el segundo es un ente pasivo que no hace absolutamente nada. Obsérvese que puede parecer una sutileza pero un programa no deja de serlo por el hecho de estar escrito en un papel, una pizarra o estar contenido dentro de un archivo que reside en cualquier medio de almacenamiento, en este último caso existe la posibilidad de que el sistema operativo lo cargue en la memoria (le asigna una parte de la memoria como recurso) y le pase el control de la cpu (le asigna el procesador, por un tiempo, como otro recurso) para que comience su ejecución y por tanto cobre vida y se transforme de programa (ente pasivo) a proceso (ente activo). Quizás, en múltiples ocasiones, ustedes han apretado la combinación de teclas ctrl-alt-del cuando han estado usando algún SO de la Microsoft y habrán observado que, a pesar de no haber ordenado la ejecución de programa alguno, hay muchos procesos que se están ejecutando, ellos son parte de los procesos que inicia el SO. También se habrán percatado que pueden realizar varias tareas a la vez, por ejemplo: editar un texto, imprimir y navegar por Internet, todo eso aún cuando la máquina que están usando tiene un solo procesador. 1
El Process Control Block (PCB) El PCB es la estructura de datos que controla el estado del proceso y sus recursos, la figura 1 proporciona una idea esquematizada de la misma. La información en el PCB puede variar de un sistema operativo a otro pero, en términos generales, deben estar presentes estos campos. El Estado, describe la actividad actual del proceso. La Identificación es, usualmente, un número que identifica unívocamente al proceso dentro del sistema y se conoce, muchas veces, como PID (process identification). El Contador de programa contiene la dirección de la próxima instrucción a ejecutar, obsérvese que ese valor se refiere a un registro del procesador (registro EIP en el procesador Intel). El campo Registros se ha representado con más espacio debido a que se desea dar la idea de que en él están contenidos todos los demás registros del procesador (para ese proceso). Los Límites de memoria indican la parte de memoria que tiene reservado el proceso y dependerá del esquema de asignación de memoria que use el SO (puede ver el mapa de administración de la memoria). El campo Archivos abiertos puede ser un puntero a una tabla que contiene la lista de archivos abiertos por el proceso, en dicha tabla se controlan cosas tales como el lugar desde o hacia donde se leerá o escribirá la próxima información. Un proceso necesita más que el código para poder ejecutarse ya que también necesita tener un control sobre sus recursos, tales como: su espacio de direcciones de memoria, la pila y los valores de los registros del procesador, entre otros, ese control se lleva a cabo por los diferentes módulos del SO los cuales basan su trabajo en la información contenida en el PCB. 2
Estado Identificación Contador de programa Registros Límites de la memoria Archivos abiertos Figura 1. PCB típico. Ciclos de vida y estados de un proceso En un sistema multiprogramado, se puede afirmar que cada proceso tiene su CPU virtual en el sentido que siempre tiene una copia de ella. Esa copia se guarda en el Bloque de Control de Proceso (PCB). La idea básica para detener procesos e intercambiar las tareas de forma que teniendo una sola CPU parezca que se ejecutan varias tareas a la vez, se basa en los dos aspectos siguientes. Cada vez que un proceso sea detenido, por cualquier cosa (se le termino el ciclo de cpu, hizo una petición de E/S, etc.), se tomarán los valores de la CPU para guardarlos en su PCB (la CPU virtual de ese proceso). Cada vez que un proceso vaya a entrar en estado de ejecución, se toman los valores de su PCB (su CPU virtual) y se carga la CPU real con ellos, con lo cual esta última queda tal y como estaba cuando el proceso que se va ejecutar fue interrumpido en el pasado o sea: o el valor adecuado del registro contador de programa, para saber cuál es la próxima instrucción a ejecutar, o los valores de los registros asociados a la las direcciones de memoria del proceso, para saber en qué parte de la memoria están sus instrucciones, 3
o Los valores de los registros asociados a las tablas de archivos abiertos para poder continuar leyendo o escribiendo desde o hacia ellos, etc. Podemos asociar la idea de lo que hace el SO a lo que hacemos cuando estamos leyendo un libro y algo o alguien nos interrumpe: en ese caso ponemos un marcador que nos permite volver a abrir el libro en la misma página donde estábamos cuando fuimos interrumpido. Claro que lo que ocurre en el SO es mas complejo, en ese caso nuestro marcador guarda el contador de programa (para saber por donde estaba la ejecución) pero tiene que guardar muchas cosas mas como vimos anteriormente. Observe la figura 2. Ciclos CPU y de E/S El éxito de la planificación de la CPU depende de observar que la vida de los procesos transcurre en dos ciclos: ciclos de CPU y ciclo de E/S. La ejecución de un proceso comienza en un ciclo de CPU, al cual le sigue un ciclo de E/S, de nuevo un ciclo de CPU y después otro de E/S y así sucesivamente hasta terminar (algo aburrida la vida del proceso pero es así). En el peor de los casos solo existe el ciclo de CPU inicial pero es muy difícil que un proceso no efectúe ninguna E/S. A través de los años y gracias a diferentes investigaciones en el campo de los SO, la duración de estos ciclos se ha medido y se ha observado que, en general, existe una gran cantidad de pequeños ciclos de CPU y una pequeña cantidad de grandes ciclos de E/S. En un sistema multiprogramado no se puede programar haciendo suposiciones acerca de la velocidad de ejecución, ya que no todos los procesos ejecutan sus cálculos a igual velocidad e incluso, en el caso que se ejecuten varias veces, cada vez no tienen que comportarse igual. 4
Ejecución Proceso P 0 Sistema operativo Interrupción o llamada al sistema Proceso P 1 Salvar estado en PCB 0 Inactivo Inactivo Recarga estado desde el PCB 1 Interrupción o llamada al sistema Ejecución Salvar estado en PCB 1 Recarga estado desde el PCB 0 Inactivo Ejecución Figura 2. Cambio de CPU entre procesos La vida de un proceso pasa por diferentes estados (figura 3) que describen, de cierta forma, la actividad que están realizando en cada instante de tiempo. En general esos estados pueden ser los siguientes (pueden variar de un SO a otro): 5
Nuevo Admitido Interrumpido Terminado salida Listo Corriendo Evento de E/S terminado Planificador/Despachador Esperando Espera por evento de E/S Figura 3. Transición de estados de un proceso Nuevo (NEW). Ocurre cuando se crea el proceso, es el momento en que sucede la transición de programa a proceso y por eso se crea el PCB y se le asignan algunos recursos elementales, memoria por ejemplo. Listo (READY). Describe a un proceso que está esperando por la CPU. Se llega a este estado de dos varias formas: a. un proceso (nuevo) es admitido en el sistema y por tanto comienza a competir por la CPU, b. un proceso termina un evento externo a la CPU (una entrada salida por ejemplo) y necesita volver a ejecutar, c. un proceso que está usando la CPU es desalojado porque se le terminó el tiempo que le habían dado pero en realidad no había terminado. Corriendo (RUNNING). Un proceso que tiene la CPU asignada. Bloqueado (BLOCKED) o en espera (WAITING). En espera de algún evento externo. Terminado (TERMINATED) cuando el proceso termina completamente su trabajo. 6
Planificación de procesos El objetivo de la multiprogramación es tener varios procesos ejecutando a la vez con el propósito de maximizar el uso de la CPU, por otra parte el objetivo de los sistemas de tiempo compartido (time sharing) es intercambiar la CPU entre distintos procesos tan frecuentemente que los usuarios perciban la idea de que todos los procesos están ejecutándose a la vez. La parte del sistema operativo que se encarga de escoger el proceso que le toca usar la CPU se denomina planificador y el SO cuenta con varios de ellos (vea el nodo correspondiente). 7