Portada » Informática » Planificador del uso del tiempo
Con frecuencia los procesos necesitan comunicarse los unos con los otros .Ejemplo: Un programa en la shell puede utilizar la salida de otro como entrada .Esto se llama IPC(Inter Process Communications) .
Comunicación entre procesos: 1)Cómo puede un proceso pasar información a otro 2)Impedir que los procesos se estorben al realizar actividades importantes 3)Ordenamiento correcto cuando se producen dependencias.
El agunos sistemas operativos se da el caso de que dos o más procesos que están colaborando compartan un área de almacenamiento en que ambos puedan leer y escribir. Ejemplo: Spooler de impresión.
Generalmente las soluciones para este tipo de problemas son perfectas pero muchas veces algo raro e inexplicable.
Es una forma de evitar que dos o más procesos escriban en una misma regíón de memoria compartida al mismo tiempo. Se supone que se eliminan las condiciones de competencia .Lo que es implementa es una exclusión mutua. Es decir, algún mecanismo para asegurar que una regíón de memoria compartida que está siento utilizada por un proceso no pueda ser utilizada por otro a la vez.
Este mecanismo evita las condiciones de competencia, pero necesita que se cumplan cuatro condiciones para que funcione bien .
1)Dos procesos no pueden estar al mismo tiempo en sus regiones críticas. 2)No pueden haber suposiciones sobre la velocidad ni el número de CPUs. 3)Ningún proceso que se esté ejecutando afuera de su sección crítica puede bloquear a otros procesos 4)Ningún proceso debería esperar de manera indefinida para entrar a la sección crítica.
Es un tipo de dato abstracto que permite el uso de un recurso de manera exclusiva cuando varios procesos están compitiendo por él. El tipo de datos cumple con la siguiente semántica .
El estado interno del semáforos cuenta cuántos procesos pueden utilizar el recurso. Puede ser realizado hasta con un número entero, impidiendo que éste llegue a negativo alguna vez.
Existen tres operaciones con un semáforo:
init(): inicializa el semáforo antes que cualquier proceso haya iniciado alguna operación wait() o una operación signal(). Si se inicializa con ‘1’ se ha construído un semáforo binario .
wait(): Si el estado indica cero, el proceso queda con el semáforo en ‘rojo’ hasta que sea despertado por otro proceso. Si el estado indica que un proceso más puede tener acceso al recurso, se decrementa el contador y la operación termina con éxito.
signal(): Una vez que se ha terminado el uso del recurso, el proceso lo señaliza en el semáforo. Si queda algún proceso bloqueado por el semáforo en ‘rojo’, éste pasará a ‘verde’, desbloqueándolo.
Definen la interfaz entre el sistema operativo y el usuario .Cuando un programa de usuario necesita algún servicio del sistema operativo tendrá que ejecutar la instrucción TRAP.
Ésta instrucción le transfiere el control al sistema operativo .Después de ejecutarse (de ser posible o permitido) se le devuelve el control al proceso de usuario.
Las llamadas a sistema ejemplificadas recién son para ser utilizadas en un sistema UNIX que cumple el estándar POSIX .Los sistemas Microsoft usan otro tipo de llamadas pero el fin es más o menos el mismo .A continuación mostraremos una tabla de equivalencias entre las llamadas a sistema de un sistema POSIX con un sistema con la API de Win32 (si es que se le puede llamar equivalencia.
El tiempo de respuesta cumple un papel fundamental .Se basan en el trabajo que realizan dispositivos externos al computador .Esos dispositivos generan estímulos, se debe responder rápidamente a ellos .
Ejemplo: Un moderno sistema de frenos ABS .
Se clasifican en dos tipos :
Hay plazos absolutos que deben cumplirse pase lo que pase. Ejemplo: un piloto automático de un avión .
Pueden tolerarse retrasos ocasionales, aunque se busca evitarlos. Ejemplo: Un teléfono celular .
En ambos casos, el comportamiento en tiempo real se logra dividiendo el programa en varios procesos cuyo comportamiento es predecible y se conoce con antelación.
Por lo general tales procesos son cortos y pueden teerminar su trabajo en mucho menos de un segundo. Cada vez que se produce un suceso externo, el planificador de procesos debe programar cada uno de los procesos de tal forma que se cumplan los plazos .
Los algoritmos de planificación pueden ser estáticos o dinámicos. Los estáticos toman sus decisiones antes de que el sistema comience a ejecutarse. Los segundos toman las decisiones en tiempo de ejecución.
Algoritmos de planificación .
Planificación de Tasa Monotónica (Rate Monotonic Scheduling.Es apropiativo .Desarrollado por Liu y Layland en 1973 .Puede utilizarse bajo las siguientes condiciones 1)Cada proceso debe terminar dentro de su período 2)Ningún proceso depende de otro 3)Cada proceso necesita el mismo tiempo de CPU en cada ráfaga 4)Los procesos no periódicos, de existir, no tienen plazos. 5)La apropiación del CPU es instantánea y no requiere procesamiento adicional.
Todas las condiciones son razonables a excepción de la última. El hecho de que la última no lo sea facilita mucho el modelamiento. Cada proceso tiene una prioridad fija. Esa prioridad depende de la frecuencia con que aparece el suceso que lo dispara. Es estático.
Plazo más cercano primero (Earliest Deadline First.Es dinámico, no requiere que los procesos sean periódicos. No es necesario que se informe el tiempo de CPU.Cada vez que un proceso necesita CPU anuncia su presencia y su plazo. Se mantiene una lista de procesos en orden por plazo. El algoritmo ejecuta el primer proceso de la lista. Cada vez que un nuevo proceso está listo, se verifica si su plazo se va a cumplir antes de que se cumpla el proceso en ejecución. En ese caso se apropiará de la CPU ..
RMS funciona siempre y cuando el uso de CPU no pase de un 78%, se ser mayor éste podría fallar.
EDF funciona con cualquier conjunto de procesos planificable. Puede lograr el uso de un CPU al 100%.
Algoritmos de planificación de procesos para sistemas de tiempo compartido .Sistemas también llamados ”interactivos” .Todas estas soluciones también pueden utilizarse en los sistemas de procesamiento Batch .
En estos sistemas no es posible el procesamiento en tres niveles.
Es el más antiguo, sencillo, equitativo y ampliamente utilizado. A cada proceso se le asigna un tiempo máximo de CPU llamado quantum, durante el que se le permitirá ejecutarse. Lo más importante es la magnitud del quantum.
Hacer el cambio entre un proceso y otro (cambio de contexto) requiere cierto tiempo para trabajos administrativos. Se empieza a cuantificar el costo administrativo adicional.
Se empieza a cuantificar el costo administrativo adicional. Tiempo en que se tarda la conmutación de mapas de memoria. Vaciar el disco. Cargar el caché.
Elimina el supuesto implícito del Round Robín (Que todos los procesos tienen la misma importancia,La idea consiste en asignarle a cada proceso una prioridad. El proceso listo que tenga la prioridad más alta se ejecutará.Podría ocurrir que algún proceso con muy alta prioridad se ejecute de manera indefinida. Para evitar esto último, se podría disminuir la prioridad del proceso cada vez que esté en ejecución. Pueden asignarse las prioridades a los procesos de forma dinámica o estática. UNIX permite modificar la prioridad de manera interactiva. (Comando nice, jamás utlilizado xD).En muchos casos se agrupan las prioridades por clase, y con un round robín dentro de cada clase.
Es básicamente una modificación de la planificación por prioridades.Mientras tenga menos bloqueos por I/O se le baja la prioridad. Esto favorece a los procesos interactivos. Desfavorece a los procesos que funcionan en background.
Como esta estrategia obtiene resultados rápidos en los sistemas por lotes, es posible utilizarla también en los sistemas de tiempo compartido. Los procesos interactivos generalmente esperan un comando (bloqueo de I/O), lo ejecutan, luego esperan, etc.Se separa cada comando en un trabajo individual para así reducir el tiempo de respuesta ejecutando primero el más corto.Una estrategia utilizada es estimar los valores basado en los comportamientos anteriores. Ejecutando así el proceso que tenga el tiempo de ejecución estimado más corto. Esta técnica consiste en calcular la media ponderada del último valor medido y el anterior. Se le llama envejecimiento.
Se basa en el cumplimiento de promesas al usuario. Ejemplo: Hay n usuarios en sesíón, se le asigna a cada usuario un 1/n de tiempo de CPU. En un sistema monousuario hay n procesos corriendo a cada uno de los procesos se le asigna 1/n de tiempo de CPU. Para cumplir estas promesas se debe llevar una cuenta de cuanto tiempo de CPU ha recibido un proceso desde que fue creado. Luego se calcula el tiempo de CPU al que cada proceso tiene derecho, lo cual sería el tiempo desde que fue creado dividido por n.
A cada proceso se le entregan varios ”boletos de lotería” .Cada uno de los boletos tiene acceso a distintos recursos del sistema. Tiempo de CPU .Acceso a I/O .Etc.Cada vez que se debe tomar una decisión, se escoge un boleto al azar .Cada proceso tiene una probabilidad de ganar la lotería directamente proporcional a la cantidad de boletos que tenga.Los procesos que se comunican pueden intercambiar boletos.Resuelve problemas difíciles de manejar por otros métodos.
¿Por qué es necesario planificar en un sistema de procesamiento batch?
1.Rendimiento: Procesar el máximo de trabajos por hora 2.Tiempos de retorno: Reducir al mínimo el lapso entre la presentación y la terminación de un trabajo. 3.Utilización de CPU: Mantener ocupado el CPU el mayor tiempo posible .
Se implementan algoritmos de planificación de procesos, que aveces también sirven en sistemas de tiempo compartido. Veremos a continuación en forma específica qué algoritmos de planificación se usan en los sistemas de procesamiento Batch .
First In First Out: Primero en llegar, primero en ser atendido .
Es el algoritmo de planificación más sencillo .No es apropiativo .Se le asignan los procesos al CPU en la medida que se necesita.Existe una cola de procesos listos .
Cuando entra el primer trabajo al sistema, se le asigna el CPU todo el tiempo que sea necesario. A medida que llegan otros trabajos, éstos se asignan al final de la cola .Cuando el primer trabajo termina, se le asigna el CPU al siguiente trabajo de forma inmediata .Cuando un proceso se bloquea, se atiende al siguiente.
Una vez que el proceso bloquedo cambia de estado a listo, éste se ubica al final de la lista. La gran ventaja de este algoritmo es que es muy fácil de diseñar, enteder y programar. Una sola lista enlazada lleva el control de todos los procesos listos .Existe una desventaja importante, los bloqueos.
Es no apropiativo .Requiere un conocimiento previo de los procesos en ejecución (en realidad en la lista de procesos)
Si hay muchos procesos con la misma importancia se escoje el que demoraría menos en terminar primero. Esta estrategia sólo es óptima cuando todos los trabajos están disponibles a la vez .
Tiene una variante que se llama:
Es apropiatiava .Se planifica de acuerdo al tiempo de ejecución restante que le queda a cada proceso .También requiere saber con antelación el tiempo que demora cada proceso en terminar.
Planificación a tres niveles
A medida que llegan los trabajos se les coloca en una cola de entrada que está en el disco. Existe un planificador de admisión, que decide que trabajos son admitidos al sistema .Los trabajos cortos entran rápidamente al CPU, mientras que los largos deben esperar. Una vez que un trabajo ha sido admitido en el sistema, se crea un proceso para él y puede competir por el uso de CPU .Podría suceder que hayan demasiados trabajos para que todos estén en memoria .El segundo nivel decide qué procesos están en memoria y qué procesos están en disco .La decisión debe realizarse con frecuencia .Para tomar esta decisión se revisan los procesos en disco tomando en cuenta los siguientes parámetros.
1.¿Hace cuánto que el proceso se intercambió a disco? 2.¿Cuánto tiempo de CPU ha tenido el proceso recientemente? 3.¿Qué tan grande es el proceso? 4.¿Qué tan importante es el proceso?
En el tercer nivel decide cuál de los procesos cargados en la memoria principal tiene derecho a ejecutarse a continuación .
Este componente se conoce como planificador de CPU