Unidad 2
Unidad 2
Unidad 2
Un proceso no es más que un conjunto de threads(hilos) que ejecutan el mismo código, junto con las
zonas de memoria asociadas a ellos y los ficheros que tienen abiertos.
Un programa consta, al menos, de un proceso, y un proceso, al menos, de un thread. Cuando un
programa tiene varios procesos, lo normal es que cada uno ejecute un código distinto, los cuales se
encuentran en ficheros ejecutables separados. Dos procesos solo pueden compartir una zona de
memoria si esta es definida expresamente como tal. Así mismo, es en este caso cuando los sistemas
de sincronización a la hora de compartir memoria (de los que hablaremos más adelante) se vuelven
especialmente necesarios e importantes.
Durante su vida, un proceso puede pasar por una serie de estados discretos, algunos de ellos son:
Hay otros estados de los procesos, pero en la presente exposición se tratarán estos tres. Por
sencillez, se considera un sistema con una sola CPU, aunque no es difícil la extensión a múltiples
procesadores. Solamente puede haber un proceso en ejecución a la vez, pero pueden existir varios
listos y varios pueden estar bloqueados. Así pues, se forman una lista de procesos listos y otra de
procesos bloqueados. La lista de procesos listos se ordena por prioridad, de manera que el siguiente
proceso que reciba la CPU será el primero de la lista. La lista de procesos bloqueados normalmente
no está ordenada; los procesos no se desbloquean (es decir, no pasan a ser procesos listos) en
orden de prioridad, sino que lo hacen en el orden de ocurrencia de los eventos que están esperando.
Como se verá más adelante, hay situaciones en las cuales varios procesos pueden bloquearse
esperando la ocurrencia del mismo evento; en tales casos es común asignar prioridades a los
procesos que esperan.
El concepto de proceso es más complejo y sutil que el presentado hasta ahora. Engloba dos
conceptos separados y potencialmente independientes: uno relativo a la propiedad de recursos y otro
que hace referencia a la ejecución.
Unidad que posee recursos: A un proceso se le asigna un espacio de memoria y, de tanto en
tanto, se le puede asignar otros recursos como dispositivos de E/S o ficheros.
Unidad a la que se le asigna el procesador: Un proceso es un flujo de ejecución (una traza) a
través de uno o más programas. Esta ejecución se entremezcla con la de otros procesos. De
tal forma, que un proceso tiene un estado (en ejecución, listo, etc.) y una prioridad de
expedición u origen. La unidad planificada y expedida por el sistema operativo es el proceso.
En la mayoría de los sistemas operativos, estas dos características son, de hecho, la esencia de un
proceso. Sin embargo, son independientes, y pueden ser tratadas como tales por el sistema
operativo. Esta distinción ha conducido en los sistemas operativos actuales a desarrollar la
construcción conocida como thread, cuyas traducciones más frecuentes son hilo, hebra y proceso
ligero. Si se tiene esta división de características, la unidad de asignación de la CPU se conoce como
hilo, mientras que a la unidad que posee recursos se le llama proceso.
Dentro de un proceso puede haber uno o más hilos de control cada uno con:
Un estado de ejecución (en ejecución, listo, bloqueado).
Un contexto de procesador, que se salva cuando no esté ejecutándose.
Una pila de ejecución.
Algún almacenamiento estático para variables locales.
Acceso a la memoria y a los recursos de ese trabajo que comparte con los otros hilos.
Los beneficios clave de los hilos se derivan de las implicaciones del rendimiento: se tarda menos
tiempo en crear un nuevo hilo de un proceso que ya existe, en terminarlo, y en hacer un cambio de
contexto entre hilos de un mismo proceso. Al someter a un mismo proceso a varios flujos de
ejecución se mantiene una única copia en memoria del código, y no varias.
Un ejemplo de aplicación que podría hacer uso de los hilos es un servidor de ficheros de una red de
área local. Cada vez que llega una solicitud de una operación sobre un fichero, se puede generar un
nuevo hilo para su gestión. El servidor gestiona multitud de solicitudes, por tanto, se pueden crear y
destruir muchos hilos en poco tiempo para dar servicio a estas peticiones. Si el servidor es un
multiprocesador, se pueden ejecutar varios hilos de un mismo proceso simultáneamente y en
diferentes procesadores.
En general, la concurrencia será aparente siempre que el número de procesos sea mayor que el de
procesadores disponibles, es decir, cuando haya más de un proceso por procesador. La concurrencia
será real cuando haya un proceso por procesador. Aunque puede parecer que la intercalación y la
superposición de la ejecución de procesos presentan formas de ejecución distintas, se verá que
ambas pueden contemplase como ejemplos de procesos concurrentes. Existen diversas razones que
motivan la ejecución de procesos concurrentes en un sistema:
• Facilita la programación de aplicaciones al permitir que éstas se estructuren como un conjunto
de procesos que cooperan entre sí para alcanzar un objetivo común.
• Acelera los cálculos. Si se quiere que una tarea se ejecute con mayor rapidez, lo que se
puede hacer es dividirla en procesos, cada uno de los cuales se ejecuta en paralelo con los
demás.
• Posibilita el uso interactivo a múltiples usuarios que trabajan de forma simultánea.
• Permite un mejor aprovechamiento de los recursos, en especial de la CPU, ya que pueden
aprovechar las fases de entrada-salida de unos procesos para realizar las fases de
procesamiento de otros.
Así como existen las razones que motivan la ejecución de procesos concurrentes, también existen
sus contras:
• Inanición e interrupción de procesos
• Ocurrencia de bloqueos
• Que dos o mas procesos requieran el mismo recurso (No apropiativo)
3. El sistema operativo debe proteger los datos y los recursos físicos de cada proceso contra
injerencias no intencionadas de otros procesos.
4. Los resultados de un proceso deben ser independientes de la velocidad relativa a la que se realiza
la ejecución con respecto a otros procesos concurrentes.
Cuando dos o más procesos llegan al mismo tiempo a ejecutarse, se dice que se ha presentado una
concurrencia de procesos. Es importante mencionar que para que dos o más procesos sean
concurrentes, es necesario que tengan alguna relaciones entre ellos como puede ser la cooperación
para un determinado trabajo o el uso de información y recursos compartidos, por ejemplo: en un
sistema de un procesador, la multiprogramación es una condición necesaria pero no suficiente para
que exista concurrencia, ya que los procesos pueden ejecutarse de forma totalmente independiente.
Por otro lado en un sistema de varios procesos se puede presentar la concurrencia siempre y cuando
las actividades necesiten actuar entre ellos sea para utilizar información como para cualquier otra
cosa.
Regiones críticas
Es posible clasificar las interacciones de los procesos en función del nivel de conocimiento que cada
proceso tiene de la existencia de los demás:
• Los procesos no tienen conocimiento de los demás: Estos son procesos independientes que no
están pensados para operar juntos.
• Los procesos tienen un conocimiento indirecto de los otros: Los procesos no conocen
necesariamente a los otros, pero comparten el acceso a algunos objetos.
• Los procesos tienen un conocimiento directo de los otros: Los procesos son capaces de
comunicarse con los demás y están diseñados para trabajar conjuntamente en alguna actividad.
Exclusión mutua
La exclusión mutua la podríamos definir como una operación de control que permite la coordinación
de procesos concurrentes, y que tiene la capacidad de prohibir a los demás procesos realizar una
acción cuando un proceso haya obtenido el permiso.
El control de la competencia involucra al sistema operativo inevitablemente, porque es el sistema
operativo el que asigna los recursos. Además, los procesos deben ser capaces por sí mismos de
expresar de algún modo los requisitos de exclusión mutua, como puede ser bloqueando los recursos
antes de usarlos.
Hacer que se cumpla la exclusión mutua crea dos problemas de control adicionales.
• Interbloqueo. Si se tienen dos procesos P1 y P2 y dos recursos críticos, R1 y R2. Supóngase
que cada proceso necesita acceder a ambos recursos para llevar a cabo una parte de su
función. En tal caso, es posible que se presente la siguiente situación: el sistema operativo
asigna R1 a P2 y R2 a P1. Cada proceso está esperando a uno de los dos recursos. Ninguno
liberará el recurso que ya posee hasta que adquiera el otro y ejecute su sección crítica.
Ambos procesos están ínterbloqueados.
• Inanición. Supóngase que tres procesos, P1, P2 y P3, necesitan acceder periódicamente al
recurso R. Considérese la situación en la que P1 está en posesión del recurso y tanto P2
como P3 están parados, esperando al recurso. Cuando P1 abandona su sección crítica, tanto
P2 como P3 deben poder acceder a R. Supóngase que se le concede el acceso a P3 y que,
antes de que termine su sección crítica, P1 solicita acceso de nuevo. Si se le concede el
acceso a P1 después de que P3 termine y si P1 y P3 se conceden el acceso repetidamente el
uno al otro, se puede negar definidamente a P2 el acceso al recurso.
Soluciones por Software. Una manera es dejar la responsabilidad a los procesos que deseen
ejecutar concurrentemente, de esta manera los procesos deben coordinarse unos con otros para
cumplir la exclusión mutua sin ayuda alguna, aunque estas soluciones son propensas a errores y a
una fuerte carga de proceso (Algunos ejemplos de estas son: Algoritmo de Dekker y Algoritmo de
Peterson).
Soluciones por Hardware. Propone el uso de instrucciones de la máquina a tal efecto, estas tienen
la ventaja de reducir la sobrecarga.
El tercer método consiste en dar algún tipo de soporte en el sistema operativo, entre estos métodos
se encuentran los semáforos, monitores, paso de mensajes, etc.
Para que los procesos puedan sincronizarse es necesario disponer de servicios que permitan
bloquear o suspender bajo determinadas circunstancias la ejecución de un proceso. Los principales
mecanismos de sincronización que ofrecen los sistemas operativos son:
• Señales.
• Tuberías.
• Semáforos.
• Mutex y variables condicionales.
• Paso de mensajes.
• Tuberías.
Una tubería es un mecanismo de comunicación y sincronización. Conceptualmente, cada proceso ve
la tubería como un conducto con dos extremos, uno de los cuales se utiliza para escribir o insertar
datos y el otro para extraer o leer datos de la tubería.
Un mecanismo semáforo consta básicamente de dos operaciones primitivas señal (Signal) y espera
(Wait) (Originalmente definidas como P y V por Disjkstra), que operan sobre un tipo especial de
variable semáforo, “s”. La variable semáforo puede tomar valores enteros y, excepto posiblemente en
su inicialización, solo puede ser accedida y manipulada por medio de las operaciones SIGNAL y
WAIT. Ambas primitivas llevan un argumento cada una, la variable semáforo, y pueden definirse del
modo siguiente..:
SIGNAL (s) ..:
Incrementa el valor de su argumento semáforo, s , en una operación indivisible.
WAIT (s) ..:
Decrementa el valor de su argumento semáforo, s , en tanto el resultado no sea negativo. La
conclusión de la operación WAIT, una vez tomada la decisión de decrementar su argumento
semáforo, debe ser individual.
Ejemplo..:
Wait(s): While not (s > 0) do {Seguir Probando};
S := s - 1;
Signal(s) s := s + 1;
Un semáforo cuya variable solo tiene permitido tomar los valores 0 (ocupado) y 1 (libre) se denomina
Semáforo Binario. Un Semáforo General puede tomar cualquier valor entero. La lógica de las
operaciones WAIT y SIGNAL aplica tanto para Semáforos Binarios como Semáforos Generales.
Propiedades
Los semáforos son un mecanismo relativamente sencillo pero poderoso de asegurar la exclusión
mutua entre procesos concurrentes para acceder a un recurso compartido. En vez de que lo usuarios
inventen sus propios protocolos de sincronización (tarea difícil y traicionera) los semáforos son una
herramienta proporcionada por el diseñador de sistemas. Los usuarios solo necesitan contribuir a
controlar el acceso a los recursos compartidos obedeciendo un protocolo estándar y sencillo.
Los semáforos pueden estar disponibles en un lenguaje de programación, como construcción del
lenguaje, o como servicio del sistema operativo invocado mediante llamadas al sistema. Cuando son
proporcionadas por el sistema operativo, las variables semáforos no son declaradas ni manipuladas
en el lenguaje, sino que se manipulan a través de llamadas al sistemas tales como ..:
CREAR_SEMAFORO, ASOCIAR_A_SEMAFORO, ESPERAR, SEÑAL, CERRAR_SEMAFORO.
Los bloqueos mutuos pueden ser evitados si se sabe cierta información sobre los procesos antes de
la asignación de recursos. Para cada petición de recursos, el sistema controla si satisfaciendo el
pedido entra en un estado inseguro, donde puede producirse un bloqueo mutuo. De esta forma, el
sistema satisface los pedidos de recursos solamente si se asegura que quedará en un estado seguro.
Para que el sistema sea capaz de decidir si el siguiente estado será seguro o inseguro, debe saber
por adelantado y en cualquier momento el número y tipo de todos los recursos en existencia,
disponibles y requeridos.
2.4.3.2 Detección Interbloqueo DeadLock
Según William Stallings (1999) las estrategias de prevención del interbloqueo son muy
conservadoras; solucionan el problema del interbloqueo limitando el acceso a los recursos e
imponiendo restricciones a los procesos. En el lado opuesto, las estrategias de detección del
interbloqueo no limitan el acceso a los recursos ni restringen las acciones de los procesos. Con
detección del interbloqueo, se concederán los recursos que los procesos necesiten siempre que sea
posible. Periódicamente, el sistema operativo ejecuta un algoritmo que permite detectar la condición
de círculo vicioso de espera. Puede emplearse cualquier algoritmo de detección de ciclos en grafos
dirigidos.
El control del interbloqueo puede llevarse a cabo tan frecuentemente como las solicitudes de recursos
o con una frecuencia menor, dependiendo de la probabilidad de que se produzca el interbloqueo. La
comprobación en cada solicitud de recurso tiene dos ventajas: Conduce a una pronta detección y el
algoritmo es relativamente simple, puesto que está basado en cambios increméntales del estado del
sistema. Por otro lado, tal frecuencia de comprobaciones consume un tiempo de procesador
considerable. Una vez detectado el interbloqueo, hace falta alguna estrategia de recuperación.
2.4.3.3 Recuperación Interbloqueo DeadLock
Según William Stallings (1999) Las técnicas siguientes son posibles enfoques, enumeradas en orden
creciente de sofisticación:
1. Abandonar todos los procesos bloqueados. Esta es, se crea o no, una de las soluciones más
comunes, si no la más común, de las adoptadas en un sistema operativo.
2. Retroceder cada proceso interbloqueado hasta algún punto de control definido previamente y
volver a ejecutar todos los procesos. Es necesario que haya disponibles unos mecanismos de
retroceso y reinicio en el sistema. El riesgo de esta solución radica en que puede repetirse el
interbloqueo original. Sin embargo, el no determinismo del procesamiento concurrente asegura, en
general, que esto no va a pasar.
3. Abandonar sucesivamente los procesos bloqueados hasta que deje de haber interbloqueo. El
orden en el que se seleccionan los procesos a abandonar seguirá un criterio de mínimo coste.
Después de abandonar cada proceso, se debe ejecutar de nuevo el algoritmo de detección para ver
si todavía existe interbloqueo.
4. Apropiarse de recursos sucesivamente hasta que deje de haber interbloqueo. Como en el punto 3,
se debe emplear una selección basada en coste y hay que ejecutar de nuevo el algoritmo de
detección después de cada apropiación. Un proceso que pierde un recurso por apropiación debe
retroceder hasta un momento anterior a la adquisición de ese recurso.
Se denomina planificador al software del sistema operativo encargado de asignar los recursos de un
sistema entre los procesos que los solicitan. Siempre que haya tomar una decisión, el planificador
debe decidir cuál de los procesos que compiten por la posesión de un determinado recursos lo
recibirá.
Los algoritmos (técnicas) tienen distintas propiedades según los criterios en los que se basen para su
construcción, lo cual se refleja en qué tipo de procesos se puede ver favorecido frente a otro en la
disputa del procesador. Antes de realizar la elección de un algoritmo se debe considerar las
propiedades de estos frente al criterio de diseño elegido.
2.6.1FIFO
Se concluye lo siguiente:
FIFO: First In First Out
Mecanismo de scheduling en el cual los procesos se ordenan en una fila, en la cual se ejecutan cada
uno de los procesos hasta su finalizacion secuencialmente. Es tremendamente ineficiente.
Cuando se tiene que elegir a qué proceso asignar la CPU se escoge al que llevara más tiempo listo.
El proceso se mantiene en la CPU hasta que se bloquea voluntariamente. Para implementar el
algoritmo sólo se necesita mantener una cola con los procesos listos ordenada por tiempo de llegada.
Cuando un proceso pasa de bloqueado a listo se sitúa el último de la cola.
2.6.2 SJF
Vemos que al igual que en el algoritmo FIFO las ráfagas se ejecutan sin interrupción, por tanto, sólo
es útil para entornos batch. Su característica es que cuando se activa el planificador, éste elige la
ráfaga de menor duración. Es decir, introduce una noción de prioridad entre ráfagas.
Hay que recordar que en los entornos batch se pueden hacer estimaciones del tiempo de ejecución
de los procesos. La ventaja que presenta este algoritmo sobre el algoritmo FIFO es que minimiza el
tiempo de finalización promedio.
2.6.3 RR
Vemos que cada proceso tiene asignado un intervalo de tiempo de ejecución, llamado cuantum o
cuánto. Si el proceso agota su cuantum de tiempo, se elige a otro proceso para ocupar la CPU. Si el
proceso se bloquea o termina antes de agotar su cuantum también se alterna el uso de la CPU.
El round es muy fácil de implementar. Todo lo que necesita el planificador es mantener una lista de
los procesos listos.
2.6.4 QuevesMultilevel
Según Tanenbaum y Woodhull (1997) es un algoritmo de planificación multinivel particiona la cola de
listos en colas separadas. Se asignan en forma permanente los trabajos a una cola, generalmente,
basándose en alguna propiedad del mismo (requerimientos de memoria, tipo de trabajo), teniendo
cada cola su propio algoritmo. Por ejemplo, la cola interactiva podría planificarse usando RR y la
batch FIFO.
Ningún trabajo en una cola de baja prioridad puede ejecutarse si las colas con mayor prioridad no
están vacías. Si algún trabajo entra en una cola de mayor prioridad, el trabajo de otras colas es
interrumpido.
SISTEMAS OPERATIVOS
GRUPO: B