Pular para o conteúdo principal

Transporte por Memória Compartilhada

SharedMemoryTransport usa o mecanismo de memória compartilhada do SO (multiprocessing.shared_memory) para comunicação zero-copy entre processos na mesma máquina.

Os dados são escritos diretamente em endereços de RAM física mapeados como arrays NumPy. Sem serialização, sem copia — apenas um ponteiro para o mesmo endereço.

Como funciona

Processo A (planta)           RAM Fisica               Processo B (controlador)
───────────────────── ┌──────────────────────┐ ──────────────────────────
bus._buf -> array ─────▶│ [y0, y1, ..., u0] │◀────── bus._buf -> array
└──────────────────────┘
"ctrl_bus" (nome OS)

Uso

from synapsys.transport import SharedMemoryTransport
import numpy as np

CHANNELS = {
"y": 2, # saida da planta — 2 floats
"u": 1, # sinal de controle — 1 float
}

# Processo owner: cria o bloco (create=True)
owner = SharedMemoryTransport("ctrl_bus", CHANNELS, create=True)
owner.write("y", np.array([0.0, 0.0]))
owner.write("u", np.array([0.0]))

# Outros processos: conectam pelo nome
client = SharedMemoryTransport("ctrl_bus", CHANNELS)
y = client.read("y")
Owner e responsavel pelo unlink

Apenas o processo create=True libera a memória no SO ao fechar. Os clientes chamam apenas close().

Múltiplos agentes no mesmo bloco

t_plant = SharedMemoryTransport("ctrl_bus", CHANNELS)
t_ctrl = SharedMemoryTransport("ctrl_bus", CHANNELS)

plant_agent = PlantAgent(..., transport=t_plant, ...)
ctrl_agent = ControllerAgent(..., transport=t_ctrl, ...)
Race conditions

Não ha mutex na implementação atual. Arquitete seus canais para que cada processo seja o único escritor do seu canal.

Referência da API

Consulte a referência completa em synapsys.transport — SharedMemoryTransport.