Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Gestión de Procesos
• Introducción: En lo que respecta a la gestión de procesos, el sistema
operativo debe ser capaz de soportar:
• La creación, suspensión, reanudación, eliminación y planificación de
procesos
• La comunicación y la sincronización entre procesos
• Procesos: Un proceso es un programa en ejecución que necesita estar
cargado en memoria y disponer de recursos (cpu, memoria, archivos,
dispositivos de E/S) para cumplir su objetivo, se trata de una entidad activa.
Mientras que los programas son un conjunto de archivos que están
almacenados en algún dispositivo de almacenamiento (disco duro, pendrive…)
y cuyo código fuente está escrito en algún lenguaje de programación. Cuando
este conjunto de archivos se ejecutan, entonces pasan a ser un proceso.
A los procesos, dependiendo especialmente del sistema operativo utilizado,
se les denomina flujos de control, tareas, threads o hilos, según el contexto.
Cuando se ejecuta más de un proceso de forma concurrente en un sistema,
todos necesitan que el propio sistema les suministre una serie de recursos.
Para ello, el sistema operativo gracias al cpu (Unidad Central de Proceso), se
encarga de asignar estos recursos en un orden adecuado y atendiendo a
ciertas prioridades. También realiza funciones de sincronización de todos los
procesos, para que se ejecuten en el orden adecuado y según la prioridad
definida.
Cada vez que un programa se convierte en proceso, es decir, cada vez que se
ejecuta un programa, además de ubicar en memoria las instrucciones que lo
componen y los datos asociados a dicho proceso, se le asocia una estructura
de datos.
Esta estructura de datos, que es única para cada proceso, identifica el
proceso respecto de los demás y sirve para controlar su correcta ejecución.
Es lo que se denomina bloque de control del proceso o BCP
• Estados de un Proceso: El estado de un proceso se define por su actividad
actual, cambiando a medida que se ejecuta. La ejecución de un proceso alterna
una serie de ráfagas de CPU y E/S.
Un proceso puede pasar por los siguientes estados:
nuevo, preparado, en ejecución, bloqueado y terminado,
puede también solo ejecutarse y terminarse.
Básicamente los estados posibles de un proceso, son los siguientes:
• En ejecución: El procesador está ejecutando instrucciones del programa que lo
compone y tiene concedido el tiempo de uso de CPU en un instante concreto.
• Preparado, en espera o activo: Un proceso está preparado para ser ejecutado;
es decir, está esperando turno para poder utilizar su intervalo de tiempo y poner
en funcionamiento sus instrucciones accediendo a los recursos del sistema.
• Bloqueado: El proceso está retenido; es decir se encuentra bloqueado debido a
causas múltiples. Una de estas causas puede ser que dos procesos utilicen el
mismo fichero de datos. Otra causa puede ser que dos procesos necesiten utilizar
la misma unidad de CD-ROM para cargar determinados datos, etc.
En general, todos los procesos dentro de cualquier sistema operativo tienen
ciertas características que los identifican. Cada programa en ejecución, es decir,
cada proceso, tiene un identificador que lo discrimina de los demás.
Cada proceso tiene un número asignado por el sistema operativo que sirve para
identificar dicho proceso, lanzarlo a ejecución, detenerlo, cancelarlo, reanudarlo,
etc. Este identificador de proceso se nombra con la abreviatura PID (process
identifier)
En cada tipo de sistema operativo, los procesos los lanzan
normalmente otros procesos. Es decir, que cada proceso que se lanza a
ejecución depende, en la mayoría de los casos, de otro proceso
denominado proceso padre. De esta manera, al nuevo proceso lanzado
se le denomina proceso hijo.
• Transiciones de los Procesos: Una vez que un programa se ha
lanzado y se ha convertido en un proceso, puede atravesar varias
fases o estados hasta que finaliza o termina.
Cuando un proceso se lanza, nunca se ejecuta directamente, sino que
se coloca en la cola de procesos en un estado denominado
“preparado”. Cuando el CPU le asigna su tiempo, el proceso pasa de
preparado a ejecución. Estos dos estados se alternarán en caso de que
se esté ejecutando más de un proceso en el sistema.
Los cambios de estado en los que se puede encontrar un proceso se denominan
transiciones:
• Nuevo-Preparado: el sistema operativo está preparado para admitir un
proceso más.
• Preparado-Ejecución: El planificador escoge un proceso para la ejecución.
(tiempo de CPU para ejecutarse)
• Ejecución-Preparado: El proceso en ejecución es interrumpido y expulsado del
procesador, debido a que ya ha consumido su tiempo asignado o porque otro
proceso de mayor prioridad está esperando.
• Ejecución-Bloqueado: El proceso abandona voluntariamente el CPU y espera a
un evento externo.
• Bloqueado-Preparado: Cuando finaliza el evento que estaba esperando el
proceso, y luego pasa al estado preparado.
• Ejecución-Terminado: El proceso termina su ejecución (terminación normal)
• Preparado/Bloqueado-Terminado: El proceso es eliminado (terminación
anormal).
En un sistema multiproceso, cuando un proceso pasa de un estado a otro
(por ejemplo, de espera a ejecución), lo que se producirá es un cambio de
contexto.
• Bloque de Control de Procesos (BCP): Los sistemas operativos
disponen de los servicios necesarios para la gestión de los procesos,
tales como su creación, terminación, ejecución periódica, cambio de
prioridad, etc. Además, durante su existencia, los procesos pasan por
distintos estados cuyas transiciones están controladas por el sistema
operativo.
Toda la información de un proceso que el sistema operativo necesita
para controlarlo, se mantiene en una estructura de datos denominado
“Bloque de Control de Procesos” o BCP.
En sistemas operativos multiproceso, el sistema operativo mantiene
varias listas de Bloques de Control de Procesos para cada uno de los
estados del sistema.
El BCP de cada proceso almacena información como:
• Estado actual del proceso: Ejecución, preparado o bloqueado.
• Identificador del proceso: Dependiendo del sistema operativo, a cada
proceso se le asigna un PID (process identifier)
• Prioridad del proceso: Prioridad asignada por el planificador.
• Ubicación en memoria: Dirección de memoria en la que se carga el
proceso.
• Recursos utilizados: Recursos de hardware y software para poder
ejecutarse.
El sistema operativo es el responsable de asignar recursos a los procesos,
crear y destruir procesos, parar y reanudar procesos y proporcionar que
los procesos se puedan comunicar y sincronizar.
La parte del sistema operativo encargada de seleccionar el siguiente
proceso para su ejecución es el planificador y el algoritmo que utiliza, es
el algoritmo de planificación.
Todo proceso consume recursos de hardware de un Sistema Informático,
y el sistema operativo es el que determina, mediante el planificador, de
qué forma se asignan los recursos a cada proceso.
• Algoritmos de Planificación:
Un algoritmo de planificación se utiliza para calcular los recursos que
consume otro algoritmo o proceso al realizar una determinada tarea. Ej:
tiempo de finalización, porcentaje de utilización de CPU, etc.
Gracias a los algoritmos de planificación, especialmente en sistemas
operativos multiproceso o en sistemas operativos en red, siempre y
cuando se ejecuten varios procesos en el mismo equipo, el CPU se
encarga de asignar tiempos de ejecución a cada proceso según el tipo de
algoritmo y la prioridad de cada proceso, para la ejecución ordenada de
los procesos
Algunos de los algoritmos de planificación más utilizados en sistemas
operativos multiproceso y multiusuario, son:
(actualmente utilizados en sistemas operativos como: Windows, Unix y Linux)
• Algoritmo de Rueda o Round-Robin: Asigna rotativamente tiempos
de ejecución a los diferentes procesos. A cada uno se le asigna el
mismo quantum o intervalo de tiempo de ejecución. La selección entre
los procesos se realiza mediante una cola FIFO (First In First Out, el
primero en entrar es el primero en salir o ser servido). Es el algoritmo
utilizado normalmente en la asignación de tiempos en sistemas
operativos multiusuario y multiproceso, y en la actualidad se puede
decir que es utilizado también en sistemas operativos monousuario y
que trabajan en multitarea.
• Algoritmo FIFO (First In First Out) o FCFS (First Come First Serve):
Los ciclos de CPU asignados a cada proceso, se asignan en función de
una cola FIFO. Al primer proceso que llega se le asignan tiempos o
ciclos de CPU hasta que termina completamente. A continuación, se
ejecuta completo el siguiente proceso que está en la cola FIFO y así
sucesivamente hasta terminar con el último proceso. Este algoritmo de
planificación normalmente se utiliza para la gestión de trabajos en
colas de impresión, respecto de los trabajos que van llegando a la
impresora.
• Sincronización de Procesos:
Los semáforos son un mecanismo de sincronización de procesos
inventados por Edsger Dijkstra en 1965, y se utilizaron por primera vez en
el sistema operativo THEOS.
Los semáforos permiten al programador asistir al planificador del sistema
operativo en su toma de decisiones de manera que permiten sincronizar
la ejecución de dos o más procesos
La sincronización es la transmisión y recepción de señales que tiene por
objeto llevar a cabo el trabajo de un grupo de procesos cooperativos. Es
la coordinación y cooperación de un conjunto de procesos para asegurar
la comparación de recursos de computo.
Un semáforo es una variable especial (o tipo abstracto de datos) que
constituye el método clásico para restringir o permitir el acceso a
recursos compartidos (por ejemplo: un recurso de almacenamiento del
sistema o variables del código fuente) en un entorno de
multiprocesamiento (en el que se ejecutarán varios procesos en forma
concurrente)
Para evitar la espera activa, un semáforo puede tener asociada una cola
de procesos (normalmente una cola FIFO). Si un proceso efectúa una
operación P en un semáforo que tiene valor cero, el proceso es detenido
y añadido a la cola del semáforo.
La sincronización entre procesos permite intercambiar señales de
tiempo (arranque /parada), 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
distintos hilos de ejecución comparten una serie de recursos
Los mecanismos de sincronización permiten forzar a un proceso a
detener su ejecución hasta que ocurra un evento en otro proceso.
• Hilos, hebras o threads:
En los actuales sistemas operativos, un proceso puede tener internamente
varias actividades concurrentes llamadas hilos de ejecución o threads.
Un hilo o hebra, es una secuencia de tareas encadenadas muy pequeñas que
pueden ser ejecutadas por el sistema operativo
Son como “mini procesos”, unidades pequeñas en las que se divide un proceso,
cada una de las cuales realiza una acción.
Una hebra o hilo es un subproceso de un proceso que consume recursos propios
pero que depende del proceso padre que lo ha ejecutado.
Las hebras de un mismo proceso compartirán recursos, tales como: espacio de
memoria, archivos, situación de autenticación, recursos de hardware, recursos
de software, etc.
Esta técnica permite simplificar el diseño de una aplicación que debe llevar a
cabo distintas funciones simultáneamente.
Cuando un hilo modifica un dato en la memoria, los otros hilos acceden a ese
dato modificado inmediatamente.
Un proceso tradicional es igual a una tarea con un solo hilo. Los hilos
permiten la ejecución concurrente de varias secuencias de instrucciones
asociadas a diferentes funciones dentro de un mismo proceso,
compartiendo un mismo espacio de direcciones y las mismas estructuras
de datos del núcleo
Un proceso sigue en ejecución mientras al menos uno de sus hilos de
ejecución siga activo. Cuando el proceso finaliza, todos sus hilos de ejecución
también han terminado. Asimismo en el momento en el que todos los hilos
de ejecución finalizan, el proceso no existe más y todos sus recursos son
liberados.
Algunos lenguajes de programación tienen características de diseño
expresamente creadas para permitir a los programadores lidiar con hilos de
ejecución (como Java o Delphi). Otros lenguajes de programación desconocen
la existencia de hilos de ejecución y estos deben ser creados mediante
llamadas de biblioteca especiales que dependen del sistema operativo en el
que estos lenguajes están siendo utilizados (como es el caso del C y del C++).
• Funcionalidad de los Hilos: Al igual que los procesos, los hilos poseen un
estado de ejecución y pueden sincronizarse entre ellos para evitar problemas
de compartición de recursos. Generalmente, cada hilo tiene una tarea
específica y determinada, como forma de aumentar la eficiencia del uso del
procesador.
• Estados de un Hilo (thread): Los principales estados de los hilos son:
Ejecución, Listo y Bloqueado.
No tiene sentido asociar estados de suspensión de hilos ya que este es un
concepto de proceso. En todo caso, si un proceso es expulsado de la memoria
principal (RAM), todos sus hilos deberán estarlo también, ya que todos
comparten el mismo espacio de direcciones del proceso.
• Cambio de Estados:
• Creación: Cuando se crea un proceso, también se crea un hilo para ese proceso.
Luego, este hilo a su vez, puede crear otros hilos dentro del mismo proceso,
proporcionando un puntero de instrucción y los argumentos del nuevo hilo. El hilo
tendrá su propio contexto y su propio espacio de la columna, y pasará al final de
los Listos.
• Bloqueo: Cuando un hilo necesita esperar por un suceso, se bloquea (salvando
sus registros de usuario, contador de programa y punteros de pila). Ahora el
procesador podrá pasar a ejecutar otro hilo que esté al principio de los Listos
mientras el anterior permanece bloqueado.
• Desbloqueo: Cuando el suceso por el que el hilo se bloqueó se produce, el hilo
pasa a la final de los Listos.
• Terminación: Cuando un hilo finaliza su tarea, se liberan tanto su contexto como
también sus columnas.
• Ventajas de los Hilos vs. los Procesos: Si bien los hilos son generados
a partir de la creación de un proceso, podemos decir que un proceso
es un hilo de ejecución, conocido como Monohilo. Pero las ventajas de
los hilos se dan cuando se tienen Multihilos (multithreading), que
ocurre cuando un proceso tiene múltiples hilos de ejecución los cuales
realizan actividades distintas, que pueden ser o no ser cooperativas
entre sí. Los beneficios de los hilos se derivan de las implicaciones de
rendimiento:
1. Se tarda mucho menos tiempo en crear un hilo nuevo en un proceso
ya existente, que en crear un nuevo proceso.
2. Se tarda mucho menos tiempo en terminar un hilo que un proceso, ya
que cuando se elimina un proceso se debe eliminar el BCP1 del mismo,
mientras que para un hilo solamente se elimina su contexto y la pila.
3. Se tarda mucho menos tiempo en cambiar entre dos hilos de un
mismo proceso.
4. Los hilos aumentan la eficiencia de la comunicación entre programas
en ejecución, si existe una aplicación que debe implementarse como un
conjunto de unidades de ejecución relacionadas, será más eficiente
hacerlo con una colección de hilos que con una colección de procesos
separados.
• Sincronización de Hilos: Todos los hilos comparten el mismo espacio
de direcciones y otros recursos, como pueden ser archivos abiertos.
Cualquier modificación de un recurso desde un hilo afecta al entorno
del resto de los hilos del mismo proceso. Por lo tanto, es necesario
sincronizar la actividad de los distintos hilos para que no interfieran
unos con otros o corrompan estructuras de datos.
Una ventaja de la programación multihilo es que los programas
operan con mayor velocidad en sistemas de computadores con
múltiples CPUs (sistemas multiprocesador o a través de un grupo de
máquinas) ya que los hilos del programa se prestan verdaderamente
para la ejecución concurrente.
Es posible que los hilos requieran de operaciones atómicas para impedir
que los datos comunes sean cambiados o leídos mientras estén siendo
modificados, para lo que usualmente se utilizan los semáforos. El
descuido de esto puede generar un interbloqueo o bloqueo mutuo
(deadlock).
Los semáforos limitan la ejecución simultánea de un código
(procedimiento, línea de código, etc.) a uno o más hilos en un momento
dado. Un semáforo se puede compartir entre varias aplicaciones.