Contenidos
- 1 Concurrencia
- 1.1 Interacción entre los procesos
- 1.2 Competencia entre procesos por los recursos
- 1.3 Problemas clásicos de comunicación y sincronización
- 1.4 Mecanismos de comunicación
- 1.5 Mecanismos de sincronización
- 1.6 Tuberías
Concurrencia
La concurrencia es una propiedad de los sistemas en la cual los procesos de un cómputo se hacen simultáneamente, y pueden interactuar entre ellos
Modelos de computación en los que se pueden ejecutar procesos concurrentes:
- Multiprogramación con un único procesador
- Multiprocesador
- Procesamiento distribuido
Afecta a un gran número de cuestiones de diseño del sistema operativo:
- Comunicación entre procesos
- Compartición y competencia por los recursos
- Sincronización de la ejecución de varios procesos
- Asignación del tiempo de procesador a los procesos/li>
Interacción entre los procesos
Tipos de procesos:
- Independientes
- Cooperantes
Interacción entre los procesos:
- Los procesos comparten o compiten por el acceso a recursos físicos o lógicos (incluso los procesos independientes)
- Los procesos se comunican y sincronizan entre sí para alcanzar algún objetivo común
Competencia entre procesos por los recursos
El principal problema de control es la necesidad de exclusión mutua. Mientras un proceso está; utilizando un recurso compartido no se debe permitir el acceso al resto de procesos
Hacer que se cumpla la exclusión mutua crea dos problemas adicionales:
- Interbloqueo
- Inanición
Problemas clásicos de comunicación y sincronización
- El problema de la sección crítica
- El problema del productor-consumidor
- El problema de los lectores-escritores
- Comunicación cliente-servidor
El problema de la sección crítica
Tenemos n procesos concurrentes, que pueden ser independientes o cooperantes
La sección crítica de cada proceso tiene un fragmento de código desde el que accede a algún recurso compartido
Cuando un proceso está ejecutando en su sección crítica, ningún otro puede ejecutar en la suya
Ejemplo de sección crítica
Dos procesos P_1 y P_2 comparten las variables a y b. Las variables cumplen la relación a = b
Considérese la siguiente ejecución concurrente:
Al final de la ejecución ya no se cumplirá la condición a = b
La solución consiste en utilizar exclusión mutua al entrar en las secciones críticas
Es necesario utilizar algún mecanismo de sincronización:
Requisitos que debe ofrecer cualquier solución:
- Exclusión mutua
- Evitar interbloqueos
- Espera limitada: evitar la inanición
El problema del productor-consumidor
Uno o más productores generan datos y los sitúan en un búfer
Un único consumidor saca elementos del búfer de uno en uno
Sólo un productor o consumidor puede acceder al búfer en un instante dado
Ejemplo de productor-consumidor
El problema de los lectores-escritores
Cualquier número de lectores puede leer el archivo simultáneamente
Sólo puede escribir en el archivo un escritor en cada instante
Si un escritor está accediendo al archivo, ningún lector puede leerlo
Ejemplo de lectores-escritores
Comunicación cliente-servidor
Los procesos servidores ofrecen una serie de servicios a otros procesos clientes
El proceso servidor puede residir en la misma máquina que el cliente o en una distinta
Ejemplo de cliente-servidor
Mecanismos de comunicación
- Archivos
- Variables en memoria compartida
- Tuberías
- Sin nombre: pipes
- Con nombre: FIFOS
- Paso de mensajes
Mecanismos de sincronización
- Señales
- Tuberías
- Sin nombre: pipes
- Con nombre: FIFOS
- Semáforos
- Monitores y variables condicionales
- Paso de mensajes
Tuberías
Mecanismo de comunicación y sincronización
Una tubería o pipe es una estructura de datos implementada en el núcleo del sistema operativo para la comunicación entre los espacios de direcciones
Sólo puede utilizarse entre procesos que la heredan a través de la llamada
Tuberías sin nombre: pipes
Utilizan un búfer FIFO con un flujo de datos unidireccional. Tienen un extremo de lectura y otro de escritura tratados mediante descriptores de archivos:
- escritura: poner datos en la tubería
- lectura: extraer datos de la tubería
Servicios POSIX para pipes
Crear una tubería sin nombre
Descriptor de archivo para leer del pipe:
Descriptor de archivo para escribir en el pipe
Cerrar el extremo de una tubería
Descriptor de archivo que se desea cerrar
Leer de una tubería
Como argumentos se utilizan fd descriptor de archivo de lectura del pipe, buffer variable donde se almacenan los datos leídos y nb número máximo de bytes a leer
Si la tubería está vacía, se bloquea el proceso lector hasta que algún proceso escriba datos
Si la tubería no está vacía, la llamada devuelve el número de bytes leídos y elimina de la tubería los datos solicitados
Escribir en una tubería
Como argumentos se utilizan fd descriptor de archivo de escritura del pipe, buffer variable donde se almacenan los datos que serán escritos y nb número máximo de bytes a escribir
Si la tubería se llena, se bloquea el proceso escritor hasta que se pueda completar
Las operaciones de lectura y escritura se realizan de forma atómica
Crear una tubería con nombre
No hay necesidad de heredarlo mediante fork
Abrir una tubería con nombre
Borrar una tubería con nombre
Lectura, escritura y cierre de un FIFO, igual que las pipes, mediante: