Java de Temps Real

De Viquipèdia
Dreceres ràpides: navegació, cerca

Java de Temps Real, en sigles RTSJ, és un comú denominador d'una combinació de tecnologies per permetre escriure programes que compleixin els requeriments dels Sistemes de Temps Real en el llenguatge de programació Java.

La plataforma Java habitual, mostra una sèrie de mancances que la fan inadequada per al temps real:

  • Java NO suporta un sistema de fils d'execució basat en prioritats. Intencions inicials de dotar-se d'un tal suport varen ésser abandonades degut a requeriments de lligams específics amb les plataformes subjacents, en el cas de Windows i de Solaris.
  • A causa del fet que els fils de Java no admeten prioritats, els mecanismes de bloqueig de Java no ofereixen el degut suport al tractament del problema de la inversió de prioritat.
  • El comportament del recol·lector de memòria brossa introdueix pauses no acotades que malbaraten qualsevol intent de respondre a un senyal dins el termini requerit.

Per superar aquestes dificultats, la Comunitat Java va introduir una especificació de Java de Temps Real anomenada "Real-Time Specification for Java" com a requeriment JSR001.[1]

Aquesta especificació ha donat lloc a un cert nombre d'implementacions, incloent la implementació de referència de TimeSys,[2] "WebSphere Real Time" de IBM, "Java SE Real-Time Systems" de Sun, i PERC de Aonix.

La RTSJ adreça els temes crítics obligant una especificació mínima per al model de fils d'execució (threads) i altres models endollables a la Màquina Virtual Java i proporcionant, a més a més, àrees de memòria no subjectes al recol·lector de brossa a més de fils d'execució als quals el recol·lector de brossa no pugui arrabassar la CPU.

Terminologia[modifica | modifica el codi]

memòria Heap
munt de memòria habitual de la Plataforma Java-no-de-temps-real, netejada per un recol·lector de memòria brossa que, excepte versions especials, és no acotat en el temps de servei.
memòria Immortal
munt de memòria per a objectes quina vida és la de tota l'aplicació. No li cal recol·lector. No pot contenir referències a objectes de memòries d'àmbit (pel temps de vida inferior fora del qual la ref. seria il·legal).
memòria d'Àmbit (Scoped memory)
munt de memòria dinàmica d'àmbit d'un procediment/rutina. Diferents fils d'execució poden utilitzar la mateixa simultàniament. En entrar-hi un fil d'execució, passa a ser el seu munt d'allotjament actual. S'allibera automàticament quan totes les instàncies d'execució que la travessen han finalitzat, mitjançant un comptador de referències. El recol·lector no la gestiona. Un fil d'execució pot entrar successivament en diverses mem. d'àmbit establint una pila d'allotjaments.
Un objecte no pot contenir referències a un altre que tingui la vida més curta, per tant una mem. d'àmbit només pot tenir punters a altres memòries més antigues i dins d'ella mateixa.
Portal
objecte principal d'una memòria d'àmbit que hom pot establir (setPortal/getPortal) com a punt d'entrada a les estructures, per facilitar la intercomunicació (IPC) entre possibles múltiples fils d'execució que entrin a la mateixa memòria d'àmbit.
AbsoluteTime (origen a l'Època Unix), RelativeTime (interval)
Temps (classes derivades de HighResolutionTime) mesurat en parells (long milisegons, int nanosegons)
RealTimeThread
fil d'execució per a tasques de "temps real tou". Se li poden associar paràmetres ..
  • de planificació (ang:scheduling): prioritat, importància
  • de llançament (Release): cost (en temps previst), temps límit (deadline), .. i rutines gestores (AsyncEventHandlers) pel cas de sobrepassar-los (overrunHandler per al sobrecost, missHandler per al temps límit excedit)
  • de memòria: topalls en l'allotjament
NoHeapRealTimeThread
fil d'execució per a tasques de "temps real dur" que s'executa amb major prioritat que el recol·lector de brossa del munt tradicional (Heap). Només pot accedir a la memòria Immortal i a les d'Àmbit.
AsyncEvent, AsyncEventHandlers
[3] Un AsyncEvent és un objecte associable a un esdeveniment (per ex. senyal POSIX) al qual es poden assignar diversos objectes de codi AsyncEventHandlers amb possible restricció de llançament: Esporàdic, amb temps mínim entre llançaments (interarrival), Periòdic (inici, període) o Aperiòdic, i possible restricció de cost (temps previst) o de temps límit en tots els casos.
Codi interrompible per un AsyncEvent
per què un mètode d'una classe pugui ésser interromput (en un sector no subjecte a zona d'exclusió mútua "synchronized") cal especificar en la declaració que llança l'excepció (throws) AsynchronouslyInterruptedException.[3] Alguns mètodes interrompibles de RTSJ són HighResolutionTime.waitForObject(), Object.wait(), Thread.sleep(), RealtimeThread.sleep(), Thread.join(), ScopedMemory.join(), ...
Factibilitat (feasibility)
[4] analitzador en línia de que les restriccions de temps (cost de temps previst, temps límit deadline, ..) es puguin complir abans d'acceptar un nou element RealTimeThread o AsyncEventHandler al planificador (Scheduler): (mètodes de Schedulable) addIfFeasible(), setIfFeasible(params)
Cues no bloquejants
Vegeu [5]
  • WaitFreeReadQueue: Cua no bloquejant per al consumidor, generalment un fil NoHeapRealTimeThread
  • WaitFreeWriteQueue: Cua no bloquejant per al productor, generalment un fil NoHeapRealTimeThread
  • WaitFreeDequeue: Cua no bloquejant de dos caps, per ambdós, el productor i el consumidor
Asincronia
Definicions i semàntica de l'Asynchronous Transfer of Control[6]

Normes JSR[modifica | modifica el codi]

  • JSR-1 (anglès) Real Time Specification for Java
  • JSR-282 (anglès) RTSJ Versió 1.1
  • JSR-302 (anglès) Safety-critical Java Technology

Referències[modifica | modifica el codi]

  1. Requeriment d'especificació Java per una Especificació de Temps Real per a Java
  2. TimeSys - Implementació de referència de RTSJ
  3. 3,0 3,1 Asincronicitat en RTSJ (anglès)
  4. Extensions RTSJ: L'Analitzador de Factibilitat (anglès)
  5. RTSJ - Sincronització i cues
  6. Asynchrony - Definicions, semàntica, transferència de control asíncrona

Vegeu també[modifica | modifica el codi]

Enllaços externs[modifica | modifica el codi]