Sto cercando di eseguire una revisione completa su un complesso sistema di simulazione che simula diverse istanze di diversi modelli di veicoli in un ambiente di formazione in classe. Ad esempio, 24 studenti potrebbero eseguire simulazioni su tre diversi veicoli per la manutenzione e il funzionamento. Gli istruttori dovranno disporre di tablet in grado di connettersi a una delle 24 simulazioni attive per controllare lo scenario di allenamento.
Il sistema principale sarà eseguito su Linux ma non ci sono altri requisiti per OS e le specifiche della macchina possono essere costruite secondo necessità. Le prestazioni di ogni passaggio simulato devono essere in grado di funzionare costantemente a intervalli di ~ 10 ms con una tolleranza di + -2 ms.
L'obiettivo principale è rendere questo sistema molto modulare in modo che possa essere esteso e riutilizzato da altre strutture di formazione con veicoli e bisogni unici.
Il mio pensiero era di usare un'architettura a strati (sistema, azienda, interfaccia utente). La definizione di ciascun modello di veicolo può essere memorizzata in un database e quindi modificata indipendentemente da un superutente (modularità / estensibilità dei veicoli). Ogni livello dovrebbe leggere questo database per allocare dinamicamente le risorse richieste da quel particolare layer.
Inizialmente pensavo di utilizzare la memoria condivisa per il livello di sistema, impostando le autorizzazioni e l'autenticazione per qualsiasi livello aziendale per tentare di accedere. La logica di business di simulazione primaria aggiornerebbe continuamente i dettagli del veicolo in base ai dati attivi. L'interfaccia per l'istruttore avrebbe un server del livello aziendale che si connette a tutti i 24 client e registra anche nel livello di sistema per modificare i parametri di simulazione. Tutti gli input dallo studente e gli output visivi avranno ciascuno un livello aziendale che può accedere anche allo strato del sistema di memoria condivisa. Tutti questi agiscono come applicazioni separate in modo che possano essere rimossi / aggiunti / estesi secondo necessità.
Il problema allora è arrivato quando ho capito che le classi non funzionano bene con la memoria condivisa. Avrei bisogno di serializzare ogni get / set della memoria condivisa in una struttura di memoria piatta. Non avendo ancora lavorato con questa architettura, non sono sicuro che questo piano creerà un grande successo nelle prestazioni. Tecnicamente posso dedicare alcuni core alla logica del livello aziendale principale che esegue la simulazione.
La memoria condivisa con una suite di applicazioni sarebbe un modo appropriato per risolvere questo sistema? Un altro tipo di comunicazione tra processi come i tubi sarebbe più consigliabile della memoria condivisa? Sarebbe meglio mantenere il sistema e la logica aziendale in una singola applicazione e utilizzare semplicemente mutex e cross-threading per garantire le prestazioni? Sto sbagliando tutto questo?