Casa > Exposició > Contingut

Sistema operatiu en temps real Comunicació d'intercanvis i intercanvi de recursos

Mar 08, 2019

Un sistema operatiu multitasca com Unix és pobre en tasques en temps real. El planificador dóna la màxima prioritat als treballs amb la demanda més baixa de l’ordinador, de manera que no hi ha cap manera d’assegurar-se que un treball crític amb el temps tingui accés a recursos suficients. Els sistemes de multitasca han de gestionar la compartició de recursos de dades i maquinari entre diverses tasques. Normalment no és segur que dues tasques accedeixin simultàniament al mateix recurs de dades o maquinari específics [6]. Hi ha tres enfocaments habituals per resoldre aquest problema:


Emmascarar / desactivar temporalment les interrupcions

Els sistemes operatius d’usos generals normalment no permeten que els programes d’usuari enmascarin (deshabiliten) les interrupcions, ja que el programa d’usuari pot controlar la CPU durant el temps que desitgi. Algunes CPU modernes no permeten que el codi de mode d’usuari inhabiliti les interrupcions, ja que aquest control es considera un recurs clau del sistema operatiu. Tanmateix, molts sistemes integrats i RTOS permeten que la pròpia aplicació s'executi en mode de nucli per obtenir una major eficiència de trucades del sistema i també permetre que l’aplicació tingui un major control de l’entorn operatiu sense necessitat d’intervenció del sistema operatiu.


En els sistemes de processador únic, una aplicació que s'executa en mode de nucli i en interrupcions de emmascarament és el mètode de baix cost per evitar l'accés simultani a un recurs compartit. Mentre que les interrupcions s’emmarquen i la tasca actual no fa una trucada de sistema operatiu de bloqueig, la tasca actual utilitza exclusivament la CPU ja que cap altra tasca o interrupció pot controlar-la, de manera que la secció crítica està protegida. Quan la tasca surt de la seva secció crítica, ha de desemmascarar les interrupcions; Les interrupcions pendents, si n'hi ha, s'executaran. Les interrupcions de emmascarament temporal només s'han de fer quan el recorregut més llarg de la secció crítica sigui més curt que la latència d'interrupció màxima desitjada. Normalment, aquest mètode de protecció només s'utilitza quan la secció crítica és només algunes instruccions i no conté bucles. Aquest mètode és ideal per protegir els registres de maquinari mapats de bits quan els bits es controlen per diferents tasques.


Mutexes

Quan el recurs compartit ha de ser reservat sense bloquejar totes les altres tasques (com ara esperar a escriure la memòria Flash), és millor utilitzar mecanismes també disponibles en sistemes operatius d'ús general, com ara una missatgeria interprocess de mutex i OS. Aquests mecanismes impliquen trucades de sistema i solen invocar el codi del distribuïdor del sistema operatiu en sortir, de manera que solen dur a terme centenars d'instruccions de la CPU per executar-se, mentre que les interrupcions de emmascarament poden tenir tan sols una instrucció en alguns processadors.


Un mutex (no recursiu) es bloqueja o desbloqueja. Quan una tasca ha bloquejat el mutex, totes les altres tasques han d'esperar que el mutex sigui desbloquejat pel seu propietari: el fil original. Una tasca pot establir un temps d'espera per esperar un mutex. Hi ha diversos problemes coneguts amb dissenys basats en mutex, com ara la inversió de prioritats i els bloquejos.


A la inversió de prioritat, una tasca d'alta prioritat espera perquè una tasca de prioritat baixa té un mutex, però la tasca de prioritat inferior no es dóna temps de CPU per acabar el treball. Una solució típica és tenir la tasca que posseeix un mutex a, o "heretar", la prioritat de la tasca d’espera més alta. Però aquest enfocament senzill es fa més complex quan hi ha diversos nivells d’espera: la tasca A espera un mutex bloquejat per la tasca B, que espera un mutex bloquejat per la tasca C. El maneig de diversos nivells d’herència fa que l’altre codi s’executi en context d’alta prioritat. i, per tant, pot causar fam de fils de prioritat mitjana.


En un punt mort, dues o més tasques bloquegen el mutex sense expiració de temps i, a continuació, esperar per sempre per al mutex de la resta de tasques, creant una dependència cíclica. L’escenari de bloqueig més simple es produeix quan dues tasques bloquegen alternativament dos mutex, però en l’ordre oposat. El bloqueig es prevé amb un disseny acurat.


Transmissió de missatges

L’altre mètode per compartir recursos és per a les tasques d’enviar missatges en un esquema de pas de missatges organitzat. En aquest paradigma, el recurs només es gestiona mitjançant una sola tasca. Quan una altra tasca vol interrogar o manipular el recurs, envia un missatge a la tasca de gestió. Tot i que el seu comportament en temps real és menys nítid que els sistemes de semàfors, els sistemes simples basats en missatges eviten la majoria dels perills de bloqueig de protocols i, generalment, són millors que els sistemes de semàfors. No obstant això, són possibles problemes com els dels semàfors. La inversió de prioritats pot produir-se quan una tasca treballa amb un missatge de baixa prioritat i ignora un missatge de prioritat superior (o un missatge que s'origina indirectament en una tasca d'alta prioritat) a la cua de missatges entrants. Els bloquejos de protocol es poden produir quan dues o més tasques esperen mútuament per enviar missatges de resposta.