Subido por Golito 26

resumen-libro-sistemas-operativos-capitulo-2-introduccion-a-los compress

Anuncio
Resumen
Libro: Sistemas Operativos
Capítulo 2:
Introducción a los sistemas operativos
2.1 Objetivos y funciones de los sistemas operativos
Un sistema operativo es un programa que controla la ejecución de aplicaciones y programas y
que actúa como interfaz entre las aplicaciones y el hardware del computador. Se puede
considerar que un sistema operativo tiene los siguientes tres objetivos:

Facilidad de uso.

Eficiencia.

Capacidad para evolucionar.
El sistema operativo como gestor de recursos
De hecho, el sistema operativo es un conjunto de programas. Como otros programas,
proporciona instrucciones para el procesador. La principal diferencia radica en el objetivo del
programa. El sistema operativo dirige al procesador en el uso de los otros recursos del
sistema y en la temporización de la ejecución de otros programas.
2.3 Principales logros
Principales avances teóricos en el desarrollo de sistemas operativos:

Procesos.

Gestión de memoria.

Protección y seguridad de la información.

Planificación y gestión de los recursos.

Estructura del sistema.
Existen cuatro causas principales de errores:

Inapropiada sincronización: Es frecuente el hecho de que una rutina se suspenda
esperando por algún evento en el sistema.

Violación de la exclusión mutua: Frecuentemente, más de un programa o usuario
intentan hacer uso de recursos compartidos simultáneamente.

Operación no determinista de un programa: Cuando los programas comparten memoria,
y sus ejecuciones son entrelazadas por el procesador, podrían interferir entre ellos.

Interbloqueos: Es posible que dos o más programas se queden bloqueados esperándose
entre sí.
Se puede considerar que un proceso está formado por:

Un programa ejecutable.
1

Los datos asociados que necesita el programa (variables, espacio de trabajo, buffers,
etc.).

El contexto de ejecución del programa.
El contexto de ejecución, o estado del proceso, es el conjunto de datos interno por el cual el
sistema operativo es capaz de supervisar y controlar el proceso.
2.4 Desarrollos que han llevado a los sistemas operativos modernos
Un amplio rango de diferentes técnicas y elementos de diseño se han probado tanto en
sistemas operativos experimentales como comerciales, pero la mayoría de este trabajo encaja
en las siguientes categorías:

Arquitectura micronúcleo o microkernel.

Multihilo.

Multiprocesamiento simétrico (SMP).

Sistemas operativos distribuidos.

Diseño orientado a objetos.
Multithreading es una técnica en la cual un proceso, ejecutando una aplicación, se divide en
una serie de hilos o threads que pueden ejecutarse concurrentemente. Se pueden hacer las
siguientes distinciones:

Thread o hilo. Se trata de una unidad de trabajo. Un hilo se ejecuta secuencialmente y
se puede interrumpir de forma que el procesador pueda dar paso a otro hilo.

Proceso. Es una colección de uno o más hilos y sus recursos de sistema asociados (como
la memoria, conteniendo tanto código, como datos, ficheros abiertos y dispositivos).
Esto corresponde al concepto de programa de ejecución. Dividiendo una sola aplicación
en múltiples hilos, el programador tiene gran control sobre la modularidad de las
aplicaciones y temporización de los eventos relacionados con la aplicación.
Modelo Cliente/Servidor
Ésta misma arquitectura se puede adoptar para el uso interno de un solo sistema, como es el
caso de Windows.
Cada subsistema de entorno y subsistema del servicio ejecutivo se implementa como uno o más
procesos. Cada proceso espera la solicitud de un cliente por uno de sus servicios (por ejemplo,
servicios de memoria, servicios de creación de procesos o servicios de planificación de
procesadores). Un cliente, que puede ser un programa u otro módulo del sistema operativo,
solicita un servicio a través del envío de un mensaje.
Las ventajas de la arquitectura cliente/servidor son las siguientes:

Simplifica el sistema ejecutivo.

Mejora la fiabilidad. Cada módulo de los servicios ejecutivos se ejecuta como un
proceso separado.

Proporciona a las aplicaciones maneras uniformes de comunicarse.

Proporciona una base adecuada para la computación distribuida.
2
2.6 Sistemas UNIX tradicionales
2.8 Linux
Estructura modular
Aunque Linux no utiliza una técnica de micronúcleo, logra muchas de las ventajas potenciales
de ésta técnica por medio de su arquitectura modular particular. Linux está estructurado
como una colección de módulos, algunos de los cuales pueden cargarse y descargarse
automáticamente bajo demanda. Estos bloques relativamente independientes se denominan
módulos cargables.
Por tanto, aunque Linux se puede considerar monolítico, su estructura modular elimina algunas
de las dificultades para desarrollar y evolucionar su núcleo.
Los módulos cargables de Linux tienen dos características importantes:

Enlace dinámico: Un módulo de núcleo puede cargarse y enlazarse al núcleo mientras el
núcleo está en memoria y ejecutándose. Un módulo también puede desenlazarse y
eliminarse de la memoria en cualquier momento.

Módulos apilables: Los módulos se gestionan como una jerarquía. Los módulos
individuales sirven como bibliotecas cuando los módulos cliente los referencian desde la
parte superior de la jerarquía, y actúan como clientes cuando referencian a módulos de
la parte inferior de la jerarquía.
Cada módulo se define mediante dos tablas, la tabla de módulos y la tabla de símbolos.
Componentes del núcleo
Brevemente, los principales componentes del núcleo son los siguientes:

Señales: El núcleo utiliza las señales para llamar a un proceso.

Llamadas al sistema.

Procesos y planificador: Crea, gestiona y planifica procesos.

Memoria virtual: Asigna y gestiona la memoria virtual para los procesos.

Sistema de ficheros.

Protocolos de red.

Controladores de dispositivos tipo carácter.

Controladores de dispositivos tipo bloque.

Controladores de dispositivos de red.

Traps y fallos.

Memoria física.

Interrupciones
Capítulo 3:
Descripción y control de procesos
3

El sistema operativo debe intercalar la ejecución de múltiples procesos, para
maximizar la utilización del procesador mientras se proporciona un tiempo de
respuesta razonable.

El sistema operativo debe reservar recursos para los procesos conforme a una política
específica (por ejemplo, ciertas funciones o aplicaciones son de mayor prioridad)
mientras que al mismo tiempo evita interbloqueos. (un interbloqueo ocurre si dos
procesos necesitan dos recursos iguales para continuar y cada uno de los procesos
tiene la posesión de uno de los recursos. A menos que se realice alguna acción, cada
proceso esperará indefinidamente por conseguir el otro recurso.)

Un sistema operativo puede requerir dar soporte a la comunicación entre procesos y la
creación de procesos, mediante las cuales ayuda a la estructuración de las aplicaciones.
3.1 ¿Qué es un proceso?
Conceptos previos
Procesos y bloques de control de procesos
Término proceso:

Un programa en ejecución.

Una instancia de un programa ejecutado en un computador.

La entidad que se puede asignar y ejecutar en un procesador.

Una unidad de actividad que se caracteriza por la ejecución de una secuencia de
instrucciones, un estado actual, y un conjunto de recursos del sistema asociados.
También se puede pensar en un proceso como en una entidad que consiste en un número de
elementos. Los dos elementos esenciales serían el código de programa (que puede compartirse
con otros procesos que estén ejecutando el mismo programa) y un conjunto de datos asociados
a dicho código.
El proceso se puede caracterizar por una serie de elementos:

Identificador: Un identificador único asociado a este proceso, para distinguirlo del
resto de procesos.

Estado: Si el proceso está actualmente corriendo, está en el estado en ejecución.

Prioridad: Nivel de prioridad relativo al resto de procesos.

Contador de programa: La dirección de la siguiente instrucción del programa que se
ejecutará.

Punteros a memoria.

Datos de contexto.

Información de estado de E/S.

Información de auditoría.
4
La información de la lista anterior se almacena en una estructura de datos, que se suele llamar
bloque de control de proceso (process control block), que el sistema operativo crea y gestiona.
El punto más significativo en relación al bloque de control de proceso, o BCP, es que contiene
suficiente información de forma que es posible interrumpir el proceso cuando está corriendo
y posteriormente restaurar su estado de ejecución como si no hubiera habido interrupción
alguna. El BCP es la herramienta clave que permite al sistema operativo dar soporte a
múltiples procesos y proporcionar multiprogramación. Cuando un proceso se interrumpe, los
valores actuales del contador de programa y los registros del procesador (datos de contexto)
se guardan en los campos correspondientes del BCP y el estado del proceso se cambia a
cualquier otro valor, como bloqueado o listo.
3.2 Estados de los procesos
Se puede caracterizar el comportamiento de un determinado proceso, listando la secuencia de
instrucciones que se ejecutan para dicho proceso. A esta lista se la denomina traza del
proceso. Se puede caracterizar el comportamiento de un procesador mostrando cómo las
trazas de varios procesos se entrelazan.
Existe un pequeño programa activador (dispatcher) que intercambia el procesador de un
proceso a otro.
Cuando un sistema operativo crea un proceso a petición explícita de otro proceso, dicha acción
se denomina creación del proceso.
Cuando un proceso lanza otro, al primero se le denomina proceso padre, y al proceso creado se
le denomina proceso hijo.
Listo: Un proceso que se prepara para ejecutar cuando tenga oportunidad.
Bloqueado: Un proceso que no puede ejecutar hasta que se cumpla un evento determinado o se
complete una operación E/S.
Si la activación de procesos está dictada por un esquema de prioridades, sería conveniente
tener varias colas de procesos listos, una por cada nivel de prioridad. El sistema operativo
podría determinar cuál es el proceso listo de mayor prioridad simplemente seleccionando
éstas en orden.
Procesos suspendidos
La necesidad de intercambio o swapping.
La memoria almacena múltiples procesos y el procesador puede asignarse a otro proceso si el
que lo usa se queda bloqueado.
Swapping (memoria de intercambio), implica mover parte o todo el proceso de memoria
principal a disco.
El sistema operativo intercambia uno de los procesos bloqueados a disco, colocándolo en la
cola de suspendidos. Esta es una lista de procesos existentes que han sido temporalmente
5
expulsados de la memoria principal, o suspendidos. El sistema operativo trae otro proceso de
la cola de suspendidos o responde a una solicitud de un nuevo proceso.
Con el uso de swapping tal y como se ha descrito, debe añadirse un nuevo estado a nuestro
modelo, el estado suspendido. Cuando todos los procesos en memoria principal se encuentran
en estado bloqueado, el sistema operativo puede suspender un proceso poniéndolo en el estado
suspendido y transfiriéndolo a disco. El espacio que se libera en memoria principal puede
usarse para traer a otro proceso.
Bloqueado/suspendido: el proceso está en almacenamiento secundario y esperando un evento.
Listo/suspendido: El proceso está en almacenamiento secundario pero está disponible para su
ejecución tan pronto como sea cargado en memoria principal.
Con un esquema de memoria virtual, es posible ejecutar un proceso que está sólo parcialmente
en memoria principal. El uso de la memoria virtual podría parecer que elimina la necesidad del
swapping explícto, porque cualquier dirección necesitada por un proceso que demande puede
traerse o transferirse de disco a memoria por el propio hardware de gestión de memoria del
procesador. Sin embargo, el rendimiento de los sistemas de memoria virtual pueden colapsarse
si hay un número suficientemente grande de procesos activos, todos ellos están parcialmente
en memoria principal. De esta forma, incluso con un sistema de memoria virtual, el sistema
operativo necesita hacer swapping de los procesos de forma explícita y completa, de vez en
cuando, con la intención de mejorar el rendimiento.
3.3 Descripción de procesos
Se piensa en el sistema operativo como en la entidad que gestiona el uso del sistema por parte
de los procesos.
El sistema operativo construye y mantiene tablas de información sobre cada entidad que
gestiona.
Cuatro tipos diferentes de tablas son mantenidas por el sistema operativo: memoria, E/S,
ficheros y procesos.
Las tablas de memoria se usan para mantener un registro tanto de la memoria principal (real)
como de la memoria secundaria (virtual). Parte de la memoria principal está reservada para el
uso del sistema operativo; el resto está disponible para el uso de los procesos.
El sistema operativo debe utilizar las tablas E/S para gestionar los dispositivos de E/S y los
canales del computador.
El sistema operativo también puede mantener las tablas de ficheros. Estas tablas
proporcionan información sobre la existencia de ficheros, su posición en almacenamiento
secundario, su estado actual, y otros atributos.
El sistema operativo debe mantener tablas de procesos para gestionar los procesos. Debe
quedar claro que estas tablas se encuentran entrelazadas y referenciadas entre sí de alguna
manera.
6
Estructuras de control de proceso
Se considerará que información debe conocer el sistema operativo si quiere manejar y
controlar los procesos. Primero, debe conocer dónde están localizados los procesos, y
segundo, debe conocer los atributos de los procesos que quiere gestionar (por ejemplo,
identificador de proceso y estado del mismo).
Localización de los procesos: -representación física de un procesoCada proceso está asociado a un número de atributos que son utilizados por el sistema
operativo para controlar el proceso. El conjunto de estos atributos se denomina bloque de
control de proceso (BCP).
Para ejecutar el proceso, la imagen del proceso completa se debe cargar en memoria principal
o al menos en memoria virtual.
Elementos típicos de la imagen de un proceso:
Datos del usuario
Programa de usuario
Pila de sistema
Bloque de control de proceso
Atributos de proceso.
La lista de los tipos de categorías de información que el sistema operativo requiere para cada
proceso.
Podemos agrupar la información del bloque de control de proceso (BCP) en tres categorías
generales:

Identificación del proceso.

Información de estado del procesador.

Información de control del proceso.
Con respecto al identificador de proceso, en prácticamente todos los sistemas operativos, a
cada proceso se le asocia un identificador numérico único, que puede ser simplemente un
índice en la tabla de procesos principal.
La información de estado de proceso indica los contenidos de los registros del procesador.
Cuando un proceso está ejecutando, esta información está, por supuesto, en los registros.
Cuando un proceso se interrumpe, toda la información de los registros debe salvaguardarse de
forma que se pueda restaurar cuando el proceso continúe con su ejecución.
Información de control de proceso: esta información adicional la necesita el sistema operativo
para controlar y coordinar varios procesos activos.
Cada bloque de control de proceso contiene toda la información sobre un proceso que necesita
el sistema operativo.
Se puede decir que el conjunto de los bloques de control de proceso definen el estado del
sistema operativo.
7
3.4 Control de procesos
Modos de ejecución
Ciertas instrucciones se pueden ejecutar en modos privilegiados únicamente. Éstas incluirían
lectura y modificación de los registros de control. Adicionalmente, ciertas regiones de
memoria sólo se pueden acceder en los modos más privilegiados.
El modo menos privilegiado a menudo se denomina modo usuario, porque los programas de
usuario típicamente se ejecutan en este modo. El modo más privilegiado se denomina modo
sistema, modo control o modo núcleo.
Existe típicamente un bit en la palabra de estado de programas (PSW) que indica el modo de
ejecución.
Creación de procesos
1. Asignar un identificador de proceso único al proceso.
2. Reservar espacio para proceso.
3. Inicialización del bloque de control de proceso.
4. Establecer los enlaces apropiados.
5. Creación o expansión de otras estructuras de datos.
Estados de los procesos
En los sistemas UNIX se utilizan un total de nueve estados de proceso.
Estados de procesos en UNIX:
Ejecutando usuario
Ejecutando núcleo
Listo para ejecutar, en memoria
Dormido en memoria
Listo para ejecutar, en swap
Durmiendo, en swap
Expulsado
Creado
Zombie
Ejecutando en modo usuario.
Ejecutando en modo núcleo.
Listo para ejecutar tan pronto como el núcleo lo planifique.
No puede ejecutar hasta que ocurra un evento; proceso en
memoria principal (estado de bloqueo).
El proceso está listo para ejecutar, pero el swapper debe
cargar el proceso en memoria principal antes de que el
núcleo pueda planificarlo para su ejecución.
El proceso está esperando un evento y ha sido expulsado al
almacenamiento secundario (estado de bloqueo).
El proceso ha regresado de modo núcleo a modo usuario,
pero el núcleo los ha expulsado y ha realizado la activación
de otro proceso.
El proceso ha sido creado recientemente y aún no está
listo para ejecutar.
El proceso ya no existe, pero deja un registros para que lo
recoja su proceso padre.
8
Capítulo 4:
Hilos, SMP y micronúcleos
Hilos (threads)
SMP (Symmetric Multiprocessing): Con SMP el sistema operativo debe ser capaz de planificar
simultáneamente diferentes procesos en múltiples procesadores.
4.1 Procesos e hilos
Multihilo: se refiere a la capacidad de un sistema operativo de dar soporte a múltiples hilos
de ejecución en un solo proceso.
Dentro de un proceso puede haber uno o más hilos, cada uno con:

Un estado de ejecución por hilo (Ejecutando, listo, etc.).

Un contexto de hilo que se almacena cuando no está en ejecución.

Una pila de ejecución.

Por cada hilo, espacio de almacenamiento para variables locales.

Acceso a la memoria y recursos de su proceso, compartido con todos los hilos de su
mismo proceso.
Los mayores beneficios de los hilos provienen de las consecuencias del rendimiento:

Lleva mucho menos tiempo crear un nuevo hilo en un proceso existente que crear un
proceso totalmente nuevo.

Lleva menos tiempo finalizar un hilo que un proceso.

Lleva menos tiempo cambiar entre dos hilos dentro del mismo proceso.

Los hilos mejoran la eficiencia de la comunicación entre diferentes programas que
están ejecutando.
A veces los hilos son también útiles en un solo procesador ya que ayudan a simplificar la
estructura de programas que realizan varias funciones diferentes. (Estructura modular de
programas).
Ya que todos los hilos de un proceso comparten el mismo espacio de direcciones, todos los
hilos se suspenden al mismo tiempo. De forma similar, la finalización de un proceso finaliza
todos los hilos de ese proceso.
Funcionalidad de los hilos
Los hilos, al igual que los procesos, tienen estados de ejecución y se pueden sincronizar entre
ellos.
Estados de los hilos: Igual que con los procesos, los principales estados de los hilos son:
Ejecutando, Listo y Bloqueado. Generalmente, no tiene sentido aplicar estados de suspensión a
un hilo, ya que dichos estados son conceptos de nivel proceso.
Sincronización de hilos: Todos los hilos de un proceso comparten el mismo espacio de
direcciones y otros recursos, como por ejemplo, los archivos abiertos.
Los asuntos que surgen y las técnicas que se utilizan en la sincronización de los hilos son, en
general, los mismos que en la sincronización de procesos.
9
Capítulo 5:
Concurrencia. Exclusión mutua y sincronización
Exclusión mutua; esto es, la capacidad de impedir a cualquier proceso realizar una acción
mientras se le haya permitido a otro. Conseguir exclusión mutua; hay tres propuestas:
semáforos, monitores y paso de mensajes.
Algunos términos clave relacionados con la concurrencia:
Sección crítica
(critical section)
Interbloqueo
(deadlock)
Círculo vicioso
(livelock)
Exclusión mutua
(mutual exclusion)
Condición de carrera
(race condition)
Inanición
(starvation)
Sección de código dentro de un proceso que requiere acceso a
recursos compartidos y que no puede ser ejecutada mientras otro
proceso esté en una sección de código correspondiente.
Situación en la cual dos o más procesos son incapaces de actuar
porque cada uno está esperando que alguno de los otros haga algo.
Situación en la cual dos o más procesos cambian continuamente su
estado en respuesta a cambios en los otros procesos, sin realizar
ningún trabajo útil.
Situación en la cual cuando un proceso esté en una sección crítica
que accede a recursos compartidos, ningún otro proceso puede estar
en una sección crítica que acceda a ninguno de esos recursos
compartidos.
Situación en la cual múltiples hilos o procesos leen y escriben un
dato compartido y el resultado final depende de la coordinación
relativa de sus ejecuciones.
Situación en la cual un proceso preparado para avanzar es soslayado
indefinidamente por el planificador; aunque es capaz de avanzar,
nunca se le escoge.
5.1 Principios de concurrencia
En un sistema multiprogramado de procesador único, los procesos se entrelazan en el tiempo.
En un sistema de múltiples procesadores no sólo es posible entrelazar la ejecución de
múltiples procesos sino también solaparlas.
Ambas técnicas pueden verse como ejemplos de procesamiento concurrente y ambas
presentan los mismos problemas.
Condición de carrera
Una condición de carrera sucede cuando múltiples procesos o hilos leen y escriben datos de
manera que el resultado final depende del orden de ejecución de las instrucciones en los
múltiples procesos.
Preocupaciones del sistema operativo
1. El sistema operativo debe ser capaz de seguir la pista de varios procesos. Esto se
consigue con el uso de bloques de control de proceso.
10
2. El sistema operativo debe ubicar y desubicar varios recursos para cada proceso activo.
Estos recursos incluyen:

Tiempo de procesador.

Memoria.

Ficheros.

Dispositivos de E/S.
3. El sistema operativo debe proteger los datos y recursos físicos de cada proceso
frente a interferencias involuntarias de otros procesos.
4. El funcionamiento de un proceso y el resultado que produzca, debe ser independiente
de la velocidad a la que suceda su ejecución en relación con la velocidad de otros
procesos concurrentes. Este es el tema de este capítulo.
Interacción de procesos
Podemos clasificar las formas en que los procesos interaccionan en base al grado en que
perciben la existencia de cada uno de los otros. Tres posibles grados de percepción:
Grado de percepción
Relación
Influencia que un proceso
tiene sobre el otro
Procesos que no se Competencia.
Los resultados de un proceso
perciben entre sí.
son independientes de la
acción de los otros.
Procesos
que
se Cooperación por Los resultados de un proceso
perciben
compartición.
pueden depender de la
indirectamente entre
información
obtenida
de
sí.
otros.
Procesos
que
se Cooperación por Los resultados de un proceso
perciben directamente comunicación.
pueden depender de la
entre sí.
información
obtenida
de
otros.
Potenciales
problemas de control
Exclusión mutua.
Interbloqueo.
Inanición.
Exclusión mutua.
Interbloqueo.
Inanición.
Coherencia de datos.
Interbloqueo.
Inanición.
Competencia entre procesos por recursos
En el caso de procesos en competencia, deben afrontarse tres problemas de control. Primero
está la necesidad de exclusión mutua. Supóngase que dos o más procesos requieren acceso a
un recurso único no compartible, como una impresora. Nos referimos a tal recurso como un
recurso crítico, y a la porción del programa que lo utiliza como la sección crítica del programa.
Es importante que sólo se permita un programa a la vez en su sección crítica.
La aplicación de la exclusión mutua crea dos problemas de control adicionales. Uno es el del
interbloqueo. Cada proceso está esperando por uno de los dos recursos. Ninguno liberará el
recurso que ya posee hasta haber conseguido el otro recurso y realizado la función que
requiere ambos recursos. Los dos procesos están interbloqueados.
Un último problema de control es la inanición. Si el sistema operativo le concede acceso a P1
después de que P3 haya terminado, y posteriormente concede alternativamente acceso a P1 y
11
a P3, entonces a P2 puede denegársele indefinidamente el acceso al recurso, aunque no suceda
un interbloqueo.
2.2 Exclusión mutua: soporte hardware
Deshabilitar interrupciones
En una máquina monoprocesador, para garantizar la exclusión mutua, basta con impedir que un
proceso sea interrumpido. Esta técnica puede proporcionarse en forma de primitivas definidas
por el núcleo del sistema para deshabilitar y habilitar las interrupciones. Un proceso puede
cumplir la exclusión mutua del siguiente modo:
while(true)
{
//deshabilitar interrupciones
//sección critica
//habilitar interrupciones
//resto del programa
}
Dado que la sección crítica no puede ser interrumpida, se garantiza la exclusión mutua.
Cuando el sistema de cómputo incluye más de un procesador, es posible (y típico) que se estén
ejecutando al tiempo más de un proceso. En este caso, deshabilitar interrupciones no
garantiza exclusión mutua.
Instrucciones máquina especiales
En una configuración multiprocesador, varios procesadores comparten acceso a una memoria
principal común. Durante la ejecución de la instrucción, el acceso a la posición de memoria se
le bloquea a toda otra instrucción que referencie esa posición.
Instrucción Test and Set
La instrucción test and set (comprueba y establece) puede definirse como sigue:
Boolean testset(int i)
{
if(i==0)
{
i=1;
return else;
}
else
{
return false;
}
}
12
La instrucción comprueba el valor de su argumento i. Si el valor es 0, entonces la instrucción
reemplaza el valor por 1 y devuelve cierto. En caso contrario, el valor no se cambia y devuelve
falso. La función testset completa se realiza atómicamente; esto es, no está sujeta a
interrupción.
La construcción paralelos (P1,…,Pn) significa lo siguiente: suspender la ejecución del programa
principal; iniciar la ejecución concurrente de los procedimientos P1 a Pn; cuando todos los P1 a
Pn hayan terminado, retornar al programa principal. Una variable compartida cerrojo se
inicializa a 0. El único proceso que puede entrar en su sección crítica es aquél que encuentra la
variable cerrojo igual a 0. Todos los otros procesos que intenten entrar en su sección crítica
caen en un modo de espera activa. El término espera activa (busywaiting), o espera cíclica
(spin waiting) se refiere a una técnica en la cual un proceso no puede hacer nada hasta
obtener permiso para entrar en su sección crítica, pero continúa ejecutando una instrucción o
conjunto de instrucciones que comprueban la variable apropiada para conseguir entrar. Cuando
un proceso abandona su sección crítica, restablece cerrojo a 0; en este punto, a uno y sólo a
uno de los procesos en espera se le concederá acceso a su sección crítica. La elección del
proceso depende de cuál de los procesos es el siguiente que ejecuta la instrucción testset.
Const int n = número de procesos
Int cerrojo;
void P(int i)
{
while(true)
{
while(!testset(cerrojo))
{
//no hacer nada
}
//sección crítica
cerrojo = 0;
//resto del programa
}
}
Void main()
{
cerrojo = 0;
paralelos(P(1),…,P(n));
}
13
Instrucción Exchange
La instrucción Exchange (intercambio) puede definirse como sigue:
Void exhange (int registro, int memoria)
{
Int temp;
temp = memoria;
memoria = registro;
registro = temp;
}
La instrucción intercambia los contenidos de un registro con los de una posición de memoria.
Una variable compartida cerrojo se inicializa en 0. Cada proceso utiliza una variable local llavei
que se inicializa a 1. El único proceso que puede entrar en su sección crítica es aquél que
encuentra cerrojo igual a 0, y al cambiar cerrojo a 1 se excluye a todos los otros procesos de
la sección crítica. Cuando el proceso abandona su sección crítica, se restaura cerrojo al valor
0, permitiéndose que otro proceso gane acceso a su sección crítica.
Const int n = número de procesos
Int cerrojo;
void P(int i)
{
Int llave[i] = 1
while(true)
{
do exchange(llave[i], cerrojo)
while(llave[i] !=0)
{
//sección crítica
exchange(llave[i], cerrojo)
//resto del programa
}
}
}
Void main()
{
cerrojo = 0;
paralelos(P(1),…,P(n));
}
14
Propiedades de la solución instrucción máquina
El uso de una instrucción máquina especial para conseguir exclusión mutua tiene ciertas
ventajas:

Es aplicable a cualquier número de procesos sobre un procesador único o
multiprocesador de memoria principal compartida.

Es simple y, por tanto, fácil de verificar.

Puede ser utilizado para dar soporte a múltiples secciones críticas: cada sección crítica
puede ser definida por su propia variable.
Hay algunas desventajas serias:

Se emplea espera activa: Así, mientras un proceso está esperando para acceder a una
sección crítica, continúa consumiendo tiempo de procesador.

Es posible la inanición: Cuando un proceso abandona su sección crítica y hay más de un
proceso esperando, la selección del proceso en espera es arbitraria. Así, a algún
proceso podría denegársele indefinidamente el acceso.

Es posible el interbloqueo: Considérese el siguiente escenario, un sistema de
procesador único.
Dados los inconvenientes de ambas soluciones software y hardware que se acaban de esbozar,
es necesario buscar otros mecanismos.
5.3 Semáforos
Pasamos ahora a mecanismos del sistema operativo y del lenguaje de programación que se
utilizan para proporcionar concurrencia.
El principio fundamental es éste: dos o más procesos pueden cooperar por medio de simples
señales, tales que un proceso pueda ser obligado a parar en un lugar específico hasta que haya
recibido una señal específica. Para la señalización, se utilizan unas variables llamadas
semáforos. Para transmitir una señal vía el semáforo s, el proceso ejecutará la primitiva
semsignal(s). Para recibir una señal vía el semáforo s, el proceso ejecutará la primitiva
semwait(s); si la correspondiente señal no se ha transmitido todavía, el proceso se suspenderá
hasta que la transmisión tenga lugar.
Para conseguir el efecto deseado, el semáforo puede ser visto como una variable que contiene
un valor entero sobre la cual sólo están definidas tres operaciones:
1. Un semáforo puede ser inicializado a un valor negativo.
2. La operación semwait decrementa el valor del semáforo. Si el valor pasa a ser negativo,
entonces el proceso que está ejecutando semwait se bloquea. En otro caso, el proceso
continúa su ejecución.
3. La operación semsignal incrementa el valor del semáforo. Si el valor es menor o igual
que cero, entonces se desbloquea uno de los procesos bloqueados en la operación
semwait.
15
Exclusión mutua usando semáforos:
Const int n = número de procesos
semafore s = 1;
void P(int i)
{
while(true)
{
semwait(s);
//sección crítica
semsignal(s);
//resto del programa
}
}
voidmain()
{
paralelos(P(1),…,P(n));
}
5.4 Monitores
La dificultad es que las funciones semwait y semsignal pueden estar dispersas a través de un
programa y no resulta fácil ver el efecto global de estas operaciones sobre los semáforos a
los que afectan.
El monitor es una construcción del lenguaje de programación que proporciona una
funcionalidad equivalente a la de los semáforos pero es más fácil de controlar.
Monitor con señal
Un monitor es un módulo software consistente en uno o más procedimientos, una secuencia de
inicialización y datos locales. Las principales características de un monitor son las siguientes:
1. Las variables locales de datos son sólo accesibles por los procedimientos del monitor y
no por ningún procedimiento externo.
2. Un proceso entra en el monitor invocando uno de sus procedimientos.
3. Sólo un proceso puede estar ejecutando dentro del monitor al tiempo; cualquier otro
proceso que haya invocado al monitor se bloquea, en espera de que el monitor quede
disponible.
En un sistema operativo o lenguaje de programación orientado a objetos puede implementarse
inmediatamente un monitor como un objeto de características especiales.
Al cumplir la disciplina de sólo un proceso al mismo tiempo, el monitor es capaz de
proporcionar exclusión mutua fácilmente.
16
5.5 Paso de mensajes
Cuando los procesos interaccionan entre sí, deben satisfacerse dos requisitos fundamentales:
sincronización y comunicación. El paso de mensajes tiene la ventaja añadida de que se presta a
ser implementado tanto en sistemas distribuidos como en multiprocesadores de memoria
compartida y sistemas monoprocesador.
La funcionalidad real del paso de mensajes se proporciona normalmente en forma de un par de
primitivas:
send(destino, mensaje)
receive(origen, mensaje)
Sincronización
Cuando una primitiva send se ejecuta en un proceso, hay dos posibilidades: o el proceso que
envía se bloquea hasta que el mensaje se recibe o no se bloquea. De igual modo, cuando un
proceso realiza la primitiva receive, hay dos posibilidades:
1. Si el mensaje fue enviado previamente, el mensaje será recibido y la ejecución
continúa.
2. Si no hay mensajes esperando, entonces: (a) el proceso se bloquea hasta que el mensaje
llega o (b) el proceso continúa ejecutando, abandonando el intento de recepción.
Así, ambos emisor y receptor pueden ser bloqueantes o no bloqueantes. La combinación más
útil es: Envío no bloqueante, recepción bloqueante.
Direccionamiento
Es necesario tener una manera de especificar en la primitiva de envío qué procesos deben
recibir el mensaje. Con el direccionamiento directo, la primitiva send incluye un identificador
específico del proceso destinatario.
Direccionamiento indirecto, los mensajes que son enviados a una estructura de datos
compartida que consiste en colas que pueden contener temporalmente. Tales colas se conocen
generalmente como buzones (mailboxes). Así, para que dos procesos se comuniquen, un
proceso envía un mensaje al buzón apropiado y otro proceso toma el mensaje del buzón.
Desacoplando emisor y receptor, se permite una mayor flexibilidad en el uso de mensajes. La
relación entre emisores y receptores puede ser uno a uno, muchos a uno, uno a muchos o
muchos a muchos.
La asociación de procesos a buzones puede ser estática o dinámica. Normalmente los puertos
se asocian estáticamente con un proceso en particular. Cuando hay varios emisores, la
asociación de un emisor a un buzón puede ocurrir dinámicamente. Para este propósito pueden
utilizarse primitivas como connect y disconnect.
17
Descargar