Vés al contingut

Java de Temps Real

De la Viquipèdia, l'enciclopèdia lliure
Aquesta és una versió anterior d'aquesta pàgina, de data 13:53, 29 set 2009 amb l'última edició de Griba2010 (discussió | contribucions). Pot tenir inexactituds o contingut no apropiat no present en la versió actual.

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.
  • Degut a 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

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.
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.
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)
  • 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)
Portal
objecte principal d'una memòria d'àmbit que hom pot establir (setPortal/getPortal) per a la Intercomunicació (IPC) entre els diferents fils d'execució que la travessen.
Cues no bloquejants
[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 per ambdós, el productor i el consumidor

Normes JSR

  • 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

Vegeu també

Enllaços externs