lunes, 13 de febrero de 2017
lunes, 23 de enero de 2017
PROCESOS
PROCESOS:
Un proceso es una secuencia de pasos dispuesta con algún
tipo de lógica que se enfoca en lograr algún resultado específico. Los procesos
son mecanismos de comportamiento que diseñan los hombres para mejorar la
productividad de algo, para establecer un orden o eliminar algún tipo de
problema. El concepto puede emplearse en una amplia variedad de contextos, como
por ejemplo en el ámbito jurídico, en el de la informática o en el de la
empresa. Es importante en este sentido hacer hincapié que los procesos son ante
todo procedimientos diseñados para servicio del hombre en alguna medida, como
una forma determinada de accionar.
En el contexto del derecho, un proceso hace alusión a los diversos pasos que den seguirse de modo obligatorio a la hora de llevar adelante un juicio. Este hecho da cuenta de que en ocasiones el término juicio y proceso se utilicen como sinónimos. Dicho proceso es conocido por los letrados como asimismo por los magistrados y debe respetarse en todo momento para que el juicio se desarrolle de forma legítima. En efecto, si existiesen faltas significativas en este sentido podría existir un fenómeno de invalidación que echarían todos los esfuerzos realizados por tierra. No obstante, a pesar de la aparente rigurosidad, estas formas de actuación son necesarias por la complejidad de la materia.
En informática es un término con múltiples usos, que aparecen en contextos muy diversos. En el ámbito de la informática, el concepto se refiere a la ejecución de diversas instrucciones por parte del microprocesador, de acuerdo a lo que indica un programa. Por otro lado, un proceso suele ser el nombre que recibe un programa que está siendo ejecutado en memoria. Si vemos el administrador de tareas de Windows, podremos tomar conciencia de muchos de estos programas. En este caso, el nombre de procesos deriva del hecho de que un programa por definición lleva una secuencia de pasos de forma lógica. Muchos de estos procesos son fundamentales para el mantenimiento del sistema operativo, circunstancia que hace que eliminar a alguno pueda tener consecuencias negativas.
En el contexto del derecho, un proceso hace alusión a los diversos pasos que den seguirse de modo obligatorio a la hora de llevar adelante un juicio. Este hecho da cuenta de que en ocasiones el término juicio y proceso se utilicen como sinónimos. Dicho proceso es conocido por los letrados como asimismo por los magistrados y debe respetarse en todo momento para que el juicio se desarrolle de forma legítima. En efecto, si existiesen faltas significativas en este sentido podría existir un fenómeno de invalidación que echarían todos los esfuerzos realizados por tierra. No obstante, a pesar de la aparente rigurosidad, estas formas de actuación son necesarias por la complejidad de la materia.
En informática es un término con múltiples usos, que aparecen en contextos muy diversos. En el ámbito de la informática, el concepto se refiere a la ejecución de diversas instrucciones por parte del microprocesador, de acuerdo a lo que indica un programa. Por otro lado, un proceso suele ser el nombre que recibe un programa que está siendo ejecutado en memoria. Si vemos el administrador de tareas de Windows, podremos tomar conciencia de muchos de estos programas. En este caso, el nombre de procesos deriva del hecho de que un programa por definición lleva una secuencia de pasos de forma lógica. Muchos de estos procesos son fundamentales para el mantenimiento del sistema operativo, circunstancia que hace que eliminar a alguno pueda tener consecuencias negativas.
Finalmente, desde el punto de vista de una empresa, un proceso da cuenta de una serie de acciones que se toman en el aspecto productivo para que la eficiencia sea mayor. En efecto, las empresas buscan continuamente aumentar su rentabilidad produciendo más y bajando sus costos. Para ello diseñan sistemas de actuación que garantizan esta circunstancia luego de análisis pormenorizados. Un buen ejemplo de esta situación puede ofrecerlo el quiebre que significó la producción en serie con el fordismo considerando los tiempos inmediatamente anteriores; la misma posibilitó sacar al mercado autos en gran escala, haciendo que éstos pudiesen ser adquiridos por la población en general a un precio razonable.
Estados de los
procesos
Todo proceso en un sistema operativo presenta un estado que
indica la situación de la ejecución en que se encuentra. El número de posibles
estados varía de un sistema operativo a otro.
Diagrama de estados
simplificado
Consideramos que todo proceso
puede estar, como mínimo, en uno de los siguientes tres estados:
Activo: el
proceso está empleando la CPU, por tanto, está ejecutándose. Pueden haber
tantos procesos activos como procesadores haya disponibles. Por tanto, si el
sistema dispone de un único procesador, únicamente puede haber un proceso
activo a la vez.
Preparado: el
proceso no está ejecutándose pero es candidato a pasar a estado activo. Es el
planificador el que, en base a un criterio de planificación, decide qué proceso
selecciona de la lista de procesos preparados para pasar a estado activo.
Bloqueado: el
proceso está pendiente de un evento externo que le ha hecho bloquear, tales
como una operación de lectura/escritura, la espera de finalización de un
proceso hijo, una señal o una operación sobre un semáforo. El dispositivo/hecho
externo "avisa" al S.O. cuando ha terminado la acción que realizaba
mediante una INTERRUPCIÓN, dejando el S.O. lo que está haciendo para atender a
esta última. Tras esto, el S.O. comprueba cuales son los procesos que fueron
bloqueados por ese evento externo, cambiándolos al estado de preparado.
La transición de activo a
preparado y viceversa depende de decisiones tomadas por el planificador del sistema operativo en base a un cierto criterio. La transición de activo a bloqueado,
y de bloqueado a preparado puede inducirlas el programador mediante llamadas al
sistema.
Diagrama de Estados
Ampliado
En espera / Preparación: Estado
por el que pasan los procesos antes de pasar a estar preparados por primera
vez. Los procesos, cuando comienzan a existir, no están preparados para
comenzar a ejecutar instrucciones hasta que el sistema no ha llevado a cabo una
serie de actividades. Una vez que el proceso está completamente cargado, ya se
puede producir la primera transición al estado preparado.
Terminado: La
transición de activo a este estado ocurre cuando el proceso realiza una llamada
al sistema solicitando su propia terminación. En estas circunstancias, hay
estructuras de datos correspondientes al proceso que no pueden ser liberadas
hasta que el proceso padre del que está terminando recoja el código de
terminación del mismo. Hasta que esto ocurra, estas estructuras se mantendrán y
el proceso seguirá existiendo en estado terminado.
Transición: cuando
la operación que mantiene a un proceso en estado bloqueado termina, el proceso
puede haber perdido parte de los recursos que necesita para proseguir su
ejecución. Este es por ejemplo el caso de un sistema con memoria virtual, en el
que parte de las páginas de memoria del proceso han sido descargadas a disco.
En dicho caso, el proceso tendría que pasar por un estado intermedio transición
mientras recupera dichos recursos, y una vez que todos sus recursos vuelven a
estar disponibles, volvería al estado preparado.
Hay tres posibles situaciones en las que se ejecutará el planificador del sistema operativo:
El proceso que se encuentra en el estado
activo hace una llamada al sistema que, por su naturaleza, resulta en una
transición al estado bloqueado. Este es el caso de las llamadas read(),
write(), wait(), pause(), entre muchas otras. Al pasar a estado bloqueado, se
invoca al planificador para que decida que otro proceso se asignará al
procesador.
Si el proceso que se encuentra en el estado
activo excede el tiempo máximo de asignación, en caso de que lo hubiere.
Si el proceso que hasta ese momento se
encontraba en estado activo termina de ejecutar su código.
Además, algunos sistemas
operativos disponen de un estado terminado en el que los procesos pasan antes
de terminar su ejecución.
En el caso del núcleo de Linux,
existen tres tipos de estados bloqueados y dos estados terminados.
Bloqueo de control de
los procesos:
Para llevar a cabo la gestión de un proceso, es necesario
que el sistema operativo guarde cierta información necesaria. Para ello, existe
un registro especial que se conoce como el bloque de control del proceso
BCP, o PCB en inglés (Process Control Block).
El BCP es creado por el Sistema
operativo cada vez que aparece un nuevo proceso. Los procesos son conocidos
para el sistema operativo y por tanto elegible para competir por los recursos
del sistema sólo cuando existe un BCP activo asociado a ellos. Cuando el
programa termina, el BCP es eliminado para dejar espacio libre en el registro,
y usarlo para almacenar otros BCP.
El bloque de control de procesos
difiere mucho de un sistema a otros, pero existen contenidos comunes:
Identificador del proceso: Identificar de forma unívoca al proceso en el sistema,
generalmente se emplea un entero sin signo que se denomina PID (Process
IDentifier)
Estado del proceso para el
planificador de procesos: preparado,
activo o bloqueado.
Contexto de la ejecución: valor de los registros del procesador, bits de estados, etc. Esto
es, cada vez que se ejecuta el planificador y se realiza una conmutación de procesos, la información sobre en qué lugar se encontraba la ejecución del
proceso se encuentra guardada aquí, así como el lugar en el que se paró la
ejecución del anterior proceso (cada una en su respectivo BCP).
Aspectos relacionados con la
administración de memoria: tales como
el espacio de direcciones y la cantidad de memoria asignada a un proceso.
Aspectos relacionados con la
administración de ficheros: tales como
los ficheros con los que el proceso está actualmente operando.
Los procesadores en los que el
proceso puede ejecutarse: en caso de
soportar el sistema multiprocesador.
En el caso de un sistema
operativo tipo UNIX: el proceso
padre de dicho proceso y la relación de procesos hijos.
Estadísticas temporales: Tiempo de lanzamiento del proceso, tiempo en estado activo,
Esta lista es simplemente
indicativa, cada sistema operativo tiene su propio diseño de BCP, con el
conjunto de metadatos necesarios para la
administración. Puede medir desde 32 bits a 1024. Su denominación cambia según
el sistema operativo, por ej. En IBM se designa PSW por
palabra de estado de proceso. Difiere significativamente entre los sistemas
de procesamiento
por lotes (BATCH)
y los sistemas interactivos.
Algunos sistemas de multiprogramación incluyen
información de mantenimiento con el propósito de facturar a los usuarios
individuales el tiempo de procesador, el almacenamiento, las operaciones de E/S
y otras utilizaciones de recursos.
Una vez creado, el BCP se rellena con los atributos
definidos como parámetros que se hallan en la plantilla del proceso o que son
especificados como parámetros de la llamada al sistema operativo crear proceso.
En ese momento el sistema operativo suele asignar valores a otros campos. Por
ejemplo, cuando se crea un proceso, los registros e indicadores hardware se fijan a
los valores proporcionados por el cargador/enlazador. Cada vez que un proceso
queda suspendido, el contenido de los registros del procesador es generalmente
guardado en la pila,
y el puntero al marco de la
pila en cuestión se almacena en el BCP. De este modo los valores de los
registros son restaurados cuando el proceso es seleccionado para ejecutarse
nuevamente.
Operación
sobre los procesos
Los sistemas operativos son responsables de la "gestión de procesos y
memoria", por lo que están encargados de
realizar una serie de actividades, tales como la planificación o itinerario de procesos, la operación sobre procesos y la comunicación entre
procesos. Para operar sobre un proceso, los
sistemas operativos actuales suministran ciertas funciones, que pueden ser
ejecutadas ya sea desde el mismo proceso o desde el intérprete de comandos, si
es un usuario el que solicita algún servicio de dicho sistema.
Entre las
operaciones sobre procesos que con mayor frecuencia ofrecen los sistemas
operativos se encuentran la creación, terminación o destrucción, suspensión y
reanudación de procesos. Actualmente, en la mayoría de los S.O., los procesos
pueden ejecutarse de forma concurrente, pudiéndose crear y eliminar de forma
dinámica, por lo que es necesario que estos sistemas brinden un mecanismo para
la creación y terminación de procesos.
Durante la ejecución de un proceso, éste
puede crear otros procesos. Si lo hace, el proceso creador es llamado proceso padre, y el
creado, proceso
hijo. Estos últimos pueden, a su vez, crear otros procesos,
construyendo así un árbol de procesos.
Hay 4 eventos comunes que
conducen a la creación de procesos:
§ En un
ambiente batch, un proceso
es creado en respuesta al sometimiento a ejecución de un trabajo (job). El S.O.
tomará el próximo trabajo a ser ejecutado y creará el respectivo proceso.
§ En un
ambiente interactivo, un proceso es creado cuando un nuevo usuario entra al
sistema (log on). El S.O crea un proceso shell que espera las órdenes del usuario.
§ El S.O.
puede crear un proceso para que realice una función en respuesta a una petición
de un programa usuario, sin que el usuario tenga que esperar. Por ejemplo, si
un usuario quiere que se imprima un archivo, el S.O. puede crear un proceso que
maneje esta impresión, mientras que el proceso que realizó la petición puede
continuar independientemente del tiempo requerido para completar la impresión.
§ Para
procesos de modularidad o para explotar paralelismo, donde un programa usuario
ya existente puede crear un conjunto de procesos hijos.
Además, crear un proceso implica
varias operaciones, entre ellas:
§ Buscarle
un identificador:
la mayoría de los sistemas operativos, incluyendo los UNIX y Windows,
identifican los procesos mediante un identificador unívoco que normalmente es
un número entero, es decir, cada proceso (padre e hijo) es identificado por un
id o PID (process identifier) distinto para cada uno.
§ Determinar
la prioridad inicial del proceso.
§ Crear el PCB: el S.O. busca un hueco
libre en la lista de PCB, y cuando lo encuentra crea el PCB del proceso.
§ Asignar recursos iniciales al proceso: por ejemplo,
establecer su contexto de memoria (espacio de direcciones) y de CPU
(registros), los archivos a usar y los dispositivos de E/S.
§ Insertarlo
en la cola de procesos.
Relación entre
procesos padres e hijos
Hay varias formas y criterios por
lo que los hijos se relacionan con sus padres, estos son:
Jerarquía
Puede ser de dos tipos:
1.
Estructura jerárquica: cada
proceso que se crea es hijo del proceso creador, y hereda el entorno de
ejecución de su padre, estableciéndose un árbol de procesos como se mencionó
anteriormente, donde cada hijo tiene sólo un padre, pero un padre puede tener
más de un hijo. La estructura jerárquica se llevará a cabo por medio de la
información adecuada insertada en el PCB del proceso padre.
2.
Estructura no jerárquica: consiste
en que cada proceso creado por otro se ejecute independientemente de su
creados, con un entorno totalmente diferente.
Recursos
Los recursos físicos y lógicos
asignados a los procesos pueden venir de parte del sistema operativo o bien se
limitan recibiendo una serie de recursos del padre (ficheros, dispositivos,
memoria compartida,...), lo cual ayuda para no sobrecargar el sistema creando
procesos hijos. Por lo tanto la relación puede ser:
1.
Padre e hijo comparten todos
sus recursos
2.
El padre le comparte un subconjunto
de sus recursos a sus hijos.
3.
Padre e hijo no
comparten recursos.
Ejecución
El proceso padre puede
entregarle, además de sus recursos a sus procesos hijos, parámetros iníciales
para ayudarlo a completar tareas. Por lo cual existen dos escenarios en la
ejecución:
1.
El proceso padre se ejecuta de forma
simultánea o concurrente con
su proceso hijo, o bien
2.
Espera que sus hijos (o parte de ellos) se terminen para poder continuar.
Espacio Direccionable
Con respecto al padre, el hijo
puede ser:
1.
Una réplica,
clon o duplicado de su padre: se copia el espacio del creador para el creado,
compartiendo el mismo código, datos, etc., o
2.
Un nuevo programa:
el proceso creado inicia un programa diferente al del creador, es decir, tiene
su propio programa cargado.
Funciones para
la creación de procesos
Existen varias llamadas al sistema utilizadas
para la creación de procesos. En el caso de los sistemas UNIX, entre las más
conocidas se encuentran:
§ fork( ): llamada
a sistema para la creación de procesos, donde el hijo es una copia exacta del
padre, salvo por el PID y la memoria que ocupan (las variables son
independientes. Ésta permite que el proceso hijo copie el espacio de
direcciones de su padre, por lo que tienen las mismas variables y ficheros
abiertos. Esta llamada al sistema retorna 0 si el proceso es un hijo, al padre
le retorna un entero positivo (que representa el PID del hijo) o un entero
negativo que indica un error en la creación del proceso.
§ exec( ): produce
la sustitución del programa invocados por el nuevo programa invocado, cambia el
espacio de memoria del proceso por un nuevo programa. Sustituye todos los
elementos del proceso: código del programa, datos, etc.). La combinación de las
llamadas fork y exec es el mecanismo que ofrece UNIX para
crear un nuevo proceso (fork) que ejecute un programa determinado (exec).
§ wait( ): sirve
para que el padre se ponga en espera hasta que su o sus procesos hijos
finalicen sus tareas, permitiendo la sincronización del padre con el hijo.
§ clone(): llamada
similar a fork(), pero
mucho más genérica y flexible, ya que permite definir qué van a compartir los
procesos padre e hijo.
Para el caso de los sistemas
Windows, la creación de procesos se hace a través de la función CreateProcess(), que es
similar a fork() en el sentido de que un padre crea un nuevo proceso hijo, con la
diferencia que con fork() el proceso hijo hereda el espacio de direcciones de su padre y con CreateProcess() se necesita cargar un programa específico en el espacio de las
direcciones del proceso hijo durante su creación.
Terminación de
procesos
Un proceso acaba cuando termina
de ejecutar su último enunciado y le pide al S.O. que lo elimine. Destruir o
terminar un proceso implica eliminarlo del sistema: se le borra de las tablas o
listas de procesos, sus recursos reutilizables se devuelven al sistema y su PCB
se borra, es decir, el espacio de memoria ocupado por su PCB se devuelve al
espacio de memoria disponible. Como es de esperar, el término de un proceso es
más difícil cuando éste ha creado otros procesos. En algunos sistemas un
proceso hijo se destruye automáticamente cuando su padre ha terminado, creando terminaciones en cascada, que son
iniciadas normalmente por el sistema operativo. En otros sistemas, los procesos
creados son independientes de sus padres, por lo que la destrucción de éste no
afecta sobre sus hijos.
En un sistema UNIX, un proceso se
termina con la llamada al sistema exit( ) (ExitProcess() en
Windows), proveniente del proceso mismo o de su padre, que permite que se
liberen todos los recursos asignados previamente. En el momento en que se hace
esta llamada, el proceso puede devolver un valor de estado a su proceso padre
(un entero normalmente) a través de la llamada al sistema wait(). El S.O. libera la asignación de
todos los recursos del proceso, incluyendo las memorias física, virtual, los
archivos abiertos y los búfer de E/S.
Al llamar a la función exit () un proceso padre puede esperar a la terminación de sus procesos
hijos usando la llamada al sistema wait(), que
devuelve el identificador de un proceso hijo completado, con el fin de que el
padre sepa cuál de sus hijos ha terminado. Sin embargo, si el proceso padre ha
terminado, a todos sus procesos hijos se les asigna un proceso init como nuevo padre, evitando la eliminación en cascada.
Algunas de las razones por la que
se termina un proceso son:
§ Un proceso
hijo sobrepasa el límite de recursos que le fueron asignados.
§ Las tareas
de un proceso ya no son necesarias.
§ El padre
finaliza, por lo que su hijo también.
§ La
ocurrencia de un error irrecuperable o no controlado.
§ Excede el
tiempo límite.
§ Errores
aritméticos.
§ Fallas de
E/S.
§ Instrucciones
inválidas.
Suspensión y
reanudación de procesos
Un proceso suspendido o bloqueado
no puede proseguir sino hasta ser reanudado por otro proceso. Generalmente, es
el S.O. el que se encarga de eliminar temporalmente ciertos procesos con el fin
de reducir la carga del sistema durante una situación crítica. Normalmente, los
procesos son suspendidos durante periodos pequeños para disminuir la exigencia
al sistema, pero también hay casos en que ocurren suspensiones más largas, en
las que es posible liberar los recursos del proceso para poder utilizarlos
durante ésta. Según la naturaleza del recurso, se toma la decisión de liberarlo
o no: la memoria principal debe ser liberada de inmediato cuando se suspenda un
proceso; una unidad de cinta puede ser retenida brevemente por un proceso
suspendido, pero debe ser liberada si el proceso se suspende por un periodo
largo o indefinido. Reanudar (o activar) un proceso implica reiniciarlo a
partir del punto en el que se suspendió.
La suspensión y reanudación de
procesos son importantes y han sido puestas en práctica en diferentes sistemas.
Estas operaciones pueden ser de gran necesidad en casos como:
§ Si un
sistema está funcionando mal, y es probable que falle, se puede suspender los
procesos activos para reanudarlos cuando se haya corregido el problema.
§ Un usuario
que desconfíe de los resultados parciales de un proceso puede suspenderlo (en
lugar de abortarlo) hasta que verifique si el proceso funciona correctamente o
no.
§ Algunos
procesos se pueden suspender como respuesta a las fluctuaciones a corto plazo
de la carga del sistema, y reanudarse cuando las cargas vuelvan a niveles
normales.
Ejemplo
Código
Ejemplo Creación de
Procesos en UNIX
#include <sys/types.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char ∗argv[]){
int num;
pid_t pid;
for(num = 0; num < 3; num++)
{
pid= fork(); //Crea el proceso hijo
printf("Soy el proceso de PID %d y mi padre tiene%d de PID.\n",getpid(), getppid());
if(pid != 0) //ve si el proceso hijo termino de ejecutarse
break;
srandom(getpid());
sleep(random() %3);
}
if(pid!= 0)
printf ("Fin del proceso de PID %d.\n", wait (NULL));
return 0;
}
Ejemplo Eliminacion de Procesos en UNIX
#include <sys/types.h>
#include <stdio.h>
main()
{
int pid;
if(fork()==0){ /* hijo */
fprintf(stdout, "hijo %d\n", getpid());
sleep(3);
edit.(0); /* termina el proceso*/
}else{ /* padre */
fprintf(stdout, "padre %d\n", getpid());
pid = wait(NULL); /* espera que finalice cualquier hijo */
fprintf(stdout, "fin del hijo %d\n", pid);
}
exit (0);
}
Tipo certamen
Certamen 1, segundo semestre
2009, profesor Javier Cañas:
¿Cuántos procesos crea el
siguiente programa?
#include <stdio.h>
#include <unistd.h>
int main()
{
fork(); /*F1*/
fork(); /*F2*/
fork(); /*F3*/
fork(); /*F4*/
return 0;
}
Respuesta: 15.....
Solución método 1
El padre (P1) crea 4
procesos (fork F1, F2, F3 y F4).
El primer hijo (P2) crea 3
procesos (fork F2, F3 y F4).
Su primer hijo (P6) crea 2
procesos (fork F3 y F4).
Su hijo (P12) crea 1
proceso (fork F4).
Su hijo (P16) no crea
proceso alguno.
Su otro hijo(P13) no crea
proceso alguno.
Su segundo hijo (P7) crea 1
proceso (fork F4).
Su hijo (P14) no crea
proceso alguno.
Su tercer hijo (P8) no crea
proceso alguno.
El segundo hijo (P3) crea 2
procesos (fork F3 y F4).
Su hijo (P9) crea 1 proceso
(fork F4).
Su hijo (P15) no crea
proceso alguno.
Su otro hijo (P10) no crea
proceso alguno.
Su tercer hijo (P4) crea 1
proceso (fork F4).
Su hijo (P11) no crea
proceso alguno.
Su cuarto hijo (P5) no crea
proceso alguno.
Por lo tanto, se han creado 15
procesos.
En general, se crean 2n − 1 procesos nuevos, donde n es el número de llamadas fork( ) que están presentes.
Solución método 2
Este método sirve para ver
también el nivel de profundidad n (veces que se ha aplicado el fork) en el que estamos, ya que cada
piso del árbol, representa una nueva llamada.
Planificación de
procesos en Sistemas Operativos. Conjunto de políticas y mecanismos
incorporados al sistema operativo, a través de un
módulo denominado planificador, que debe decidir cuál de los procesos en
condiciones de ser ejecutado conviene ser despachado primero y qué orden de
ejecución debe seguirse. Esto debe realizarse sin perder de vista su principal
objetivo que consiste en el máximo aprovechamiento del sistema, lo que implica
proveer un buen servicio a los procesos existentes en un momento dado.
Objetivos de la
Planificación de procesos
La Planificación de procesos tiene como principales
objetivos la equidad, la eficacia, el tiempo de respuesta, el tiempo de regreso
y el rendimiento.
Equidad: Todos los procesos deben ser atendidos.
Eficacia: El procesador debe estar ocupado el 100% del
tiempo.
Tiempo de respuesta: El tiempo empleado en dar
respuesta a las solicitudes del usuario debe ser el menor posible.
Tiempo de regreso: Reducir al mínimo el tiempo de
espera de los resultados esperados por los usuarios por lotes.
Rendimiento: Maximizar el número de tareas que se
procesan por cada hora.
Tipos de Planificación
de Procesos
Planificación a Plazo
Fijo
Ciertos trabajos se planifican para ser terminados en un tiempo específico o plazo fijo. Es una planificación compleja debido a los siguientes factores:
Ciertos trabajos se planifican para ser terminados en un tiempo específico o plazo fijo. Es una planificación compleja debido a los siguientes factores:
El usuario debe suministrar anticipadamente una lista
precisa de recursos necesarios para el proceso, pero generalmente no se dispone
de dicha información.
La ejecución del trabajo de plazo fijo no debe producir una
grave degradación del servicio a otros usuarios.
El sistema debe planificar cuidadosamente sus necesidades de
recursos hasta el plazo fijo, lo que se puede complicar con las demandas de
recursos de nuevos procesos que ingresen al sistema.
La concurrencia de varios procesos de plazo fijo (activos a
la vez) puede requerir métodos sofisticados de optimización.
La administración intensiva de recursos puede generar una
considerable sobrecarga adicional.
Planificación
Garantizada
Se establecen compromisos de desempeño con el proceso del usuario, por ejemplo, si existen “n”procesos en el sistema, el proceso del usuario recibirá cerca del “1 / n” de la potencia de la CPU.
El sistema debe tener un registro del tiempo de cpu que cada proceso ha tenido desde su entrada al sistema y del tiempo transcurrido desde esa entrada.
Con los datos anteriores y el registro de procesos en curso de ejecución, el sistema calcula y determina qué procesos están más alejados por defecto de la relación “1 / n” prometida y prioriza los procesos que han recibido menos CPU de la prometida.
Planificación del Primero en Entrar Primero en Salir (FIFO)
Es muy simple, los procesos se despachan de acuerdo con su tiempo de llegada a la cola de listos.
Una vez que el proceso obtiene la CPU, se ejecuta hasta terminar, ya que es una disciplina “no apreciativa”.
Puede ocasionar que procesos largos hagan esperar a procesos cortos y que procesos no importantes hagan esperar a procesos importantes.
Es más predecible que otros esquemas.
No puede garantizar buenos tiempos de respuesta interactivos.
Suele utilizarse integrado a otros esquemas, por ejemplo, de la siguiente manera:
Se establecen compromisos de desempeño con el proceso del usuario, por ejemplo, si existen “n”procesos en el sistema, el proceso del usuario recibirá cerca del “1 / n” de la potencia de la CPU.
El sistema debe tener un registro del tiempo de cpu que cada proceso ha tenido desde su entrada al sistema y del tiempo transcurrido desde esa entrada.
Con los datos anteriores y el registro de procesos en curso de ejecución, el sistema calcula y determina qué procesos están más alejados por defecto de la relación “1 / n” prometida y prioriza los procesos que han recibido menos CPU de la prometida.
Planificación del Primero en Entrar Primero en Salir (FIFO)
Es muy simple, los procesos se despachan de acuerdo con su tiempo de llegada a la cola de listos.
Una vez que el proceso obtiene la CPU, se ejecuta hasta terminar, ya que es una disciplina “no apreciativa”.
Puede ocasionar que procesos largos hagan esperar a procesos cortos y que procesos no importantes hagan esperar a procesos importantes.
Es más predecible que otros esquemas.
No puede garantizar buenos tiempos de respuesta interactivos.
Suele utilizarse integrado a otros esquemas, por ejemplo, de la siguiente manera:
Los procesos se despachan con algún esquema de prioridad.
Los procesos con igual prioridad se despachan “FIFO”.
Planificación de
Asignación en Rueda (RR: Round Robín)
Los procesos se despachan en “FIFO” y disponen de una cantidad limitada de tiempo de cpu, llamada “división de tiempo” o “cuanto”.
Si un proceso no termina antes de expirar su tiempo de cpu ocurren las siguientes acciones:
Los procesos se despachan en “FIFO” y disponen de una cantidad limitada de tiempo de cpu, llamada “división de tiempo” o “cuanto”.
Si un proceso no termina antes de expirar su tiempo de cpu ocurren las siguientes acciones:
La cpu es apropiada.
La cpu es otorgada al siguiente proceso en espera.
El proceso apropiado es situado al final de la lista de
listos.
Es efectiva en ambientes de tiempo compartido. La sobrecarga
de la apropiación se mantiene baja mediante mecanismos eficientes de
intercambio de contexto y con suficiente memoria principal para los procesos.
Tamaño del Cuanto o Quantum
La determinación del tamaño del cuanto es decisiva para la operación efectiva de un sistema computacional
Los interrogantes son: ¿cuánto pequeño o grande?, ¿cuánto fijo o variable? y ¿cuánto igual para todos los procesos de usuarios o determinado por separado para cada uno de ellos?.
Si el cuanto se hace muy grande, cada proceso recibe todo el tiempo necesario para llegar a su terminación, por lo cual la asignación en rueda (“RR”) degenera en “FIFO”.
Si el cuanto se hace muy pequeño, la sobrecarga del intercambio de contexto se convierte en un factor dominante y el rendimiento del sistema se degrada, puesto que la mayor parte del tiempo de cpu se invierte en el intercambio del procesador (cambio de contexto) y los procesos de usuario disponen de muy poco tiempo de cpu.
El cuanto debe ser lo suficientemente grande como para permitir que la gran mayoría de las peticiones interactivas requieran de menos tiempo que la duración del cuanto, es decir que el tiempo transcurrido desde el otorgamiento de la cpu a un proceso hasta que genera una petición de Entrada / Salida debe ser menor que el cuanto establecido, de esta forma, ocurrida la petición la cpu pasa a otro proceso y como el cuanto es mayor que el tiempo transcurrido hasta la petición de Entrada / Salida, los procesos trabajan al máximo de velocidad, se minimiza la sobrecarga de apropiación y se maximiza la utilización de la
Entrada / Salida.
El cuanto óptimo varía de un sistema a otro y con la carga, siendo un valor de referencia 100 mseg (cien milisegundos).
Planificación del Trabajo Más Corto Primero (SJF)
Es una disciplina no apropiativa y por lo tanto no recomendable en ambientes de tiempo compartido.
El proceso en espera con el menor tiempo estimado de ejecución hasta su terminación es el siguiente en ejecutarse.
Los tiempos promedio de espera son menores que con “FIFO”.
Los tiempos de espera son menos predecibles que en “FIFO”.
Favorece a los procesos cortos en detrimento de los largos.
Tiende a reducir el número de procesos en espera y el número de procesos que esperan detrás de procesos largos.
Requiere un conocimiento preciso del tiempo de ejecución de un proceso, lo que generalmente se desconoce.
Se pueden estimar los tiempos en base a series de valores anteriores.
Planificación del Tiempo Restante Más Corto (SRT)
Es la contraparte apropiativa del SJF.
Es útil en sistemas de tiempo compartido.
El proceso con el tiempo estimado de ejecución menor para…analizar es el siguiente en ser ejecutado.
Un proceso en ejecución puede ser apropiado por un nuevo proceso con un tiempo estimado de ejecución menor.
Tiene mayor sobrecarga que la planificación SJF.
Debe mantener un registro del tiempo de servicio transcurrido del proceso en ejecución, lo que aumenta la sobrecarga.
Los trabajos largos tienen un promedio y una varianza de los tiempos de espera aún mayor que en SJF.
La apropiación de un proceso a punto de terminar por otro de menor duración recién llegado podría significar un mayor tiempo de cambio de contexto (administración del procesador) que el tiempo de finalización del primero.
Al diseñarse los Sistemas Operativos se debe considerar cuidadosamente la sobrecarga de los mecanismos de administración de recursos comparándola con los beneficios esperados.
Planificación el Siguiente con Relación de Respuesta Máxima (HRN)
Corrige algunas de las debilidades del SJF, tales como el exceso de perjuicio hacia los procesos (trabajos) largos y el exceso de favoritismo hacia los nuevos trabajos cortos.
Es una disciplina no apropiativa.
La prioridad de cada proceso está en función no sólo del tiempo de servicio del trabajo, sino que también influye la cantidad de tiempo que el trabajo ha estado esperando ser servido.
Cuando un proceso ha obtenido la cpu, corre hasta terminar.
Las prioridades, que son dinámicas, se calculan según la siguiente fórmula, donde prs la “prioridad”, tees el “tiempo de espera” y ts es el “tiempo de servicio”:
Tamaño del Cuanto o Quantum
La determinación del tamaño del cuanto es decisiva para la operación efectiva de un sistema computacional
Los interrogantes son: ¿cuánto pequeño o grande?, ¿cuánto fijo o variable? y ¿cuánto igual para todos los procesos de usuarios o determinado por separado para cada uno de ellos?.
Si el cuanto se hace muy grande, cada proceso recibe todo el tiempo necesario para llegar a su terminación, por lo cual la asignación en rueda (“RR”) degenera en “FIFO”.
Si el cuanto se hace muy pequeño, la sobrecarga del intercambio de contexto se convierte en un factor dominante y el rendimiento del sistema se degrada, puesto que la mayor parte del tiempo de cpu se invierte en el intercambio del procesador (cambio de contexto) y los procesos de usuario disponen de muy poco tiempo de cpu.
El cuanto debe ser lo suficientemente grande como para permitir que la gran mayoría de las peticiones interactivas requieran de menos tiempo que la duración del cuanto, es decir que el tiempo transcurrido desde el otorgamiento de la cpu a un proceso hasta que genera una petición de Entrada / Salida debe ser menor que el cuanto establecido, de esta forma, ocurrida la petición la cpu pasa a otro proceso y como el cuanto es mayor que el tiempo transcurrido hasta la petición de Entrada / Salida, los procesos trabajan al máximo de velocidad, se minimiza la sobrecarga de apropiación y se maximiza la utilización de la
Entrada / Salida.
El cuanto óptimo varía de un sistema a otro y con la carga, siendo un valor de referencia 100 mseg (cien milisegundos).
Planificación del Trabajo Más Corto Primero (SJF)
Es una disciplina no apropiativa y por lo tanto no recomendable en ambientes de tiempo compartido.
El proceso en espera con el menor tiempo estimado de ejecución hasta su terminación es el siguiente en ejecutarse.
Los tiempos promedio de espera son menores que con “FIFO”.
Los tiempos de espera son menos predecibles que en “FIFO”.
Favorece a los procesos cortos en detrimento de los largos.
Tiende a reducir el número de procesos en espera y el número de procesos que esperan detrás de procesos largos.
Requiere un conocimiento preciso del tiempo de ejecución de un proceso, lo que generalmente se desconoce.
Se pueden estimar los tiempos en base a series de valores anteriores.
Planificación del Tiempo Restante Más Corto (SRT)
Es la contraparte apropiativa del SJF.
Es útil en sistemas de tiempo compartido.
El proceso con el tiempo estimado de ejecución menor para…analizar es el siguiente en ser ejecutado.
Un proceso en ejecución puede ser apropiado por un nuevo proceso con un tiempo estimado de ejecución menor.
Tiene mayor sobrecarga que la planificación SJF.
Debe mantener un registro del tiempo de servicio transcurrido del proceso en ejecución, lo que aumenta la sobrecarga.
Los trabajos largos tienen un promedio y una varianza de los tiempos de espera aún mayor que en SJF.
La apropiación de un proceso a punto de terminar por otro de menor duración recién llegado podría significar un mayor tiempo de cambio de contexto (administración del procesador) que el tiempo de finalización del primero.
Al diseñarse los Sistemas Operativos se debe considerar cuidadosamente la sobrecarga de los mecanismos de administración de recursos comparándola con los beneficios esperados.
Planificación el Siguiente con Relación de Respuesta Máxima (HRN)
Corrige algunas de las debilidades del SJF, tales como el exceso de perjuicio hacia los procesos (trabajos) largos y el exceso de favoritismo hacia los nuevos trabajos cortos.
Es una disciplina no apropiativa.
La prioridad de cada proceso está en función no sólo del tiempo de servicio del trabajo, sino que también influye la cantidad de tiempo que el trabajo ha estado esperando ser servido.
Cuando un proceso ha obtenido la cpu, corre hasta terminar.
Las prioridades, que son dinámicas, se calculan según la siguiente fórmula, donde prs la “prioridad”, tees el “tiempo de espera” y ts es el “tiempo de servicio”:
Planificación por Prioridad
Considera factores externos al proceso.
Las ideas centrales son que cada proceso tiene asociada una prioridad y que el proceso ejecutable con máxima prioridad es el que tiene el permiso de ejecución.
Los procesos de alta prioridad podrían ejecutar indefinidamente, ya que el planificador del sistema puede disminuir la prioridad del proceso en ejecución en cada interrupción del reloj.
Las prioridades también pueden ser asignadas dinámicamente por el sistema para lograr ciertas metas relacionadas con el procesador o la Entrada / Salida.
Los procesos limitados por la Entrada / Salida (requerimientos intensivos de Entrada / Salida) ocupan mucho de su tiempo en espera de operaciones de Entrada / Salida, por lo tanto:
Las ideas centrales son que cada proceso tiene asociada una prioridad y que el proceso ejecutable con máxima prioridad es el que tiene el permiso de ejecución.
Los procesos de alta prioridad podrían ejecutar indefinidamente, ya que el planificador del sistema puede disminuir la prioridad del proceso en ejecución en cada interrupción del reloj.
Las prioridades también pueden ser asignadas dinámicamente por el sistema para lograr ciertas metas relacionadas con el procesador o la Entrada / Salida.
Los procesos limitados por la Entrada / Salida (requerimientos intensivos de Entrada / Salida) ocupan mucho de su tiempo en espera de operaciones de Entrada / Salida, por lo tanto:
Deben tener prioridad para usar la cpu y efectuar la
siguiente petición de Entrada / Salida, ya que se ejecutará (la operación de
Entrada / Salida) en paralelo con otro proceso que utilice la cpu.
Si deben esperar mucho tiempo a la cpu estarán ocupando
memoria por un tiempo innecesario.
Un algoritmo sencillo consiste en establecer que la
prioridad sea “1 / f”, donde “f” es la fracción del último
cuanto utilizado por el proceso. Un proceso que utilice 2 mseg (dos
milisegundos) de su cuanto de 100 mseg (cien milisegundos) tendrá prioridad 50
(cincuenta).
Un proceso que se ejecutó 50 mseg antes del bloqueo tendrá prioridad 2.
Un proceso que utilizó todo el cuanto tendrá prioridad 1.
Frecuentemente los procesos se agrupan en “Clases de Prioridad”, en cuyo caso se utiliza la Planificación con Prioridades entre las clases y con Round Robín (RR) dentro de cada clase. Si las prioridades no se reajustan en algún momento, los procesos de las clases de prioridad mínima podrían demorarse indefinidamente.
Colas de Retro alimentación de Niveles Múltiples
Proporcionan una estructura para lograr los siguientes objetivos:
Un proceso que se ejecutó 50 mseg antes del bloqueo tendrá prioridad 2.
Un proceso que utilizó todo el cuanto tendrá prioridad 1.
Frecuentemente los procesos se agrupan en “Clases de Prioridad”, en cuyo caso se utiliza la Planificación con Prioridades entre las clases y con Round Robín (RR) dentro de cada clase. Si las prioridades no se reajustan en algún momento, los procesos de las clases de prioridad mínima podrían demorarse indefinidamente.
Colas de Retro alimentación de Niveles Múltiples
Proporcionan una estructura para lograr los siguientes objetivos:
Favorecer trabajos cortos.
Favorecer trabajos limitados por la Entrada / Salida para
optimizar el uso de los dispositivos de Entrada / Salida.
Determinar la naturaleza de un trabajo lo más rápido posible
y planificar el trabajo (proceso) en consecuencia.
Un nuevo proceso entra en la red de línea de espera al final
de la cola superior. Se mueve por esta cola “FIFO” hasta obtener la cpu.
Si el trabajo termina o abandona la cpu para esperar por la terminación de una operación de Entrada / Salida o la terminación de algún otro suceso, el trabajo abandona la red de línea de espera.
Si su cuanto expira antes de abandonar la cpu voluntariamente, el proceso se coloca en la parte trasera de la cola del siguiente nivel inferior.
El trabajo recibe servicio al llegar a la cabeza de esta cola si la primera está vacía.
Mientras el proceso continúe consumiendo totalmente su cuanto en cada nivel, continuará moviéndose hacia el final de las colas inferiores.
Generalmente hay una cola en la parte más profunda a través de la cual el proceso circula en asignación de rueda hasta que termina.
Existen esquemas en los que el cuanto otorgado al proceso aumenta a medida que el proceso se mueve hacia las colas de los niveles inferiores, en tal caso, cuanto más tiempo haya estado el proceso en la red de línea de espera, mayor será su cuanto cada vez que obtiene la cpu y no podrá obtener la cpu muy a menudo debido a la mayor prioridad de los procesos de las colas superiores.
Un proceso situado en una cola dada no podrá ser ejecutado hasta que las colas de los niveles superiores estén vacías.
Un proceso en ejecución es apropiado por un proceso que llegue a una cola superior.
Es un mecanismo adaptable, es decir que se adapta a cargas variables.
A los efectos de una revisión gráfica de lo enunciado precedentemente.
Política Versus Mecanismo de Planificación
Puede ocurrir que haya procesos con muchos procesos hijos ejecutándose bajo su control, por ejemplo, un proceso en un DBMS con procesos hijos atendiendo funciones específicas, tales como, análisis de interrogantes, acceso a discos, etc.
Es posible que el proceso principal (padre) pueda identificar la importancia (o criticidad) de sus procesos hijos, pero los planificadores analizados no aceptan datos de los procesos de usuario relativos a decisiones de planificación.
La solución es separar el mecanismo de planificación de la política de planificación, para ello se parametriza el algoritmo de planificación y los parámetros pueden ser determinados por medio de procesos del usuario; así el mecanismo está en el núcleo del Sistema Operativo pero la política queda establecida por un proceso del usuario.
Planificación de Dos Niveles
Los esquemas analizados hasta ahora suponen que todos los procesos ejecutables están en la memoria principal.
Si la memoria principal es insuficiente, ocurrirá lo siguiente:
Si el trabajo termina o abandona la cpu para esperar por la terminación de una operación de Entrada / Salida o la terminación de algún otro suceso, el trabajo abandona la red de línea de espera.
Si su cuanto expira antes de abandonar la cpu voluntariamente, el proceso se coloca en la parte trasera de la cola del siguiente nivel inferior.
El trabajo recibe servicio al llegar a la cabeza de esta cola si la primera está vacía.
Mientras el proceso continúe consumiendo totalmente su cuanto en cada nivel, continuará moviéndose hacia el final de las colas inferiores.
Generalmente hay una cola en la parte más profunda a través de la cual el proceso circula en asignación de rueda hasta que termina.
Existen esquemas en los que el cuanto otorgado al proceso aumenta a medida que el proceso se mueve hacia las colas de los niveles inferiores, en tal caso, cuanto más tiempo haya estado el proceso en la red de línea de espera, mayor será su cuanto cada vez que obtiene la cpu y no podrá obtener la cpu muy a menudo debido a la mayor prioridad de los procesos de las colas superiores.
Un proceso situado en una cola dada no podrá ser ejecutado hasta que las colas de los niveles superiores estén vacías.
Un proceso en ejecución es apropiado por un proceso que llegue a una cola superior.
Es un mecanismo adaptable, es decir que se adapta a cargas variables.
A los efectos de una revisión gráfica de lo enunciado precedentemente.
Política Versus Mecanismo de Planificación
Puede ocurrir que haya procesos con muchos procesos hijos ejecutándose bajo su control, por ejemplo, un proceso en un DBMS con procesos hijos atendiendo funciones específicas, tales como, análisis de interrogantes, acceso a discos, etc.
Es posible que el proceso principal (padre) pueda identificar la importancia (o criticidad) de sus procesos hijos, pero los planificadores analizados no aceptan datos de los procesos de usuario relativos a decisiones de planificación.
La solución es separar el mecanismo de planificación de la política de planificación, para ello se parametriza el algoritmo de planificación y los parámetros pueden ser determinados por medio de procesos del usuario; así el mecanismo está en el núcleo del Sistema Operativo pero la política queda establecida por un proceso del usuario.
Planificación de Dos Niveles
Los esquemas analizados hasta ahora suponen que todos los procesos ejecutables están en la memoria principal.
Si la memoria principal es insuficiente, ocurrirá lo siguiente:
Habrá procesos ejecutables que se mantengan en disco.
Habrá importantes implicaciones para la planificación, tales
como las siguientes:
El tiempo de alternancia entre procesos para traer y
procesar un proceso del disco es considerablemente mayor que el tiempo para un
proceso que ya está en la memoria principal.
Es más eficiente el intercambio de los procesos con un
planificador de dos niveles.
Sincronización y comunicación entre procesos:
Los procesos que ejecutan de forma concurrente en un sistema se pueden clasificar como procesos independientes o cooperantes. Un proceso independiente es aquel que ejecuta sin requerir la ayuda o cooperación de otros procesos. Un claro ejemplo de procesos independientes son los diferentes intérpretes de mandatos que se ejecutan de forma simultánea en un sistema. Los procesos son cooperantes cuando están diseñados para trabajar conjuntamente en alguna actividad, para lo que deben ser capaces de comunicarse e interactuar entre ellos.
Tanto si los procesos son independientes como cooperantes, pueden producirse una serie de interacciones entre ellos. Estas interacciones pueden ser de dos tipos:
Los procesos que ejecutan de forma concurrente en un sistema se pueden clasificar como procesos independientes o cooperantes. Un proceso independiente es aquel que ejecuta sin requerir la ayuda o cooperación de otros procesos. Un claro ejemplo de procesos independientes son los diferentes intérpretes de mandatos que se ejecutan de forma simultánea en un sistema. Los procesos son cooperantes cuando están diseñados para trabajar conjuntamente en alguna actividad, para lo que deben ser capaces de comunicarse e interactuar entre ellos.
Tanto si los procesos son independientes como cooperantes, pueden producirse una serie de interacciones entre ellos. Estas interacciones pueden ser de dos tipos:
Interacciones motivadas porque los procesos comparten o
compiten por el acceso a recursos físicos o lógicos. Esta situación aparece en
los distintos tipos de procesos anteriormente comentados. Por ejemplo, dos
procesos totalmente independientes pueden competir por el acceso a disco. En
este caso, el sistema operativo deberá encargarse de que los dos procesos
accedan ordenadamente sin que se cree ningún conflicto. Esta situación también
aparece cuando varios procesos desean modificar el contenido de un registro de
una base de datos. Aquí es el gestor de la base de datos el que se tendrá que
encargar de ordenar los distintos accesos al registro.
Interacción motivada porque los procesos se comunican y
sincronizan entre sí para alcanzar un objetivo común. Por ejemplo, un
compilador se puede construir mediante dos procesos: el compilador propiamente
dicho, que se encarga de generar código ensamblador, y el proceso ensamblador,
que obtiene código en lenguaje máquina a partir del ensamblador. En este
ejemplo puede apreciarse la necesidad de comunicar y sincronizar a los dos
procesos.
Estos dos tipos de interacciones obligan al sistema operativo a incluir mecanismo y servicios que permitan la comunicación y la sincronización entre procesos
Procesos concurrentes:
Dos o más procesos
decimos que son concurrentes, paralelos, o que se ejecutan concurrentemente,
cuando son procesados al mismo tiempo, es decir, que para ejecutar uno de
ellos, no hace falta que se haya ejecutado otro.
En sistemas
multiprocesador, esta ejecución simultánea podría conseguirse completamente,
puesto que podremos asignarle, por ejemplo, un proceso A al procesador A y un
proceso B al procesador B y cada procesador realizaran la ejecución de su
proceso.
Cuando tenemos un solo
procesador se producirá un intercalado delas instrucciones de ambos procesos,
de tal forma que tendremos la sensación de que hay un paralelismo en el sistema
(concurrencia, ejecución simultánea de más de un proceso).
Ahora bien, está claro
que en esto tenemos que tener en cuenta que mientras un proceso está
escribiendo un valor en una variable determinada, puede darse el caso que otro
proceso que es concurrente al primero vaya a leer o escribir en esa misma variable,
entonces habrá que estudiar el caso en el que un proceso haga una operación
sobre una variable (o recurso en general) y otro proceso concurrente a él
realice otra operación de tal forma que no se realice correctamente. Para
estudiar esto, y determinar el tipo de operaciones que se pueden realizar sobre
recursos compartidos utilizaremos las condiciones de Bernstein.
Tipos de procesos concurrentes:
Los procesos que ejecutan de forma concurrente en
un sistema se pueden clasificar como procesos independientes y
cooperantes.
Un proceso independiente es aquel que ejecuta sin requerir
la ayuda o cooperación de otros procesos. Un claro ejemplo de procesos
independientes son los diferentes intérpretes de mandatos que se ejecutan de
forma simultánea en un sistema.
Los procesos cooperantes, cuando están diseñados para
trabajar conjuntamente en alguna actividad, para lo que deben ser capaces de
comunicarse e interactuar entre ellos en el ejemplo del compilador que se vio
anteriormente, los dos procesos que lo conforman son procesos cooperantes.
Tanto si los procesos son cooperantes como
independientes, puede producirse una serie de interacciones entre ellos. Estas
interacciones pueden ser de dos tipos:
– Interacción motivada porque los procesos
comparten o compiten por el acceso a recursos físicos o lógicos. Esta situación
aparece en los distintos tipos de procesos anteriormente comentados. Por
ejemplo, dos procesos totalmente independientes pueden competir por el acceso
al disco. En este caso el sistema operativo deberá encargarse de que los dos
procesos accedan ordenadamente sin que se cree ningún conflicto.
Esta situación también aparece cuando varios procesos desean
modificar el contenido de un registro de una base de datos. Aquí es el gestor
de la base de datos el que se tendrá que encargar de ordenar los distintos
accesos al registro.
– Interacción motivada porque los procesos se comunican y
sincronizan entre sí para alcanzar un objetivo común. Por ejemplo, los procesos
compilador y ensamblador descritos anteriormente son dos procesos que
deben comunicarse y sincronizarse entre ellos con el fin de producir código en
lenguaje máquina.
Virtualmente todos los sistemas de tiempo-real son
inherentemente concurrentes (los dispositivos operan en paralelo en el mundo
real).
Definición de interrupción:
Una interrupción es una suspensión temporal de la ejecución
de un proceso,
para pasar a ejecutar una subrutina de servicio de interrupción, la cual, por
lo general, no forma parte del programa, sino que pertenece al sistema operativo o al BIOS.
Una vez finalizada dicha subrutina, se reanuda la ejecución del programa.
Las interrupciones son generadas por los dispositivos
periféricos habilitando una señal del CPU (llamada IRQ del
inglés "interrupt request") para solicitar atención del mismo. Por
ejemplo. Cuando un disco duro completa una lectura solicita atención al igual
que cada vez que se presiona una tecla o se mueve el ratón.
La primera técnica que se empleó para esto fue el polling, que consistía en que el propio
procesador se encargara de sondear los dispositivos periféricos cada cierto
tiempo para averiguar si tenía pendiente alguna comunicación para él. Este
método presentaba el inconveniente de ser muy ineficiente, ya que el procesador
consumía constantemente tiempo y recursos en realizar estas instrucciones de
sondeo.
El mecanismo de interrupciones fue la solución que permitió
al procesador desentenderse de esta problemática, y delegar en el dispositivo
periférico la responsabilidad de comunicarse con él cuando lo necesitara. El
procesador, en este caso, no sondea a ningún dispositivo, sino que queda a la
espera de que estos le avisen (le "interrumpan") cuando tengan algo
que comunicarle (ya sea un evento, una transferencia de información, una
condición de error.
Función del mecanismo de una interrupción:
Todos los dispositivos que deseen comunicarse con el
procesador por medio de interrupciones deben tener asignada una línea única
capaz de avisar al CPU cuando le requiere para realizar una operación. Esta
línea se denomina IRQ.
Las IRQ son líneas que llegan al controlador
de interrupciones, un componente de hardware dedicado a la gestión de las
interrupciones, y que puede estar integrado en el procesador principal o ser un
circuito separado conectado al mismo. El controlador de interrupciones debe ser
capaz de habilitar o inhibir las líneas de interrupción y establecer
prioridades entre las mismas. Cuando varias líneas de petición de interrupción
se activan a la vez, el controlador de interrupciones utilizará estas
prioridades para escoger la interrupción sobre la que informará al procesador
principal. También puede darse el caso de que una rutina de tratamiento de
interrupción sea interrumpida para realizar otra rutina de tratamiento de una
interrupción de mayor prioridad a la que se estaba ejecutando; aunque hay
interrupciones que no se pueden deshabilitar (conocidas como interrupciones
no enmascarables o NMI).
Un procesador principal que no tenga un controlador de
interrupciones integrado, suele tener una única línea de interrupción llamada
habitualmente INT. Esta línea es activada por el controlador de interrupciones
cuando tiene una interrupción que servir. Al activarse esta línea, el
procesador consulta los registros del
controlador de interrupciones para averiguar cual IRQ hay que atender. A partir
del número del IRQ busca en la tabla de vectores de
interrupción la dirección de la rutina a
la que debe llamar para atender la petición del dispositivo asociado a dicha
IRQ.
Procesamiento de una
interrupción:
Terminar la ejecución de la instrucción máquina en
curso.
Salvar el estado del procesador (valores de registros y
flags) y el valor del contador de
programa, IP, en la pila, de manera que en la CPU, al terminar el
proceso de interrupción, pueda seguir ejecutando el programa a partir de la
última instrucción.
La CPU salta a la dirección donde está almacenada la rutina
de servicio de interrupción (Interrupt Service Routine, o abreviado ISR) y
ejecuta esa rutina que tiene como objetivo atender al dispositivo que generó la
interrupción.
Una vez que la rutina de la interrupción termina, el
procesador restaura el estado que había guardado en la pila en el paso 2 y
retorna al programa que se estaba usando anteriormente.
Tipos de
interrupciones:
Atendiendo a la fuente que las produce, las interrupciones
pueden clasificarse de la siguiente forma:
Interrupciones de hardware. Estas son asíncronas a la
ejecución del procesador, es decir, se pueden producir en cualquier momento
independientemente de lo que esté haciendo el CPU en ese momento. Las causas
que las producen son externas al procesador y a menudo suelen estar ligadas con
los distintos dispositivos de entrada o salida.
Excepciones. Son aquellas que se producen de forma síncrona
a la ejecución del procesador y por tanto podrían predecirse si se analiza con
detenimiento la traza del programa que en ese momento estaba siendo ejecutado
en la CPU. Normalmente son causadas al realizarse operaciones no permitidas
tales como la división entre 0, el desbordamiento, el acceso a una posición de
memoria no permitida,.
Interrupciones por
software:
Las interrupciones
por software son aquellas generadas por un programa en ejecución. Para
generarlas, existen distintas instrucciones en el código máquina que
permiten al programador producir una interrupción, las cuales suelen tener
nemotécnicos tales como INT (por ejemplo, en DOS se
realiza la instrucción INT 0x21 y en Unix se
utiliza INT 0x80 para hacer llamadas de sistema).
Interrupciones de
hardware:
Las interrupciones de hardware son aquellas interrupciones
que se producen como resultado de, por lo general, una operación de E/S. No son
producidas por ninguna instrucción de un programa sino por las señales que
emiten los dispositivos
periféricos para indicarle al procesador que necesitan ser
atendidos.
Cuando el microprocesador accede a un periférico (disco
duro, puerto de comunicación...), puede transcurrir algún tiempo antes de que
los datos sean obtenidos o transmitidos. La solución más simple es esperar
hasta recibir los datos o hasta que se haya efectuado la transmisión (polling),
pero esta solución bloquea todos los programas en ejecución, y eso no puede
admitirse en un sistema multitarea. Por
ello, en los sistemas modernos se prefiere un funcionamiento mediante
interrupciones, ya que éstas permiten mejorar la productividad del procesador,
de forma que este último puede ordenar una operación de entrada o salida y, en
lugar de tener que realizar una espera activa, se puede dedicar a atender a
otro proceso o aplicación hasta que el dispositivo esté de nuevo disponible,
siendo dicho dispositivo el encargado de notificar al procesador mediante la
línea de interrupción que ya está preparado para continuar o terminar la
operación de entrada o salida.
Excepciones
Las excepciones son un tipo de interrupción sincrónica
típicamente causada por una condición de error en un programa, como por ejemplo
una división entre 0 o un acceso inválido a memoria en un proceso de usuario.
Normalmente genera un cambio de contexto a modo supervisor para que el sistema
operativo atienda el error. Así pues, las excepciones son un mecanismo de
protección que permite garantizar la integridad de los datos almacenados tanto
en el espacio de usuario como en el espacio kernel.
Cuando el Sistema Operativo detecta una excepción intenta solucionarla, pero en
caso de no poder simplemente notificará la condición de error a la
aplicación/usuario y abortará la misma.
Interrupciones por
software:
Las interrupciones por software, también denominadas llamadas al sistema,
son aquellas generadas por un programa mientras este está ejecutándose. En
general, actúan de la siguiente manera: Un programa en ejecución llega a una
instrucción que requiere del sistema operativo para alguna tarea, por ejemplo
para leer un archivo en el disco duro (cuando un programa necesita un dato
exterior, se detiene y pasa a cumplir con las tareas de recoger ese dato). En
ese momento por tanto llama al sistema y se interrumpe virtualmente hasta
recibir respuesta, en el ejemplo anterior hasta que no se haya leído el disco y
el archivo esté en memoria principal. Durante esa espera las instrucciones que
se ejecutarán no serán del programa, sino del sistema operativo. Una vez éste
termine su rutina ordenará reanudar la ejecución del programa auto interrumpido
en espera. Por último la ejecución del programa se reanuda.
Suscribirse a:
Entradas (Atom)