Quali sono i motivi per cui uno stack Java / Linux non riesce ad essere "in tempo reale"?

20

Ho spesso sentito sviluppatori dire che Java non può " fare Tempo reale ", ovvero un'app Java in esecuzione su Linux non può soddisfare i requisiti di un sistema deterministico in tempo reale, come ad esempio qualcosa che viene eseguito su RIOT-OS, ecc.

Sto cercando di capire perché . Il mio SWAG mi dice che questo è probabilmente in gran parte dovuto a Garbage Collector di Java, che può essere eseguito in qualsiasi momento e totalmente sospeso il sistema. E anche se ci sono i cosiddetti "GC pauseless" là fuori, non credo necessariamente alla loro pubblicità, e inoltre non ho $ 80K-per-JVM-istanza da affidare a un progetto per hobby!

Leggevo anche questo articolo sull'esecuzione di software drone su Linux . In questo articolo, l'autore descrive uno scenario in cui Linux ha quasi fatto precipitare il suo drone nella sua auto:

I learnt a hard lesson after choosing to do the low level control loop (PIDs) on the Pi - trying to be clever I decided to put a log write in the middle of the loop for debugging - the quad initially flied fine but then Linux decided to take 2seconds to write one log entry and the quad almost crashed into my car!

Ora, anche se quell'autore ha scritto il suo software drone in C ++, immagino che un'app Java in esecuzione su Linux possa benissimo subire lo stesso destino.

Secondo Wikipedia:

A system is said to be real-time if the total correctness of an operation depends not only upon its logical correctness, but also upon the time in which it is performed.

Quindi per me, questo significa " Non hai tempo reale se la correttezza totale richiede correttezza e tempestività logica. "

Facciamo finta di aver scritto un'app Java per essere super performante, e che ho "spremuto il limone" per così dire, e non si può ragionevolmente scrivere (in Java) per essere più veloce.

Tutto sommato, la mia domanda è: sto cercando qualcuno che mi spieghi tutti / molti dei motivi per cui un'app Java che esegue n Linux non sarebbe una "app in tempo reale". Significato, quali sono tutte le categorie di cose su uno stack Java / Linux che impediscono di "essere tempestivo" e, quindi, di essere " completamente corretto "? come accennato , sembra che il log-flushing di GC e Linux possa sospendere l'esecuzione, ma sono sicuro che ci sono più cose al di fuori della stessa app Java che causerebbero un cattivo timing / prestazioni e far sì che rispetti i vincoli di scadenza. Che cosa sono?

    
posta smeeb 30.01.2016 - 14:35
fonte

3 risposte

28

Un software è in tempo reale non quando è il più veloce possibile, ma quando è garantito che un processo si completa entro un determinato intervallo di tempo. In un sistema soft real time, è buono ma non assolutamente necessario che questo sia garantito. Per esempio. in un gioco, i calcoli necessari per un fotogramma devono essere completati entro il periodo di un fotogramma o il framerate diminuirà. Ciò degrada la qualità del gameplay, ma non lo rende scorretto. Per esempio. Minecraft è divertente anche se occasionalmente il gioco balbetta.

In un sistema in tempo reale difficile, non abbiamo tali libertà. Un software di controllo del volo deve reagire entro una scadenza o il veicolo potrebbe bloccarsi. E l'hardware, il sistema operativo e il software devono collaborare per supportare il tempo reale.

Ad esempio, il sistema operativo dispone di un programma di pianificazione per decidere quando viene eseguito il thread. Per un programma in tempo reale, lo schedulatore deve garantire intervalli di tempo sufficientemente grandi e frequenti. Qualsiasi altro processo che desideri eseguire in tale slot deve essere interrotto a favore del processo in tempo reale. Ciò richiede uno schedulatore con supporto esplicito in tempo reale.

Inoltre, un programma spazio utente eseguirà chiamate di sistema nel kernel. In un sistema operativo in tempo reale, anche questi devono essere in tempo reale. Per esempio. scrivere a un handle di file dovrebbe essere garantito per non utilizzare più le unità di tempo x , il che risolverebbe il problema del log. Ciò influisce sul modo in cui tale chiamata di sistema può essere implementata, ad es. come possono essere usati i buffer. Significa anche che una chiamata deve fallire se non può essere completata entro il tempo richiesto e che il programma spazio utente deve essere preparato per gestire questi casi. Nel caso di Java, la JVM e la libreria standard hanno anche un kernel e necessitano di supporto esplicito in tempo reale.

Per tutto ciò che è in tempo reale, il tuo stile di programmazione cambierà. Se non hai tempo infinito, devi limitarti a piccoli problemi. Tutti i tuoi loop devono essere limitati da alcune costanti. Tutta la memoria può essere allocata staticamente, dato che hai un limite superiore alla dimensione. La ricorsione illimitata è proibita. Questo va contro molte buone pratiche, ma non si applicano ai sistemi in tempo reale. Per esempio. un sistema di registrazione potrebbe utilizzare un buffer circolare assegnato in modo statico per archiviare i messaggi di registro quando vengono scritti. Una volta raggiunto il punto di partenza, i registri precedenti verrebbero eliminati o questa condizione potrebbe essere un errore.

    
risposta data 30.01.2016 - 15:07
fonte
4

Da wikipedia :

A key characteristic of an RTOS is the level of its consistency concerning the amount of time it takes to accept and complete an application's task; the variability is jitter.

L'importante è che il jitter sia quantificato affinché il sistema sia considerato real time . L'articolo prosegue dicendo che se il jitter è di solito limitato, il sistema è soft in tempo reale . Se il jitter è sempre limitato, il sistema è hard in tempo reale .

A meno che le versioni di Java e Linux che usi siano quantificate in termini di jitter, sono non in tempo reale. La raccolta di dati inutili e la scrittura dei log sono certamente fonti di jitter, ma anche l'elaborazione autonoma dei (ad esempio) pacchetti di rete conta se introduce jitter nei processi tuoi .

    
risposta data 30.01.2016 - 14:56
fonte
1

Per iniziare, lo stesso vanilla Linux non può fare il tempo reale. Ecco perché è stato sviluppato RTLinux .

Diciamo che esegui alcuni processi Java su RTLinux, sarebbero comunque considerati in tempo reale dal momento che tutti i processi sono programmati dal kernel, cioè se un processo è in ritardo, altri processi possono ancora avere la loro porzione di tempo CPU, garantito .

Ora, se i processi Java eseguono Discussioni verdi , l'esecuzione di questi thread non sarà più in tempo reale poiché la JVM non esegue la pianificazione in tempo reale.

    
risposta data 25.02.2016 - 11:23
fonte

Leggi altre domande sui tag