2 Procesos
2 Procesos
2-1
PROCESOS
CONCEPTO DE PROCESO
En principio, un proceso es un programa en ejecución. Sin embargo, con más precisión, podemos decir
que:
Hasta a mediados del siglo pasado una computadora ejecutaba un programa y, al terminar, ejecutaba
el siguiente; las computadoras tenían una CPU o procesador que podía atender un sólo proceso a la
vez. Se formaba una línea de espera en la que cada retraso en la ejecución de un proceso afectaba al
resto de los procesos en la fila. Podemos hacer las siguientes observaciones:
Aclaremos que el tiempo en que un proceso está en trámite de ejecución consta de los lapsos en que
el proceso está en ejecución y de los lapsos en que está en espera. En la figura siguiente se representa
la ejecución (concurrente) de 4 procesos en un procesador, los cuales pueden ser atendidos uno a
vez. En cada momento sólo un proceso usa al procesador.
Un programa puede tener más de una ejecución en un momento dado, con lo que se tiene el
segundo origen de la concurrencia:
Por otra parte, como hay programas que generan más de un proceso en la misma instancia de
ejecución, eso podría ser considerado como el tercer origen de la concurrencia:
EL MULTIPROCESO
Por algún tiempo, las computadoras tuvieron una CPU o procesador capaz de atender un solo proceso;
eran los monoprocesadores. La capacidad de cómputo se aumentaba con una creciente rapidez en
sus relojes, pero recientemente ha sido difícil aumentar esa rapidez, debido a dificultades físicas,
como la mayor generación de calor a mayor rapidez del reloj.
Por eso, se ha optado por colocar varios núcleos o procesadores en una CPU para lograr más
capacidad de cómputo; otra opción hubiera sido conectar varios procesadores separados, pero esto
no es muy común. Con las CPUs multinúcleo se obtiene el multiproceso o multiprocesamiento. La
figura muestra el esquema del chip de una CPU con un núcleo y de otra con dos núcleos; en esta
última se puede lograr la ejecución en paralelo (paralelismo efectivo).
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-3
El núcleo, en este caso, es un dispositivo; en inglés se dice core y significa algo interno. Por otra parte,
el núcleo, como sinónimo de sistema operativo, en inglés se dice kernel y significa una pepita o grano;
esto alude a una estructura del sistema operativo en capas.
Internamente, la CPU decide qué núcleo ejecuta un determinado proceso; también se pueden
establecer por el usuario o en el mismo proceso los núcleos que podrá usar ese proceso. A esto se le
ha llamado establecer la afinidad de un proceso a los núcleos. Por otra parte, si un proceso ha estado
usando un procesador, se produce una afinidad a ese procesador debido a los datos almacenados los
registros y en alguna memoria asociada a ese núcleo (que el sistema operativo detecta como un
procesador).
Aunque haya dos o más núcleos, puede también ser conveniente atender a los procesos, sólo por
lapsos de tiempo, siempre que el número de procesos sea mayor que el de los núcleos.
En la figura siguiente se representa una posible ejecución paralela de 4 procesos en una CPU con 2
núcleos. En cada momento, sólo 2 de los 4 procesos usan algún núcleo.
El tiempo de actividad de un proceso es, en principio, asignado por el sistema operativo; sin embargo,
puede ser que, antes de que concluya el tiempo de un proceso, éste sea desactivado para iniciar la
ejecución una rutina de servicio de una interrupción o porque el proceso, de momento, no esté
usando el procesador, sino otro dispositivo, como alguno de E/S.
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-4
Si el procesador tiene N núcleos, puede sustituirse en el diagrama el bloque del procesador por un
bloque con los núcleos, de modo que pueden ejecutarse, al mismo tiempo, el mismo número de
procesos (multiproceso). El diagrama mostrado también puede extenderse de otras formas:
1. El diagrama contiene una cola para los procesos bloqueados, pero puede extenderse si hay
varios tipos de recursos por los que los procesos esperen; se usaría una cola para cada tipo de
bloqueo. También se puede extender el diagrama por la espera de una condición, sin que haya
una cola.
2. Un proceso puede ser suspendido por solicitud del usuario u otro proceso. En este caso estaría
inactivo y en espera de ser reanudado.
También, tomemos en cuenta que, en cualquier momento, un proceso puede ser terminado.
Los diagramas de estado son una técnica conocida para describir el comportamiento de un sistema.
Describen todos los estados posibles en los que puede entrar un objeto particular y la manera en que
cambia el estado del objeto, como resultado de los eventos que lo involucran. Podemos representar
el diagrama anterior usando los siguientes estados:
Podemos añadir, sólo como referencia, el estado de un proceso nuevo antes de su ejecución, o el
del proceso que ya terminó su actividad. La siguiente figura muestra un diagrama de estado para los
procesos.
Este diagrama se puede aumentar, como se mencionó en el diagrama de proceso, para expresar el
bloqueo por diferentes razones y el estado de Suspendido (a la espera de una señal). También pudiera
ser que un proceso debe ejecutarse por un procesador de un conjunto previamente designado de
procesadores; en ese caso, deberían añadirse estados de Listo diferentes, para cada conjunto de
procesadores autorizados para la ejecución.
• También se debe tomar en cuenta la mayor complejidad de los programas, tanto para dividir
el trabajo en una aplicación como para integrar finalmente las partes resultantes.
• El cambio de la atención de un proceso a otro representa una sobrecarga de trabajo, puesto
que se debe desalojar un proceso de la CPU, antes de terminar, para incorporar a otro, el cual
también podrá ser desalojado antes de terminar. Ese trabajo extra no era necesario cuando
se ejecutaba un proceso ininterrumpidamente hasta terminar.
• Un proceso puede requerir la ejecución en serie, esto es, el código puede impedir que la
ejecución sea en paralelo.
Todo lo anterior aplica también a los hilos de un mismo proceso, los cuales se describen más adelante.
El sistema operativo puede construir una tabla de procesos en la memoria; contiene una lista de los
procesos admitidos para ejecución y una referencia a la imagen de cada proceso, la cual contiene lo
necesario para la ejecución. En la siguiente figura se muestra un modelo de la implementación de los
procesos; nótese que cada proceso es relativamente independiente de los demás. Como ejemplo, el
denominado Proceso 2 está en ejecución.
b) Datos del estado del procesador. Incluye el contenido de los registros cuando el proceso
fue desalojado de una CPU. Si el proceso está ejecutando, el procesador contiene su estado
actual.
c) Datos de control del proceso. El estado del proceso y, si está bloqueado, datos referentes
al evento que el proceso espera, identificación de los hijos y de otros procesos relacionados
con el proceso en cuestión; además, los recursos a los que el proceso tiene acceso.
Cada proceso ejecuta por el tiempo preasignado (o hasta que haya una interrupción o le falte un
recurso necesario); luego, si no ha terminado de ejecutar, es desalojado de la CPU, cuyo contenido es
respaldado en el bloque de control de proceso hasta que ese proceso sea reinstalado en la CPU.
Cuando un proceso continúa su ejecución, el contenido de los registros es copiado a la CPU; junto con
el contenido de la pila y los demás valores almacenados en la RAM, el proceso recupera las
condiciones en las que se encontraba cuando fue desalojado.
Brevemente, podemos decir que un proceso es creado, se ejecuta hasta completarse (aunque sea en
diferentes lapsos de tiempo) o hasta que sea terminado porque se detecte algún error o por alguna
otra razón.
En Windows, un proceso padre recibe una referencia (handle) con la cual puede controlar al hijo; sin
embargo, puede pasar esa referencia a otro proceso, con lo cual se pierde la jerarquía original. Los
procesos System y System Idle Process no tienen padre; un usuario puede encargarle a [Link]
que se ejecuten diversos programas, por lo que puede tener muchos hijos. Algún proceso puede ser
hijo de un padre identificado pero desaparecido.
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-8
La siguiente figura muestra cómo el padre da lugar al hijo; puede ser que ambos continúan por su
parte, como se muestra en la primera figura, o que el padre espere la terminación del hijo, según se
muestra en la segunda figura. En este último caso, el proceso padre incluye, en algún lenguaje el inicio
(tal vez start()) y la espera (tal vez join()) de la terminación del hijo.
• Un nuevo proceso puede hacer el mismo tipo de actividad que el padre, pero de forma
"simultánea" con la del padre; puede "extender al padre". Por ejemplo, en un esquema
cliente-servidor cuando se desea monitorear posibles conexiones mientras se trabaja con las
conexiones que ya se tienen. Se genera un conjunto de procesos (el padre y los hijos); si alguno
de ellos es bloqueado o suspendido, algún otro puede ejecutar, mejorando el rendimiento.
Sin embargo, la creación de varios procesos puede sobrecargar el uso de recursos, como la
memoria.
• Un nuevo proceso puede hacer cosas diferentes a las que hace el padre. Un ejemplo en
Windows el proceso [Link], el cual gestiona la interfaz gráfica de usuario y permite abrir
diversos programas; estos últimos tendrán tareas generalmente diferentes.
Un proceso padre puede terminar, aunque el proceso hijo siga en ejecución; por ejemplo, podemos
terminar [Link] y sus descendientes seguirán ejecutando.
PRÁCTICA
1. Use Autoruns (de Sysinternals) para determinar los procesos que se inician cuando Windows
arranca, con lo que se aumenta la carga de trabajo. Puede optar por ejecutarlo como administrador
y desmarcar algún proceso para que no se ejecute cuando inicia Windows.
4. Intente verificar, para programas existentes, la definición de proceso con sus variantes, según
aparece en la página 1.
* Repita lo anterior pero primero elabore las aplicaciones necesarias.
5. Use [Link] para examinar la captura (anotación) de la actividad de los procesos: Permita
que la pantalla se desplace hacia abajo.
Borre las capturas existentes.
Interrumpa la captura de la actividad.
Guarde las anotaciones en un archivo de texto en forma de tabla (CSV).
6*. Elabore aplicaciones, separadamente, que actúen sobre otro proceso: que soliciten la creación de
otro proceso con el código de un programa aparte, que lo suspendan y reanuden, que establezcan su
afinidad con los procesadores y que lo terminen.
Un proceso puede llegar a tener más de un hilo; ese proceso sería multihilo. Un hilo es la secuencia
básica de instrucciones que el sistema operativo puede programar para su ejecución. Incluye un
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-10
identificador (thread ID), el contenido de los registros (el contador del programa, entre otros). Un
proceso puede tener uno o más hilos, pero cada hilo está incluido en un solo proceso.
Los hilos dentro de un proceso pueden compartir, si se requiere, recursos del proceso tales como el
código, datos y los archivos abiertos. La siguiente figura muestra, en forma simplificada, la ejecución
de un proceso con un hilo y de otro con dos hilos; en este último, muestra que los hilos podrían
compartir código, datos y archivos, pero no pueden compartir la pila y los registros. Cada hilo tiene
asignado para sí un bloque de la memoria dentro del espacio asignado al proceso correspondiente.
El proceso sigue en ejecución mientras al menos uno de sus hilos de ejecución siga activo. El proceso
finaliza si, y sólo si, todos sus hilos de ejecución también han terminado.
En un proceso multihilo podemos identificar un hilo primario o principal, el cual se inicia cuando se
inicia el proceso; ese hilo inicia la ejecución de uno o más hilos (secundarios), los cuales, a su vez,
podrían iniciar otros hilos. En algún lenguaje, se inicia otro hilo llamando a start(); vea la figura.
A su vez, los hilos 2 y 3 arriba mostrados podrían generar otros hilos; se produce una estructura
jerárquica (árbol), similar a la figura de la página 7. Tomemos en cuenta las figuras de la página 2, en
relación a que los hilos se encuentran en el trámite de ejecución aunque, en un momento dado,
solamente están en ejecución aquellos que disponen, cada uno, de un procesador.
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-11
Puede establecerse que el hilo primario espere a que el hilo secundario termine para que se una con
el hilo primario; en algún lenguaje, eso se obtiene cuando el primer hilo llama a join(). En algún
lenguaje esto se considera una terminación normal de los hilos. Vea la figura.
Las figuras anteriores muestran que más de una actividad podría realizarse al mismo tiempo,
dependiendo de la disponibilidad de los procesadores y de otros factores.
• En la memoria residen diversos hilos de un mismo proceso, cada uno de los cuales demanda que
un núcleo lo atienda para que pueda ejecutarse.
Adicionalmente, algunos núcleos pueden ejecutar dos hilos del mismo proceso, aunque tal vez el
desempeño no sea el doble del caso de núcleos con un hilo; esto se conoce como Hyper Threading
(Intel) o Simultáneos Multi Threading (SMT en AMD). En Windows, si el núcleo maneja un hilo es
detectado como un procesador lógico; si maneja dos hilos es detectado como dos procesadores
lógicos.
Por ahora, no parece útil la construcción de núcleos que manejen más de dos hilos, debido a la
complejidad involucrada en el diseño.
La multiplicidad de los hilos tiene las mismas ventajas (y desventajas) que la multiplicidad de procesos
expuestas en las páginas 5. Un hilo es creado para realizar uno de los tipos de tarea según se explicó
en la página 8 para los procesos.
Debemos tomar en cuenta que los procesos usan espacios separados en la memoria, mientras que los
hilos de un mismo proceso se encuentran en el espacio asignado al proceso; parte de ese espacio es
usado separadamente por cada hilo, aunque los hilos podrían compartir algún código o datos. Por
eso, la creación de nuevos hilos tiene las siguientes ventajas respecto a la creación de nuevos
procesos:
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-12
• Los hilos de un proceso se comunican más fácilmente entre sí que los procesos, por lo que en
algunos programas, como los juegos, puede preferirse crear más hilos en un proceso que crear
nuevos procesos.
• Al ser más ligeros que un proceso, es más fácil crearlos, ponerlos en ejecución o suspenderlos;
también es más fácil terminar los hilos.
Sin embargo, la existencia de procesos multihilo complica aún más la administración de los procesos.
EJEMPLO DE PARALELISMO
Podemos partir la tarea en 2 partes y encomendar una parte a cada uno de dos hilos H1 y H2, según
se muestra:
H1: s1 = 5(6)+3(9); H2: s2 = 12(1)+4(2).
PRÁCTICA
La ejecución concurrente de los procesos complica la administración de los procesos puesto que
permite diversas situaciones que no se presentaban en los sistemas operativos monotarea. Surgen las
necesidades siguientes:
• Sincronización. La ejecución concurrente puede requerir que los hilos sean sincronizados.
• Comunicación. Se debe permitir a los hilos comunicarse entre sí; la comunicación es necesaria
para la sincronización, por ejemplo.
• Atención a los bloqueos. Un hilo puede bloquear a otros; además, un grupo de procesos
pueden bloquearse entre sí.
• Administración de los procesadores (o núcleos). Se debe establecer qué hilo utilizará algún
procesador y por cuánto tiempo.
• Administración de la memoria. Se debe establecer cuánta memoria se asignará a un proceso
y por cuánto tiempo. El tema de la memoria se tratará en el siguiente capítulo.
INTRODUCCIÓN
Considere los hilos de ejecución según se muestra en la figura; pueden corresponder a procesos
diferentes o al mismo proceso (multihilo). Lo que se plantea es cómo será el desarrollo de las acciones.
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-14
• Independientes: La ejecución de uno no influye en la ejecución del otro; es el caso más simple.
• Cooperativos: La ejecución de uno sí influye en la ejecución del otro.
Uno de estos casos es aquel en que el primero espera a que el segundo termine y se reúna con él. Por
otra parte, no está claro qué tan rápido puede ejecutar un hilo respecto al otro. En general, podemos
decir que el resultado de la ejecución de un proceso dependerá del avance relativo de cada rama, el
cual puede ser diferente en cada ejecución; es lo que se llama una condición de carrera.
Pero incluye la noción de intromisión de un hilo en la actividad de otro(s), lo que puede producir
resultados inesperados.
El progreso en la ejecución de cada rama depende de varios factores entre los que se incluyen la
naturaleza de la actividad de cada rama y de la disponibilidad de los recursos que tiene cada una. Esta
condición se presentó con la multiprogramación original, pero se hizo más importante en la ejecución
paralela, cuando aparecieron las CPUs multinúcleo.
Los resultados inesperados pueden constituir un problema; para evitarlo, la ejecución concurrente de
los hilos puede sincronizarse.
PRÁCTICA
Elabore un programa multihilo en el que se manifiesten los efectos de carrera entre los hilos;
introduzca retrasos para modificar las condiciones de ejecución.
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-15
• En tiempos diferentes, sin traslape, no importando el orden en que ejecuten. Tenemos como
ejemplo la solución al problema de la sección crítica, que describiremos casi enseguida.
• En tiempos diferentes, sin traslape, pero en un orden preestablecido. Mostraremos más
adelante cómo puede establecerse un orden en la ejecución.
En la vida diaria, tenemos situaciones en las que la actividad concurrente puede tener un resultado
inesperado. Por ejemplo:
• En una juguetería, el empleado atiende al cliente A cuando se llega al punto en que ese cliente
pregunta al empleado si tiene un osito de peluche, a lo que el empleado responde que sí.
• El empleado, que ha notado la espera del cliente B, se dirige a este último, desatendiendo al
cliente A. El cliente B pregunta al empleado si tiene un osito de peluche y después que el
empleado responde afirmativamente, decide comprarlo y se retira del comercio. El osito de
peluche vendido era el último en existencia.
• El empleado nuevamente atiende al cliente A, quien le indica que desea comprar el osito de
peluche por el que ha preguntado. El empleado responde que no tiene ningún osito en
existencia.
Cliente A Cliente B
Preguntar si hay osito. Preguntar si hay osito.
Si hay osito, comprarlo. Si hay osito, comprarlo.
La ejecución, sin haber sincronización, puede realizarse según se muestra a continuación, tomando
en cuenta que el empleado puede asignar un tiempo al cliente A y después pasar al cliente B;
después, volverá a atender al cliente A.
Cliente A Cliente B
Preguntar si hay osito.
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-16
El problema consiste en la ejecución concurrente de la sección crítica de dos hilos con un posible
resultado no previsto. En este caso, se trata de la concurrencia que aparece en la multiprogramación,
en la que hay un solo procesador. La solución implica sincronizar la actividad de cada hilo de modo
que se eviten los resultados indeseables.
La solución consiste en sincronizar las actividades de atención a cada cliente de modo que se realicen
en tiempos diferentes, sin importar el orden. Enseguida se muestra una posible solución:
Cliente A Cliente B
Preguntar si hay un osito. …
Si hay el osito, comprarlo. …
Preguntar si hay un osito.
Si hay el osito, comprarlo.
De esa manera, no se daría el resultado inesperado para el Cliente B de ser rechazada su compra
después de que se le había dicho que sí había ese osito en existencia. De forma similar, el resultado
inesperado no se daría si se atendiera al Cliente B completamente antes de atender al Cliente A.
En la computadora
La ejecución intercalada de hilos que acceden a la misma variable puede producir una condición de
carrera que podría conducir a un resultado inesperado. Consideremos el caso de dos hilos A y B, en
una computadora con un solo procesador, según se muestra en la figura.
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-17
El hilo A está siendo ejecutado pero en t=t1 se cambia la ejecución a B para reanudar la ejecución de
A en t=t2; en t3 la ejecución pasa al hilo B.
El problema se puede producir aun en porciones de código mínimas; como ejemplo consideremos los
hilos Ha y Hb que acceden a la variable común cont cuyo valor es 5; Ha incrementa en 1 el valor del
contador (cont=cont+1) pero Hb lo disminuye en 3 (cont=cont-3). Parece lógico pensar que si se
permite actuar a ambos hilos, entonces el valor del contador quedará en 3. Esto es cierto si los hilos
se ejecutan secuencialmente, primero uno de ellos completamente y luego el otro. Sin embargo, si se
permite la ejecución concurrente de los procesos, el valor puede ser 2 o 6.
La ejecución de cada una de esas instrucciones a bajo nivel no es atómica: consta de varias actividades.
En una CPU los datos se encuentran almacenados en registros y las operaciones se llevan a cabo por
la ALU. Para nuestro ejemplo usaremos los registros, reg1 y reg2, aunque, si se trata de una CPU con
un procesador, puede tratarse del mismo registro en ambos casos.
Tanto en las computadoras con varios núcleos como en los multiprocesadores, la actividad de
diferentes hilos, sean de un mismo proceso o de diferentes procesos, puede llevarse a cabo
simultáneamente. Claramente, la posibilidad de que un hilo influya en la actividad de los demás
aumenta cuando acceden a valores comunes. Considere el ejemplo de la juguetería con dos
vendedores atendiendo cada uno un cliente; la posibilidad de resultados inesperados aumenta por la
actividad simultánea de los vendedores accediendo a los mismos juguetes. Considere que un
vendedor se dirige a traer el juguete mientras que otro ya tiene posesión de él.
Este problema no se presentaba en las etapas iniciales de los sistemas operativos, puesto que cada
proceso ejecutaba completamente antes que cualquier otro.
En el caso mostrado, la actualización del contador constituye el segmento llamado sección crítica o
región crítica, y su ejecución por parte de un hilo debe excluir la ejecución de la sección crítica
correspondiente a cualquiera de los demás hilos, puesto que se modifica un dato común. Por otra
parte, cualquier segmento restante o independiente de los procesos, en el que no modifican datos en
común, la actividad de cada proceso podrá desarrollarse sin restricciones.
• Sección crítica
• Sección restante
Puede haber múltiples instancias de cada tipo. Como una ilustración, presentaremos un esquema de
la solución al problema de la sección crítica que incluye un segmento de cada tipo.
• Sección crítica.
- Esperar a que se asegure la ejecución exclusiva del hilo.
- Ejecutar su sección crítica.
- Permitir a otro hilo ejecutar su sección crítica.
• Sección restante.
- Ejecutar esta sección sin ninguna restricción.
MECANISMOS DE SINCRONIZACIÓN CON DOS OPERACIONES
Estos mecanismos pueden resolver el problema de región crítica y algunos otros. Contienen dos
operaciones, con diversas metáforas o modelos, entre las que se encuentran las fichas, los semáforos
binarios y los cerrojos.
FICHA
Podemos establecer una ficha (permiso) tal que, en la ejecución concurrente, sólo pueda continuar
su ejecución el hilo que la tenga. La sincronización usa la variable Ficha, la cual puede tener uno de
los valores Usada y Libre; se lleva a cabo con dos operaciones primitivas e indivisibles:
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-19
• Adquiere(Ficha). El hilo que ejecuta Adquiere() obtiene la ficha que le da derecho a proseguir.
Primero debe esperar a que la ficha esté en Libre; cuando ya lo está, se apropia de ella,
poniéndola en Usada para impedir la ejecución a otros hilos.
• Libera(Ficha). Libera la ficha, permitiendo que algún otro hilo pueda tomarla.
SEMÁFORO BINARIO
El semáforo es el mecanismo más conocido, muy parecido al de la ficha pero inspirado en los
semáforos que controlan el tráfico en las calles, de los que toma su nombre; un semáforo permite a
un cierto número de hilos acceder a un determinado recurso. Presentaremos una versión simplificada,
denominada semáforo binario, el cual permite a un solo hilo el acceso a determinados recursos.
El semáforo tiene la variable Paso que puede tomar uno de los valores Rojo y Verde; tiene dos
operaciones, consideradas indivisibles, que llamaremos Adquiere() y Libera(), las cuales constituyen
dos puntos de sincronización.
• Adquiere(Paso). El hilo que ejecuta Adquiere() obtiene el derecho a proseguir. Primero espera
a que Paso esté en Verde; cuando ya está en Verde lo pone en Rojo para impedir la ejecución
a otros hilos.
• Libera(Paso). Pone Paso en Verde, por lo que alguno de los demás hilos puede tomar el control
del semáforo.
EL CERROJO
El cerrojo es un objeto Obj que tiene dos operaciones primitivas, consideradas indivisibles, que
llamaremos [Link]() y [Link](), las cuales constituyen dos puntos de sincronización.
• [Link](). El hilo que ejecuta [Link]() espera a que el cerrojo esté abierto y luego lo
cierra, impidiendo que cualquier otro proceso continúe su ejecución.
• [Link](). Se encarga de abrir el cerrojo, con lo que alguno de los demás hilos puede
continuar su ejecución.
El resultado inesperado en una sección crítica se evita impidiendo que la ejecución concurrente de los
hilos se entrelace. Eso se logra mediante la ejecución secuencial (exclusión mutua) de los hilos durante
la sección crítica, esto es, sólo un hilo ejecutará la sección crítica a la vez, aunque haya varios
procesadores disponibles. En este último caso, la inactividad de uno o más procesadores aumenta el
tiempo de ejecución pero garantiza los resultados esperados de una ejecución.
Ficha Cerrojo
Adquiere(Ficha) [Link]()
Sección crítica Sección crítica
Libera(Ficha) [Link]()
Explicaremos el problema en términos de las fichas. El programador que utilice fichas para sincronizar
hilos, debe ser cuidadoso. Por ejemplo, si el programador omite Libera(Ficha) después de la sección
crítica, otros hilos pueden estar detenidos indefinidamente, en una condición llamada inanición
(como un símil de la condición alimenticia); en este caso se dice que el hilo bloquea a los demás. Esto
corresponde a un primer caso de bloqueo, mencionado anteriormente.
Como ejemplo, suponga que el hilo H1 ejecuta su sección crítica pero no libera la ficha. Los hilos H2 y
H3, que esperan por la ficha para continuar su ejecución, no podrán obtener esa ficha. Se establece
una relación: la espera, por tiempo indefinido, de H2 y H3 para que H1 libere la ficha. La figura
representa esa situación.
Por otra parte, si el programador omite poner Adquiere(Ficha) antes de una sección crítica, puede
irrumpir en la ejecución de la sección crítica de otro hilo. Enseguida presentamos otro ejemplo de
error; utiliza dos fichas tentativamente en la forma mostrada.
Hilo 1 Hilo 2
Adquiere(Ficha1)
Adquiere(Ficha2)
Adquiere(Ficha2)
… Adquiere(Ficha1)
…
El hilo 1 ejecuta Adquiere(Ficha1) y luego el hilo 2 ejecuta Adquiere(Ficha2). Los hilos esperarán
indefinidamente puesto que ni el hilo 1 puede ejecutar Adquiere(Ficha2) ni el hilo 2 puede ejecutar
Adquiere(Ficha1). En este caso los hilos se bloquean mutuamente; esto es parte de un tema que será
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-21
tratado más adelante, pero adelantemos que hay una relación circular de espera, según se muestra
en la figura.
MONITORES
Son estructuras de datos abstractas que operan al estilo de las cajas negras, en el sentido de que se
les puede ordenar que realicen una actividad, pero sin decirles cómo hacerlo.
Los hilos pueden llamar a los procedimientos de un monitor siempre que quieran, pero solo se les
permite ejecutar individualmente; por lo tanto, si el monitor tiene un hilo activo, los demás hilos que
deseen ejecutar en el monitor deben esperar para, a su vez, poder ejecutar en forma exclusiva.
Asegura (Objeto)
{ SC } // Esto es lo que se permite ejecutar a un hilo a la vez
El bloque puede ser un método o una porción de código. Este mecanismo de sincronización se aplica
una sola vez sobre el código involucrado, que es más simple que aplicar Adquiere-Libera de otros
mecanismos.
IMPLEMENTANDO LA SINCRONIZACIÓN
Los semáforos, los cerrojos y los monitores constituyen modelos de sincronización, pero pueden
usarse efectivamente cuando están soportados por el lenguaje de programación en el que se
desarrolla la aplicación. Para que sean efectivos los semáforos o los cerrojos, deben tener operaciones
primitivas indivisibles.
Supongamos que un programador implementa las operaciones del modelo de la ficha de la
siguiente manera:
Adquiere(Ficha) Libera(Ficha)
Mientras (Ficha = Usada); Ficha = Libre
Ficha=Usada
• El hilo H1 ejecuta Adquiere(Ficha); espera a que Ficha esté en Libre pero, antes de ponerla en
Usada, la ejecución se cambia al hilo H2.
• H2 inicia la ejecución de Adquiere(Ficha). Al notar que Ficha está Libre, la pone en Usada y
ejecuta una parte de su sección crítica SC2, que llamaremos SC2a, pero la ejecución cambia a
H1.
• P1 piensa que Ficha está Libre, la pone en Usada y prosigue a la ejecución de su sección crítica
SC1. De ese modo, las ejecuciones de los hilos ya se han intercalado. Vea la tabla.
Hilo H1 Hilo H2
Mientras Ficha=Usada; // Espera turno
// Ficha queda libre pero la ejecución Mientras (Ficha=Usada);
// pasa al hilo 2
Ficha=Usada
// El hilo "adquiere" la ficha por error SC2-1 // Parte 1 de sección crítica
Ficha=Usada // La ejecución pasa al hilo 1
SC1
… SC2-2 // Parte 2 de sección crítica
….
Claramente, la intromisión sería más probable en el caso de máquinas de dos o más procesadores.
Otro asunto a considerar es que si la espera se implementa con un ciclo (while) que constantemente
monitorea la condición del permiso para proseguir, se consume una cantidad considerable de tiempo
de CPU; se recomienda bloquear el hilo para la espera y desbloquearlo cuando la espera concluya.
Este último enfoque es el que usan algunas implementaciones del semáforo.
Consideraremos ahora algunos mecanismos de sincronización de hilos soportados por lenguajes de
programación comunes.
El lenguaje C++ (en la versión 2011 y subsecuentes), implementa el mecanismo del cerrojo con hilos;
contiene el objeto mutex (que llamaremos Obj, el cual puede asegurarse con un cerrojo e
implementar lo siguiente:
- [Link]() espera a que el cerrojo esté abierto para poder continuar la ejecución del hilo que lo
invoca; entonces, cierra el cerrojo para que los demás hilos con lock() se detengan
momentáneamente.
- [Link]() es usado por el hilo para abrir el cerrojo.
import [Link];
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-23
Después, se pueden usar [Link](); y [Link](); para proteger una sección crítica.
import [Link];
Por otra parte, Java permite controlar la ejecución de métodos (procedimientos) en una clase.
Añadiendo la palabra reservada synchronized a la declaración de un método, Java garantiza que una
vez que un hilo comienza a ejecutar ese método sobre un objeto, no se le permite a ningún otro hilo
comenzar a ejecutar ese método o cualquier otro método synchronized de ese objeto. Enseguida se
muestra un ejemplo simple de métodos sincronizados.
synchronized (this)
{ // Sección crítica
.... }
En C# se puede implementar un bloque como sección crítica con lock(), según se muestra.
lock (this)
{ // Sección crítica
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-24
.... }
Finalmente, Python tiene la clase [Link] que implementa un cerrojo mediante sus métodos
acquire(), para obtener el cerrojo y release(), para liberar el cerrojo. Además, Python tiene la clase
[Link](N) que permite la ejecución de N hilos; con N=1 se trata de un semáforo binario.
Tiene los métodos acquire(), para obtener el paso y release() para liberar el paso.
LA SECCIÓN CRÍTICA Y LA EFICIENCIA
Una de las razones para la concurrencia es la mejor utilización del equipo, considerando la posible
ejecución paralela de los hilos. Sin embargo, en la porción de la sección crítica, la ejecución es serial,
porque sólo un hilo puede ejecutar a la vez; esto representa una disminución en la eficiencia del uso
del equipo.
PRÁCTICA
Desarrolle aplicaciones que ilustren el uso de mecanismos de sincronización para proteger la sección
crítica. Compare el desempeño de la ejecución sin mecanismos de sincronización con el que se obtiene
usando esos mecanismos. Además, compare el tiempo que le lleva a un hilo realizar una tarea contra
el tiempo requerido para realizarla mediante dos o más hilos, del mismo proceso o de diferentes
procesos.
El problema se presenta en cualquier caso en el que haya dos procesos, que llamaremos P1 y P2 que
accedan a la misma variable para aumentar o disminuir su valor; también pueden ser hilos en lugar
de procesos. Un ejemplo es el caso de una cuenta bancaria con la variable saldo en la que se puedan
realizar depósitos y retiro, según se muestra.
P1 P2
saldo = saldo+deposito saldo = saldo-retiro
Debe tenerse cuidado en que el productor no añada más productos que la capacidad del buffer y que
el consumidor no intente tomar un producto si el buffer está vacío. Este control puede realizarse
mediante un contador; como se ha expuesto, si un contador es manipulado en la concurrencia, puede
llegar a tener resultados inesperados.
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-25
OTROS ENFOQUES
El enfoque de la exclusión mutua en código puede ser demasiado fuerte, además de que puede ser
complicado, por ejemplo, en ambientes distribuidos. En esos casos, puede utilizarse exitosamente el
protocolo lectores múltiples-escritor único. En ese caso, pueden operar libremente varios hilos
lectores de un dato o un solo hilo que modifique el dato en cuestión.
OTROS AMBIENTES
LA EJECUCIÓN ORDENADA
El problema de la sección crítica requiere la ejecución en tiempos diferentes, sin importar el orden; es
posible que se requiera la ejecución también en tiempos diferentes pero en un cierto orden. En
algunos casos, se pueden usar retrasos a los hilos, según corresponda, para lograr un orden de
ejecución. Por otra parte, dentro de un proceso, el hilo primario puede iniciar la ejecución de otro hilo
(start()) e inmediatamente esperar hasta la terminación de su ejecución (join()), antes de iniciar otro
hilo; más tarde, puede repetir de esa manera para generar los hilos que se requieran. Eso resulta en
una ejecución secuencial de los hilos; en cada momento, sólo un hilo podrá ejecutar.
También se pueden usar los mecanismos de sincronización de dos operaciones, ya sea que se desee
sincronizar hilos completos o porciones de ellos. Supongamos dos hilos, P1 con una sección de código
que llamaremos A, y P2 con una sección de código que llamaremos B; además, se requiere ejecutar A
y luego B. Puede lograrse con un semáforo que inicia, en el hilo primario, con Paso=Rojo
P1: P2:
A Adquiere(Paso)
Libera(Paso) B
P1: P2:
A Adquiere(Paso)
Libera(Paso)
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-26
PRÁCTICA
Desarrolle una aplicación ilustrativa de la ejecución ordenada de dos segmentos, uno en cada hilo.
No trataremos el tema en este trabajo. Baste decir que un caso importante de comunicación entre
procesos (o hilos) es la que se usa para sincronizarlos.
BLOQUEO MUTUO
INTRODUCCIÓN
- Dos niños intentan jugar al arco y flecha; uno toma el arco, el otro la flecha. Ninguno puede
jugar hasta que alguno libere lo que tomó.
- Una carretera con dos sentidos de circulación tiene puente estrecho por el que sólo cabe
un vehículo. El interbloqueo se produciría cuando dos vehículos, atravesando
simultáneamente el puente en sentido contrario, se encontrarán el uno frente al otro sin
posibilidad de continuar. Observe que cada vehículo posee un recurso (el trozo de puente
que ya ha cruzado hasta el momento) pero necesita otro recurso (el trozo de puente que
queda por cruzar) para terminar su labor (cruzar el puente).
- En la sincronización de dos procesos con dos fichas, según se mencionó en la página 21;
cada proceso adquiere una ficha pero después quiere la otra.
El interbloqueo o bloqueo mutuo es una relación circular de espera procesos; la situación también
aplica a hilos del mismo proceso. Cada proceso del conjunto está esperando un evento (la liberación
de algún recurso, por ejemplo) que sólo otro proceso del conjunto puede causar, por lo que todos los
procesos continúan esperando indefinidamente. Un proceso espera por un recurso que otro tiene, y
ese otro, a su vez, espera por el recurso de otro más hasta que algún proceso en la cadena formada
espera al primer proceso mencionado. Enseguida se ilustra la condición de espera circular entre dos
procesos: P1 espera a P2 y P2 espera a P1.
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-27
También se le ha llamado punto muerto (del inglés deadlock) o abrazo mortal (del inglés deadly
embrace). No se debe confundir el interbloqueo con el bloqueo simple como el que se produce
cuando un proceso no libera el derecho de proseguir la ejecución, según se explicó también en la
página 20.
El problema del interbloqueo puede darse en un sistema, aunque sólo algunos de los procesos estén
mutuamente bloqueados. Por otra parte, no es necesario que un proceso esté involucrado en alguna
relación del bloqueo; por ejemplo, si hay 5 procesos, puede ser que haya una relación de bloqueo
mutuo entre 3 de ellos y otra relación de bloqueo entre los dos restantes.
1. Exclusión mutua. Los recursos implicados deben usarse en exclusión mutua, o sea, debe
tratarse de recursos de uso exclusivo. Los recursos compartidos no están involucrados en
interbloqueos.
2. Retención y espera. Cuando no se puede satisfacer la petición de un proceso, éste se bloquea,
manteniendo los recursos que tenía previamente asignados. Se trata de una condición que refleja una
forma de asignación que corresponde con la usada prácticamente en todos los sistemas reales.
3. No expropiación (no desalojo). Un proceso involucrado no puede expropiar a otro proceso los
recursos que solicita. Un proceso sólo libera sus recursos voluntariamente.
4. Espera circular. Debe existir una lista circular de procesos tal que cada proceso en la lista esté
esperando por uno o más recursos que tiene asignados el siguiente proceso.
Es importante resaltar que se trata de condiciones necesarias pero no suficientes, esto es, la
ocurrencia de las condiciones no asegura la presencia del interbloqueo, pero se requieren para que
exista un interbloqueo.
Primeramente, se pueden usar grafos dirigidos para representar relaciones entre los procesos y los
recursos que utilizan; más aún, el grafo dirigido puede usarse para determinar si el interbloqueo
existe. Usaremos los siguientes elementos de representación, en los que P es un proceso y R es un
recurso.
El siguiente ejemplo de interbloqueo incluye dos procesos y dos recursos; cada uno de estos últimos
de tipo diferente. Ninguno de los dos puede continuar; cada uno requiere un recurso que el otro tiene.
La figura ilustra la situación.
Ahora relacionaremos la gráfica anterior con la definición del interbloqueo como espera mutua.
Notemos que P1 quiere algo que P2 tiene, eso significa que P1 está a la espera de P2, como se
muestra en la figura.
Aplicando la misma consideración a la parte en la que P2 quiere lo que P1 tiene, tendremos las
relaciones de espera mostradas en la página 27, que ahora repetimos, añadiendo las
correspondientes relaciones de bloqueo.
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-29
INTERBLOQUEO APARENTE
Cuando un proceso P1 quiere un recurso del tipo que otro proceso P2 tiene, pero no necesariamente
el recurso que P2 tiene, entonces no hay interbloqueo, puesto que no se configura la espera de P1 a
P2. Considere una variante del ejemplo anterior, en la que hay más de un recurso de cada tipo; no
habría interbloqueo, puesto que cada proceso podría obtener los recursos que necesita para llevar a
cabo su actividad. Note que no hay una espera circular efectiva en el grafo mostrado a continuación;
por ejemplo, para el caso de R1, P1 tiene una unidad pero hay otra unidad que P2 puede tomar, sin
esperar a la que P1 tiene. Por lo tanto, la espera circular entre procesos no se produce; P1 no quiere
exactamente el recurso que P2 tiene.
Los enfoques tienen la siguiente consecuencia; mientras más importante se considere al interbloqueo,
mayor trabajo extra se realizará para atacarlo.
INTRODUCCIÓN
El objetivo del algoritmo es determinar si hay interbloqueo en un conjunto de procesos que utilizan
recursos no consumibles. La determinación se hace así:
• Si los requerimientos de recursos de todos los procesos, aparte de los recursos que ya tengan,
pueden ser satisfechos, entonces no hay interbloqueo.
• Si por lo menos dos procesos no pueden ser satisfechos, entonces hay interbloqueo.
Se supone que el total de los recursos debe ser suficiente para satisfacer a cada proceso
separadamente; por lo tanto, se descarta el caso de que algún proceso no pueda ser satisfecho si
tomara para sí mismo el total de los recursos. Esto último sería una carencia de recursos, pero no sería
un bloqueo mutuo.
Para el caso de un solo tipo de recurso, este algoritmo se asemeja a la operación de un pequeño banco
que sólo usa efectivo:
El banco inicia operaciones con una cantidad total de dinero y otorga algunos préstamos a sus clientes.
Más tarde, los clientes piden préstamos adicionales y puede ser que el total de esas sumas adicionales
exceda la cantidad de dinero que aún está disponible. De lo anterior, puede resultar alguno de los
siguientes casos:
1. Es posible otorgar a algún cliente el crédito adicional que requiere. Después de usar el dinero,
el cliente regresa toda la cantidad que tenía prestada. De esa manera, podría ser posible
satisfacer la solicitud de crédito adicional por parte de algún otro cliente.
2. No es posible otorgar a ningún cliente la cantidad adicional que solicita, por lo que la operación
del banco quedará estancada.
Este algoritmo ignora el interés que el cliente tiene que pagar por el préstamo. Aplicando este ejemplo
a los sistemas operativos:
Este algoritmo se refiere a varios tipos de recursos no consumibles, los cuales se tienen en ciertas
cantidades; presentaremos una explicación del algoritmo, utilizando una representación matricial. El
modelo consta de:
Note que, en las matrices A y S, los procesos de colocan hacia abajo y los recursos hacia la derecha,
según se muestra.
I. Requerimiento máximo de cada proceso. Ningún proceso debe, por sí solicitar, en total, una
cantidad de recursos de algún tipo mayor que la cantidad total de ese recurso. En caso contrario, se
trataría de un caso de escasez de ese recurso, pero no de interbloqueo.
II. Consistencia. La suma de las cantidades de cada recurso de un tipo que tienen los procesos
más las cantidades de ese recurso que nadie utiliza debe ser igual a la cantidad total existente de ese
recurso. En caso contrario, habría una inconsistencia que anularía la determinación del interbloqueo.
Verificados los requisitos anteriores, la versión matricial del algoritmo puede aplicarse así:
1. Se busca, dentro de los procesos vigentes, alguno cuya solicitud de recursos, según el
correspondiente renglón en S, puede ser cubierta, según las cantidades disponibles en D.
a) Si ningún proceso puede ser satisfecho, queda establecido que no se pueden satisfacer
las solicitudes de todos los procesos y el algoritmo termina retornando
ESTANCAMIENTO.
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-32
Como un ejemplo cuantitativo, considere un caso con 3 procesos (1, 2 y 3) y 4 recursos, según se
muestra.
La aplicación del algoritmo en este caso determina que pueden satisfacerse los requerimientos de
todos los procesos, otorgando los recursos que solicita el proceso 3, luego los que solicita el proceso
2 y por último los que solicita el proceso 1. Describiremos el procedimiento de la siguiente forma:
Notemos que la representación matricial y la gráfica son equivalentes por lo que puede convertirse
una representación gráfica en una representación matricial (como la usada por el algoritmo del
banquero) y viceversa.
El algoritmo del banquero puede adaptarse para aplicarlo a un grafo, de la siguiente manera:
1. Se busca, dentro de los procesos, alguno cuya solicitud de recursos, según las flechas que
salen de él, puede ser cubierta, de acuerdo con las cantidades de cada recurso que están
disponibles.
a) Si ningún proceso puede ser satisfecho, queda establecido que no se pueden
satisfacer las solicitudes de todos los procesos involucrados y el algoritmo termina
retornando ESTANCAMIENTO.
b) Si no hay procesos pendientes de satisfacer, el algoritmo termina retornando
SIN_ESTANCAMIENTO.
2. Cuando un proceso puede ser satisfecho:
a) Se le otorgan los recursos que solicita, cambiando una flecha hacia el recurso por otra en
sentido contrario.
b) Se le permite terminar.
c) Se le borran todas las flechas, de modo que ni pida ni tenga nada.
3. Regresar al paso 1.
EJERCICIOS
3. Suponga que del recurso A hay 2 unidades, del B hay 2 unidades y del C hay 3 unidades. El
proceso P1 tiene una unidad de A y requiere 1 unidad de B y 1 de C; el proceso P2 tiene 1
unidad de B y 1 de C pero requiere 1 unidad de A; el proceso P3 tiene 1 unidad de C y requiere
2 unidades de B. Determine si existe algún estancamiento en el sistema y cuáles son los
procesos involucrados.
4. Considere la situación mostrada. Determine si hay interbloqueo; si ese es el caso, determine
los hilos involucrados y la relación de espera entre ellos.
La asignación del tiempo de los procesadores a cada hilo de los procesos es la función de la parte del
sistema operativo conocida como planificador o calendarizador. El planificador debe decidir:
• Cuándo asignará un procesador (o núcleo) a un proceso (o hilo).
• Por cuánto tiempo le será asignado ese procesador.
Se considerará en este trabajo la planificación con un solo procesador; en general, se requiere la
planificación cuando el número de procesos es mayor que el número de procesadores.
La equidad en el trato es una condición que se espera en cualquier acto administrativo; se espera de
los directores en organizaciones privadas y públicas, incluyendo a presidentes municipales,
gobernadores y presidentes de la república. Desde luego que la equidad se espera de en la actividad
de un sistema operativo respecto a cualquier aplicación; en el pasado, Microsoft ha sido denunciado
porque Windows favorecía a su navegador. Actualmente, podemos notar que el navegador Edge se
usa para desplegar una imagen de la web cuando se activa Windows después de la hibernación.
• Equidad: Cada proceso recibe una porción equitativa del uso de CPU, por lo que, en ausencia
de alguna razón en contrario, deberá ser tratado de igual forma; además, ningún proceso debe
sufrir inanición.
• Implementación de políticas: Se llevan a cabo las políticas de uso del procesador, privilegiando
algunos procesos cuando, por alguna razón, así quede establecido.
• Equilibrio: Todas las partes del equipo se mantienen ocupadas en el procesamiento.
EQUILIBRIO
Los procesos utilizan la CPU en algunos momentos y los dispositivos de E/S en otro tiempo; se puede
mejorar el equilibrio asignando el procesador a otro proceso cuando se efectúan acciones de E/S.
Como ejemplo, considere un proceso P1 que dura 3 unidades de tiempo, de las cuales 2 usan el
procesador, y otro proceso P2 el cual dura 2 unidades de tiempo, utilizando el procesador en una de
ellas. La siguiente figura representa el procesamiento no equilibrado de esos procesos; el tiempo total
es de 5 unidades de tiempo (Rendimiento [2/5]=0.4).
Como otro ejemplo, en un sistema multiprocesador, se puede repartir la carga de trabajo para evitar
que algún procesador esté inactivo mientras los otros están ocupados.
En la página 2 se presentó un modelo de asignación del procesador a los procesos en el que se asignan
tiempos lapsos de tiempo a cada proceso de forma circular. La representación:
• No establece que los lapsos de tiempo sean iguales. Puede darse preferencia a algún proceso
de mayor importancia asignándole lapsos de tiempo mayores de uso del procesador.
• Sugiere que la cola de listo es del tipo PEPS (primero en llegar, primero en salir); sin embargo,
puede favorecerse a un proceso dejando atrás a otros procesos en la cola, los cuales tienen
una menor prioridad. Sólo debe tomarse en cuenta la posibilidad de la inanición, que es una
condición en que uno o más procesos están en la línea de espera por un tiempo indefinido;
puede producirse si algún proceso P está en la línea de espera y llegan repetidamente procesos
de mayor prioridad, impidiendo que P sea atendido.
SISTEMAS DE PROCESAMIENTO
Generalmente, este tipo de ejecución se utiliza en tareas repetitivas sobre grandes conjuntos de
información, ya que realizarlo manualmente sería tedioso y propenso a errores. Los trabajos pueden
ejecutarse fuera de las horas de oficina: por la noche o en fines de semana. Este procesamiento puede
ser usado en computadoras centrales (mainframes) de las grandes empresas. Son ejemplos comunes
la elaboración de la nómina, la generación de los estados de cuenta y la generación de respaldos de
las bases de datos.
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-37
Una meta para este tipo de procesamiento es que el rendimiento o tasa de procesamiento (número
de trabajos por unidad de tiempo) sea lo más grande posible. El rendimiento puede mejorar si se
reduce la sobrecarga de trabajo al cambiar de un proceso a otro; por otra parte, el rendimiento puede
mejorar si se aumenta el equilibrio en el uso del equipo. En el ejemplo mostrado de los dos procesos,
con el procesamiento no equilibrado se tiene una tasa de 2/5 procesos por unidad de tiempo; en el
procesamiento equilibrado se tiene una tasa de 2/4 = 0.5 procesos por unidad de tiempo. También se
mejora el rendimiento, respecto al equilibrio, si se reparte la carga de trabajo entre los procesadores.
Otra meta se refiere al tiempo de respuesta; este es el tiempo transcurrido desde la petición de un
servicio hasta la satisfacción de quien lo pide; un tiempo de respuesta grande implica líneas de espera
largas y mucho tiempo de espera en ellas. En todos los sistemas de procesamiento se desea el menor
tiempo de respuesta, aunque esto es particularmente importante en los sistemas de tiempo real.
En un sistema de tiempo real, el usuario es un sistema externo o entorno, humano o no, que es
atendido por una computadora. Tiene las siguientes características:
La reacción de un sistema de tiempo real a eventos externos debe concordar con la evolución de los
mismos. Como una consecuencia, el tiempo del sistema (tiempo interno) debe ser medido usando la
misma escala con que se mide el tiempo del entorno atendido (tiempo externo).
Los ejemplos de sistemas en tiempo real están presentes en nuestra vida diaria: el monitoreo de
pacientes en la unidad de cuidados intensivos de un hospital, el monitoreo, control y protección de
los sistemas de transmisión y distribución de la energía eléctrica (CFE), la descarga y reproducción de
videos; también están: la guía de aviones, trenes o automóviles, etc. Estos últimos forman parte de
los sistemas embebidos o empotrados: Sistemas de cómputo dedicados que están dentro de un
sistema mayor mecánico o eléctrico.
Por ejemplo, en un sistema de reproducción de video, los pixeles deben ser recogidos con la rapidez
necesaria para que no se pierda la información; además los pixeles deben estar disponibles con la
suficiente rapidez para que la imagen reproducida no se distorsione.
Los sistemas de tiempo real pueden clasificarse según la tolerancia que el proceso externo tiene con
los retrasos:
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-38
El peor caso es el de los sistemas estrictos aperiódicos; puede requerir un equipo dedicado a atender
peticiones del sistema externo, por lo que no se consideran líneas de espera. El caso más benigno es
el de los sistemas periódicos no estrictos; en este caso puede ser adecuado que un equipo atienda
diferentes peticiones, las cuales pueden colocarse en una línea de espera.
Para los sistemas periódicos no estrictos con n eventos, si el evento i tiene un periodo de ocurrencia
Pi y ese evento es una carga, para la CPU, por Ci unidades de tiempo, entonces se puede hacer una
planificación de servicio adecuada si
𝑛
𝐶𝑖
∑ <1
𝑃𝑖
𝑖=1
Ci/Pi representa la fracción de una unidad de tiempo que ocupa el proceso i para ser atendido; si la
suma de esas fracciones no sobrepasa la unidad, significa que esa unidad de tiempo puede dar
acomodo a una porción suficiente de todos los procesos, suponiendo que algunos de ellos tengan que
esperar un poco.
Por ejemplo, supongamos dos procesos tales que: C1=3, P1=6, C2=1 y P2=4. Tenemos que:
(3/6)+(1/4)=0.75, por lo que ambos procesos pueden ser atendidos, posiblemente con una pequeña
demora.
Las versiones comunes de Windows ofrecen inestabilidad en su desempeño; puede haber dificultades
en el arranque y en el cierre del sistema operativo. Pero en la ejecución normal, la incertidumbre
resulta de sobrecarga de trabajo debida a:
Los programas que inician automáticamente junto con el sistema operativo, algunos de los
cuales no son indispensables.
Las tareas programadas, por ejemplo, la revisión de archivos por parte del antivirus.
Las actualizaciones de algunos programas.
Puede ser necesario cambiar de versión de sistema operativo a una variante conocida como sistema
operativo de tiempo real (RTOS).
PRÁCTICA
Sistemas Operativos I GDZarza Sep 2023 Admin. de los Proc. y el Proc. 2-39
3. Ejecute el Programador de tareas para revisar algunas de las tareas programadas, especialmente
las relativas al antivirus.
Son sistemas especializados en aplicaciones de tiempo real, en las cuales se deben procesar datos al
momento en que se reciben, puesto que hay un plazo para su respuesta. El tiempo de respuesta a un
evento externo que se manifiesta con una interrupción tiene 3 partes: el retraso por reconocer una
interrupción y desatender la tarea que se está ejecutando, el retraso en iniciar (despacho) el proceso
de servicio de la interrupción y el tiempo que le toma a este proceso satisfacer la petición recibida.
Vea la figura.
Para cumplir con un plazo determinado, un RTOS debe realizar sus actividades en plazos fijos y con
retrasos limitados. Debe dar control más detallado al usuario sobre la prioridad de los procesos y ser
confiable. La mayoría de los RTOS implementan un algoritmo de planificación con prioridad fija y
desalojo, esto es:
Son ejemplos de RTOS: FreeRTOS, VxWorks, QNX y RTLinux. Claramente, los sistemas operativos que,
en algún momento, deciden realizar ciertas tareas en segundo plano que pueden acaparar los
recursos de la computadora, anulando significativamente su capacidad de respuesta a solicitudes.