Upload
elvis-valero
View
1.463
Download
0
Tags:
Embed Size (px)
Citation preview
Republica Bolivariana de Venezuela
Ministerio del Poder Popular para la Educación Superior
Instituto Universitario de Tecnología Juan Pablo Pérez Alfonzo
Iutepal
Puerto cabello – Edo. Carabobo
Bachilleres:
Coello, Jhoan
Lugo Yonaike
Valero Elvis
Pérez Luis
Profesora:
Maricela,Manterrano
Enero 2011
Concurrencia
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.
La concurrencia comprende un gran número de cuestiones de
diseño, incluyendo la comunicación entre procesos, comparación y competencia
por los recursos, sincronización de la ejecución de varios procesos y asignación
del tiempo de procesador a los procesos y es fundamental para que existan
diseños como Multiprogramación.
En un sistema multiprogramado con un único procesador, losprocesos se intercalan en el tiempo para dar la apariencia de ejecuciónsimultánea. Cuando dos o más procesos se encuentran activos de formasimultánea (aunque esto no implica, que su ejecución física seasimultánea), se dice que son Concurrentes. Esta situación puederepresentarse como se observa en la siguiente gráfica:
Procesos de Concurrentes.
En la gráfica anterior puede verse que los procesos P1 y P2 son
concurrentes, mientras que P2 y P3 no lo son.
Siempre que exista multiprogramación se presenta un alta
probabilidad de concurrencia entre procesos. Ejemplos de procesos
concurrentes pueden ser los relacionados con trabajos de distintos usuarios
que corren simultáneamente, o procesos del sistema operativo. En general la
concurrencia será aparente siempre que el números de procesadores sea
menor que el número de procesos.
Los Beneficios de la concurrencia son:
Facilita la programación de aplicaciones permitiendo que se estructuren
como un conjunto de procesos que cooperan entre sí.
Acelera los cálculos, dividiendo una tarea en procesos que se ejecutan de
forma paralela.
Posibilita el uso interactivo a múltiples usuarios que trabajan de forma
simultánea desde varios terminales.
Permite un mejor aprovechamiento de los recursos, en especial del
procesador.
Tipos de Procesos Concurrentes
Independientes: Son aquellos procesos que se ejecutan sin la ayuda o
cooperación de otros procesos, estos no presentan problemas de
coordinación, pues por definición no hay interacción entre ellos. Un ejemplo de
estos son los procesos asociados a con dos usuarios distintos en un sistema
clásico de multiprogramación.
Dependientes: Estos trabajan de forma conjunta en alguna actividad, por lo que
deben ser capaces de comunicarse e interactuar entre ellos, para ello se crean
se crean mecanismos de comunicación y coordinación entre ellos.
Procesos son cooperantes: Son aquellos que están diseñados para trabajar
conjuntamente en alguna actividad, para lo que deben ser capaces de
comunicarse e interactuar entre ellos.
Los procesos son concurrentes si existen simultáneamente. Cuando dos o
más procesos llegan al mismo tiempo a ejecutarse, se dice que se ha presentado
una concurrencia de procesos. Es importante mencionar que para que dos o más
procesos sean concurrentes, es necesario que tengan alguna relación entre ellos La
concurrencia puede presentarse en tres contextos diferentes:
Varias aplicaciones: La multiprogramación se creó para permitir que el tiempo de
procesador de la máquina fuese compartido dinámicamente entre varios trabajos o
aplicaciones activas.
Aplicaciones estructuradas: Como ampliación de los principios del diseño
modular y la programación estructurada, algunas aplicaciones pueden
implementarse eficazmente como un conjunto de procesos concurrentes.
Estructura del sistema operativo: Las mismas ventajas de estructuración son
aplicables a los programadores de sistemas y se ha comprobado que algunos
sistemas operativos están implementados como un conjunto de procesos.
Existen tres modelos de computadora en los que se pueden ejecutar procesos
concurrente:
Multiproceso y Proceso distribuido
Multiprogramación: con un único procesador. El sistema operativo se
encarga de ir repartiendo el tiempo del procesador entre los distintos
procesos, intercalando la ejecución de los mismos para dar así una
apariencia de ejecución simultánea.
Multiprocesador: Es una maquina formada por un conjunto de
procesadores que comparten memoria principal. En este tipo de
arquitecturas, los procesos concurrentes no sólo pueden intercalar su
ejecución sino también superponerla.
Multicomputadora: Es una maquina de memoria distribuida, que
está formada por una serie de computadoras. En este tipo de
arquitecturas también es posible la ejecución simultánea de los
procesos sobre los diferentes procesadores.
Llamado también negativa de asignación de recursos, el algoritmo resuelve un
problema planteado porEdsger Dijkstra.
El algoritmo del banquero consiste en:
Estudiar cada solicitud al ocurrir ésta.
Ver si su otorgamiento conduce a un estado seguro:
En caso positivo, se otorga la solicitud.
En caso negativo, se la pospone.
Para ver si un estado es seguro:
Verifica si tiene los recursos suficientes para satisfacer a otro cliente: En caso
afirmativo, se supone que los préstamos se pagarán.
Se verifica al siguiente cliente cercano al límite y así sucesivamente.
Si en cierto momento se vuelven a pagar todos los créditos, el estado es seguro
y la solicitud original debe ser aprobada.
Algoritmo del Banquero
Existe un banco que tiene una reserva limitada de dinero a prestar y clientes
con línea de crédito. Un cliente pide dinero y no hay garantía de que haga reposiciones
hasta que saque la cantidad máxima. El banco puede rechazar el préstamo si hay
riesgo de que no tenga fondos para prestar a otros clientes. Viéndolo como Sistema
Operativo, los clientes serían los procesos, el dinero a prestar los recursos y el
banquero el S.O.
Para este algoritmo es importante considerar los siguientes puntos:
Estado: Es la asignación actual de los recursos a los procesos.
Matriz: demanda (o máximo necesario). Son las exigencias máximas de
recursos para cada proceso.
Matriz asignación: Son las asignaciones actuales de recursos para cada proceso.
Vector disponible: Cantidad total de recursos sin asignar a los procesos.
Estado seguro: Es un estado en el que existe al menos un orden en el que todos
los procesos pueden ejecutar hasta el final sin generar interbloqueo.
Se permiten las condiciones de “exclusión mutua”, “espera por” y “no
apropiatividad” .
Los procesos reclaman uso exclusivo de los recursos que requieren.
Los procesos mantienen los recursos mientras piden y esperan por otros recursos
adicionales, pero no pueden apropiarse de un proceso que mantenga esos recursos.
Las peticiones son de un recurso a la vez.
El S. O. puede conceder o negar cada una de las peticiones; si se niega una petición:
El proceso retiene los recursos que ya tiene asignados.
Espera un tiempo finito hasta que le sea atendida la petición.
El S. O. concede peticiones que den como resultado solo estados seguros. Dado que
el sistema se mantiene siempre en estado seguro, todas las peticiones serán
atendidas en un tiempo finito.
Asignación de Recursos por el Algoritmo del Banquero.
Requiere que exista un número fijo de recursos asignables, pero generalmente
no se puede contar con que el número de recursos se mantenga siempre
constante.
Requiere que la población de usuarios se mantenga constante, lo cual es
irrazonable.
Requiere que el S. O. garantice que todas las peticiones serán concedidas en un
tiempo finito, pero en la realidad se requieren mayores garantías.
Requiere que los procesos reintegren los recursos en un tiempo finito, pero en la
realidad se requieren mayores garantías.
Requiere que los procesos indiquen sus necesidades máximas de recursos por
adelantado, lo cual generalmente no ocurre.
Generalmente no es utilizado en S. O. reales.
Debilidades del Algoritmo del Banquero
Condición Método
Exclusión mutua Realizar un spooling general
Detenerse y esperarSolicitar todos los recursos al principio
No apropiación Retirar los recursos
Espera circularOrdenar los recursos en forma numérica
Resumen de los métodos para prevenir el bloqueo.
Los métodos para prevenir el bloqueo pueden resumirse según se indica en la Tabla
No es necesario expulsar y hacer retroceder procesos como en la detección
del interbloqueo.
Es menos restrictivo que la prevención.
Ventajas del algoritmo del banquero
Se debe conocer la máxima demanda de recursos por anticipado.
La ejecución de los recursos no debe estar forzada por la sincronización.
Se tiene un número fijo de procesos y recursos.
Los procesos no finalizan mientras retengan recursos.
Requiere que los procesos salden sus préstamos en un tiempo finito.
Desventajas
Ejemplo de Algoritmo del Banquero
Utilizando el algoritmo del banquero resuelva el siguiente
problema, indicando el orden en que los procesos pasan a ser estados
seguros evitando el problema del interbloqueo.
Lista de procesos: P1-P3-P4-P0 ó P2
A la derecha se tienen 5 procesos, cada uno tiene recursos de tipo A, B y C.
En la primer columna de asignados está la cantidad de recursos que el
proceso ha obtenido a lo largo de un tiempo; en la segunda columna de
Máximo Necesario, están los recursos que tiene que obtener de cada tipo
para comenzar a ser ejecutado. Por ejemplo, el P0 no ha obtenido ningún
recurso del tipo A, sólo 1 del tipo B y ninguno del tipo C, y necesita para
ejecutarse haber conseguido 7 del A, 5 del B y 3 del C.
En la última columna se tienen los recursos disponibles que da el sistema, los que se
pueden utilizar con todos los procesos. Hay 3 del A, 3 del B y 2 del C.
El algoritmo del banquero trata de asegurar qué proceso tiene un “estado seguro” es
decir, se requiere alcanzar el máximo requerido entre los que estén en Asignados y los
que se encuentren en Disponibles.
Ejemplo: El proceso 0 no está en estado seguro. Si se suman Asignados + Disponibles
para cada uno de los recursos A, B y C, realmente no se alcanzan los Máximos
Requeridos.
Entonces se va al proceso 1 y se trata de hacer lo mismo, sumar Asignados +
Disponibles. Allí sí se tiene un ESTADO SEGURO, A con 5, B con 3 y C con 2, y como
se alcanza a llenar los Máximos, ese proceso se ejecuta.
Una vez que el proceso se ejecutó, entonces se procede a SUMAR los recursos
asignados del proceso anterior a los disponibles. Hay que recordar que el proceso al
terminar de ejecutarse libera todos sus recursos, por lo tanto pasan tanto los de tipo
A, B y C a sumarse con los disponibles 3-3-2 y se tendrán nuevos DISPONIBLES que
repartir, siendo ahora éstos 5-3-2
Con estos se pasa al proceso P2 y así sucesivamente.
Y el algoritmo es como sigue:
(El algoritmo principal es el de asignación de recursos)
Es un algoritmo de control de procesos, Son una herramienta de sincronización.
Es una variable protegida que solo puede ser modificada por la rutina de inicialización y por
otras dos operaciones atómicas:
P( ) <- wait
V( ) <- signal
Las operaciones a las cuales se puede acceder son:
Inicialización: Crea un nuevo semáforo asignándole un valor inicial
P(s): while (s=0) do no_op ATÓMICA
s:=s-1
V(s): s:=s+1 ATÓMICA.
tiene solo dos operaciones básicas, las cuales son:
Wait.- Pregunta a los procesos si su contador es > ó = que cero, en caso de no ser
así, los decrementa. El proceso que cambia en este caso a negativo (−1) desde la cola
de procesos Listos a ser ejecutados es el que automáticamente toma el control del
procesador.
Signal.- A partir de un tiempo t definido por el despachador se ejecuta, y pregunta a los
procesos si su contador es < que cero en caso de que sea afirmativa la respuesta, saca
a este proceso de su ejecución y depende de su estado.
Semáforos
Semáforos contadores: Toman valores positivos mayores o iguales a 0. Se utilizan
para sincronización de procesos.
Semáforos binarios: Toman los valores 0 ó 1 y se utilizan para exclusión mutua.
Los semáforos pueden ser usados para diferentes propósitos, entre ellos:
Implementar cierres de exclusión mutua o locks Barreras
Permitir a un máximo de N threads acceder a un recurso, inicializando el semáforo en N
Notificación. Inicializando el semáforo en 0 puede usarse para comunicación entre
threads sobre la disponibilidad de un recurso
Tipos de Semáforos
Uso
Los semáforos se emplean para permitir el acceso a diferentes partes de
programas (llamados secciones críticas) donde se manipulan variables o recursos que
deben ser accedidos de forma especial. Según el valor con que son inicializados se
permiten a más o menos procesos utilizar el recurso de forma simultánea.
Un tipo simple de semáforo es el binario, que puede tomar solamente los valores 0 y
1. Se inicializan en 1 y son usados cuando sólo un proceso puede acceder a un
recurso a la vez. Son esencialmente lo mismo que los mutex. Cuando el recurso está
disponible, un proceso accede y decrementa el valor del semáforo con la operación P.
El valor queda entonces en 0, lo que hace que si otro proceso intenta decrementillo
tenga que esperar. Cuando el proceso que decremento el semáforo realiza una
operación V, algún proceso que estaba esperando comienza a utilizar el recurso.
En el siguiente ejemplo se crean y ejecutan n procesos que intentarán entrar en su
sección crítica cada vez que puedan, y lo lograrán siempre de a uno por vez, gracias
al uso del semáforo s inicializado en 1. El mismo tiene la misma función que un lock.
const int n /* número de procesos */
variable semáforo s; /* declaración de la variable semáforo de valor entero*/
Inicia (s,1) /* Inicializa un semáforo con nombre s con valor 1 */
void P (int i)
{
while (cierto)
{
P(s) /* En semáforos binarios, lo correcto es poner un P(s) antes de entrar en la
sección crítica, para restringir el uso de esta región del código*/
/* SECCIÓN CRÍTICA */
V(s) /* Tras la sección crítica, volvemos a poner el semáforo a 1 para que otro proceso
pueda usarla */
/* RESTO DEL CÓDIGO */
}
}
int main()
{
Comenzar-procesos(P(1), P(2),...,P(n));
}
Es un tipo de procedimientos, variables y estructuras de datos que se
agrupan en un tipo de modulo especial. Tienen una propiedad importante: solo un
proceso puede estar activo en un monitor en un instante de tiempo. los monitores son
objetos destinados a ser usados sin peligro por más de un hilo de ejecución. La
característica que principalmente los define es que sus métodos son ejecutados con
exclusión mutua. Lo que significa, que en cada momento en el tiempo, un hilo como
máximo puede estar ejecutando cualquiera de sus métodos. Esta exclusión mutua
simplifica el razonamiento de implementar monitores en lugar de código a ser ejecutado
en paralelo
Los monitores proveen un nuevo tipo de variables de condición con dos operaciones
que operan sobre el (solo se usan dentro del procedimiento de el monitor).
Wait -> wait(a) : produce que el proceso que ejecuta la instrucción sea interrumpido
y removido de la cola de ready hasta que otro proceso lo habilite ejecutando la
instrucción signal( )con la misma variable de condición.
Signal -> signal(a) : Habilita la ejecución de algún proceso en espera por la ejecución
de la instrucción wait con la misma variable de condición.
Monitores
Un monitor encapsula el código relativo a un recurso compartido en un solo
módulo de programa; ventajas:
• mantenimiento más simple
• menos errores de programación
• La interfaz del monitor es un conjunto de funciones que representan las diferentes
operaciones que pueden hacerse con el recurso
La implementación del monitor garantiza la exclusión mutua
• mediante semáforos o algún otro mecanismo
• o implícitamente en los lenguajes concurrentes
Un monitor tiene cuatro componentes: inicialización, datos
privados, procedimientos del monitor y cola de entrada.
Inicialización: contiene el código a ser ejecutado cuando el monitor es creado
Datos privados: contiene los procedimientos privados, que sólo pueden ser usados
desde dentro del monitor y no son visibles desde fuera
Procedimientos del monitor: son los procedimientos que pueden ser llamados
desde fuera del monitor.
Cola de entrada: contiene a los hilos que han llamado a algún procedimiento del
monitor pero no han podido adquirir permiso para ejecutarlos aún.
Funcionamiento del monitor
Cada uno de los objetos del sistema operativo contiene una serie de
contadores que permiten conocer el estado de actividad del objeto. Para algunos
de estos objetos, los contadores deben ser activados antes de ejecutar el monitor
del sistema. Ejemplos de objetos que podemos monitorizar son las unidades de
disco físicas, los procesadores, la memoria física, la memoria caché, y otros
componentes, que incluyen los componentes del sistema de red. Incluso algunas
aplicaciones como servidores SQL y otros pueden añadir sus propios tipos de
objetos y contadores.
es la abreviatura de “mutual exclusión”, es decir, exclusión mutua. Las
variables Mutex son la forma más común de implementar la sincronización de threads y
de proteger datos compartidos cuando acontecen multitud de escrituras sobre esos
datos compartidos.
Una variable Mutex actúa como un candado protegiendo los datos o recursos.
El concepto básico de Mutex en Pthreads es que sólo un thread puede cerrar el
candado en un determinado instante. Incluso si varios threads intentan cerrar el mismo
candado sólo uno saldrá victorioso. Ningún otro thread podrá poseer ese Mutex hasta
que el que lo cerró lo abra. Es decir, con esto conseguimos que los threads se turnen
para acceder a datos protegidos o compartidos.
Mutex
Los Mutex pueden ser usados para prevenir “condiciones de carrera”. Este
es un ejemplo de una “condición de carrera” en una transacción de un banco.
Una típica secuencia en el uso de un Mutex es:
1. Crear e inicializar la variable Mutex.
2. Varios threads intentan bloquear el Mutex.
3. Sólo uno lo hace y es el poseedor del Mutex.
4. El poseedor del Mutex realiza un conjunto de acciones.
5. El poseedor del Mutex desbloquea el Mutex.
6. Otro thread toma el Mutex y repite el proceso.
7. Finalmente el Mutex es destruido.
Cuando varios threads compiten por un Mutex, los perdedores se bloquean hasta que
el ganador desbloquea el Mutex.
Mutex
Es una técnica de manejo de memoria, en la cual el espacio de memoria se
divide en secciones físicas de igual tamaño, denominadas marcos de página. Los
programas se dividen en unidades lógicas, denominadas páginas, que tienen el mismo
tamaño que los marcos de páginas. De esta forma, se puede cargar una página de
información en cualquier marco de página. Las páginas sirven como unidad de
almacenamiento de información y de transferencia entre memoria principal y memoria
auxiliar o secundaria. Cada marco se identifica por la dirección de marco, que esta en la
posición física de la primera palabra en el marco de página.
Paginación Simple
Paginación simple con este método la memoria principal se divide en
muchos marcos pequeños de igual tamaño. Cada proceso se divide en páginas
de igual tamaño; los procesos más pequeños requieren menos
páginas, procesos mayores requieren mas espacio de memoria. Cuando un
proceso se trae a la memoria todas sus páginas se cargan en los marcos
disponibles y se establece una tabla de páginas, facilitando la localización de
las referencias o direcciones que se le asignaron a estas y se evita, la
fragmentación tanto interna como externa.
Paginación y segmentación son técnicas diferentes, cada una de las cuales
busca brindar las ventajas enunciadas anteriormente. Para la segmentación se necesita
que estén cargadas en memoria, áreas de tamaños variables. Si se requiere cargar un
segmento en memoria; que antes estuvo en ella y fue removido a memoria secundaria;
se necesita encontrar una región de la memoria lo suficientemente grande para
contenerlo, lo cual no es siempre factible; en cambio "recargar" una pagina implica solo
encontrar un merco de pagina disponible.
A nivel de paginación, si quiere referenciar en forma cíclicas n paginas, estas
deberán ser cargadas una a una generándose varias interrupciones por fallas de
paginas; bajo segmentación, esta pagina podría conformar un solo segmento,
ocurriendo una sola interrupción, por falla de segmento
Segmentación Paginada
El algoritmo de sustitución de páginas de primera que entra, primera que sale
(FIFO) Otro algoritmo de paginación con bajo gasto extra es el algoritmo FIFO (primera
que entra, primera que sale). Para ilustrar su funcionamiento, consideremos un
supermercado que tiene suficientes anaqueles para exhibir exactamente k productos
distintos. Un día, alguna compañía introduce un nuevo alimento: yogurt orgánico
liofilizado instantáneo que puede reconstituirse en un homo de microondas. Su éxito es
inmediato, así que nuestro supermercado finito tiene que deshacerse de un producto
viejo para poder tener el nuevo en exhibición.
Una modificación sencilla de FIFO que evita el problema de desalojar una
página muy utilizada consiste en inspeccionar el bit R de la página más vieja. Si es
O, sabremos que la página, además de ser vieja, no ha sido utilizada recientemente, así
que la reemplazamos de inmediato. Si el bit R es 1, se apaga el bit, se coloca la página
al final de la lista de páginas, y se actualiza su tiempo de carga como si acabara de ser
traída a la memoria. Luego continúa la búsqueda.
Algoritmo de Paginación FIFO
El algoritmo de sustitución de páginas menos recientemente usadas
(LRU) Una buena aproximación al algoritmo óptimo se basa en la observación de
que las páginas que han usado mucho en las últimas instrucciones probablemente
se usarán mucho en las siguientes. Por otro lado, las páginas que hace mucho no
se usan probablemente seguirán sin usarse durante largo tiempo. Esta idea
sugiere un algoritmo factible: cuando ocurra una falla de página, se desalojará la
página que haya estado más tiempo sin usarse. Esta estrategia se denomina
paginación LRN (menos recientemente utilizada). Aunque LRU es factible en
teoría, no es barato. Si queremos implementar LRU plenamente, necesitamos
mantener una lista enlazada de todas las páginas que están en la memoria, con la
página más recientemente utilizada al frente y la menos recientemente utilizada al
final
Algoritmo de Paginación LRU
Algoritmo de Paginación Optimo
El mejor algoritmo de reemplazo de páginas posible es fácil de describir
pero imposible de implementar. En el momento en que ocurre una falla de
páginas, algún conjunto de páginas está en la memoria. A una de estas páginas se
hará referencia en la siguiente instrucción (la página que contiene esa instrucción).
Otras páginas podrían no necesitarse sino hasta 10, 100 o tal vez 1000
instrucciones después. Cada página puede rotularse con el número de
instrucciones que se ejecutarán antes de que se haga referencia a esa página. El
algoritmo de reemplazo de páginas óptimo simplemente dice que se debe eliminar
la página que tenga el rótulo más alto.
Si una página no se va a usar sino hasta después de 8 millones de
instrucciones y otra página no se usará sino hasta después de 6 millones de
instrucciones, el desalojo de la primera postergará la falla de página que la traerá
de nuevo a la memoria lo más lejos hacia el futuro que es posible. Las
computadoras, al igual que las personas, tratan de aplazar los sucesos
desagradables el mayor tiempo que se puede
Algoritmo de Paginación LRU
Algoritmo de Paginación Optimo
Algoritmo de Paginación FIFO
Bachilleres:
Coello, Jhoan