Ho spesso sentito gli sviluppatori menzionare che Java non può " fare Real Time ", il che significa che un'app Java in esecuzione su Linux non può soddisfare i requisiti di un sistema deterministico in tempo reale, come qualcosa in esecuzione su RIOT-OS, ecc.
Sto cercando di capire il perché . Il mio SWAG mi dice che ciò è probabilmente dovuto in gran parte al Garbage Collector di Java, che può essere eseguito in qualsiasi momento e mettere completamente in pausa il sistema. E anche se ci sono i cosiddetti "GC senza pause" là fuori, non credo necessariamente alla loro pubblicità, e non ho nemmeno $ 80K-per-istanza JVM da sborsare per un progetto di hobby!
Stavo anche leggendo questo articolo sull'esecuzione di software per droni su Linux . In quell'articolo, l'autore descrive uno scenario in cui Linux ha quasi causato il crash del suo drone nella sua auto:
Ho imparato una dura lezione dopo aver scelto di fare il loop di controllo a basso livello (PID) sul Pi - cercando di essere intelligente, ho deciso di mettere una scrittura di log nel mezzo del loop per il debug - il quad inizialmente ha funzionato bene ma poi Linux ha deciso impiegare 2 secondi per scrivere una voce di registro e il quad si è quasi schiantato contro la mia macchina!
Ora, sebbene quell'autore abbia scritto il suo software per droni in C ++, immagino che un'app Java in esecuzione su Linux possa benissimo subire lo stesso destino.
Secondo Wikipedia:
Si dice che un sistema è in tempo reale se la correttezza totale di un'operazione dipende non solo dalla sua logica logica, ma anche dal tempo in cui viene eseguita.
Quindi, per me, questo significa " Non hai tempo reale se la correttezza totale richiede correttezza logica e tempestività " .
Facciamo finta di aver scritto un'app Java per essere super performante e di aver "spremuto il limone" per così dire, e che non poteva ragionevolmente essere scritto (in Java) per essere più veloce.
Tutto sommato, la mia domanda è: sto cercando qualcuno che mi spieghi tutti / la maggior parte dei motivi per cui un'app Java che esegue n Linux non sarebbe un'app in tempo reale. Significato, quali sono tutte le categorie di cose su uno stack Java / Linux che gli impediscono di "essere tempestive" e, quindi, di essere " totalmente corrette "? Come accennato, sembra che il flushing dei log di GC e Linux possa mettere in pausa l'esecuzione, ma sono sicuro che ci sono più cose al di fuori della stessa app Java che potrebbero causare tempi / prestazioni scadenti e far sì che rispetti i vincoli di scadenza. Quali sono?