Concurrencia

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

Problema del 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

Problema de los 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

Comunicación 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: