Procesos que conversan
Cada proceso vive en su propia memoria. Para cooperar comparten una zona o se envían mensajes. Al terminar sabrás conectarlos con pipes.
Primero, la idea completa
Mira el video entero o salta a la parte que quieras repasar. Después, cada idea tiene su propia escena para tocarla.
Los procesos no se ven entre sí
Por diseño, cada proceso tiene su propia memoria y ninguno puede leer la de otro. Eso los protege, pero a veces necesitan cooperar: un proceso descarga datos y otro los procesa; un comando filtra lo que otro produce. Para eso existe la comunicación entre procesos (IPC), con dos modelos fundamentales:
- Memoria compartida: los procesos acuerdan una región de memoria que ambos pueden leer y escribir.
- Paso de mensajes: los procesos se envían mensajes a través del sistema operativo.
Productor y consumidor
En la memoria compartida, los procesos levantan la restricción normal y comparten una zona, que suele crear uno de ellos. El sistema operativo no la controla: los procesos son responsables de no pisarse.
El caso típico es el productor-consumidor: uno produce información y otro la consume. Se resuelve con un búfer circular en la memoria compartida: el productor escribe en la posición in y avanza; el consumidor lee de out y avanza. Si el búfer está lleno, el productor espera; si está vacío, el consumidor espera.
Un búfer circular de 6 casillas en memoria compartida. Produce y consume a tu ritmo.
send() y receive()
El paso de mensajes no necesita memoria compartida, por eso sirve incluso entre computadoras distintas. Se basa en dos operaciones, send(mensaje) y receive(mensaje), sobre un enlace de comunicación. Hay tres decisiones de diseño:
- Directa o indirecta. En la directa, cada proceso nombra al otro. En la indirecta, los mensajes van a un buzón (o puerto) al que los procesos se suscriben; el buzón puede ser del proceso o del sistema operativo.
- Sincronización. Un send bloqueante espera a que el mensaje se reciba; uno no bloqueante lo envía y sigue. Un receive bloqueante espera hasta que llegue un mensaje; uno no bloqueante devuelve un mensaje o nada.
- Capacidad del búfer. Cero: el emisor espera hasta que el receptor tome el mensaje (una cita). Acotada: caben n mensajes; con el búfer lleno, el emisor espera. Ilimitada: el emisor nunca espera.
Un productor rápido y un consumidor lento intercambian 6 mensajes. Elige la capacidad del búfer y mira quién espera a quién.
Tuberías, con y sin nombre
Los pipes fueron de los primeros mecanismos de IPC en Unix, y siguen en todas partes.
- Pipes ordinarios: comunican en un solo sentido (para ir y volver hacen falta dos). Requieren una relación padre-hijo, así que solo funcionan dentro de una misma computadora. En la terminal se crean con
|: enls | grep txt, la salida de uno es la entrada del otro. - Pipes con nombre (FIFO): permiten comunicación bidireccional, no exigen parentesco, pueden usarlos muchos procesos y siguen existiendo cuando los procesos terminan, porque aparecen como un archivo. Se crean con
mkfifo.
Antes de leer la respuesta
Cambia la capacidad del pipe con el botón de arriba antes de lanzar los procesos: cada pipe se crea con la capacidad que esté elegida en ese momento.
Tu turno: pipes y búferes
La terminal ahora permite conectar procesos. productor | consumidor los une con un pipe; mkfifo nombre crea un pipe con nombre que pueden usar ./escritor nombre y ./oyente nombre, sin ser parientes. Arriba ves el búfer de cada pipe.
Comprueba lo que entendiste
Cada respuesta incorrecta explica por qué parece correcta y en qué falla.