Extras din proiect
Executivele de timp real
Un executiv de timp real este un sistem de calcul care îndeplineşte anumite sarcini într-un interval limitat de timp. Conceptul unui astfel de sistem se bazează pe tehnici de gestiune a proceselor ţinând cont de rapiditate şi eficienţă. Un proces este o unitate logică de sine stătătoare care implementează una sau mai multe din funcţiile aplicaţiei. O ATR este constituită dintr-un număr de procese concurente care se sincronizează şi comunică între ele şi cu exteriorul. Ele pot apela şi funcţii specifice de timp real (ex. citirea ceasului de TR). La proiectarea unui astfel de sistem se implementează nivelele ETR. Nivelele unui ETR sunt:
• gestionarea memoriei
• gestionarea unităţii de comandă (UC)
• sincronizarea proceselor (miltitasking)
• comunicarea între procese
• drivere I/E
• gestionarea memoriei externe (nu este obligatorie)
• funcţii specifice de timp real
Gestionarea unităţii de comandă
Gestionarea unităţii de comandă se realizează printr-o tehnică numită "time slicing" prin intermediul căreia se asigură execuţia pseudoparalelă (aproape simultană) a proceselor. Unitatea de comandă revine la un moment dat pentru un timp maxim specificat procesului (pentru o cuantă de timp specificată) care este în mod curent activ. UC este cedată de către procesul în cauză altui proces în una din situaţiile:
• la expirarea cuantei de timp aleasă arbitrar de programator
• la cererea procesului respectiv
• când execuţia procesului necesită o resursă indisponibilă (blocată momentan). În acest caz, procesul respectiv rămâne în aşteptare (blocat într-un semafor) până la eliberarea resursei respective
• când procesul solicită executivului o întârziere pentru un timp specificat
Gestionarea memoriei
Execuţia concurentă a proceselor o condiţie: fiecare proces trebuie să conţină stiva lui proprie în care se vor putea salva valorile variabilelor locale, apelurile de funcţii şi contextul (regiştrii) procesorului. Apoi fiecarui proces trebuie să i-se asigure faptul că are spaţiu în heap pentru a lucra cu variabile dinamice. Sarcina nivelului de gestiune a memoriei este ca la iniţializarea unui proces să-i aloce o stivă şi la execuţia lui să-i aloce spaţiu în heap. Dimensiunea stivei este proprie fiecărui proces şi e specificată în informaţiile de iniţializare.
Sincronizarea între procese
- se realizează prin intermediul semafoarelor
Procese
Procesele sunt entitatea de bază a executivului. În acest proiect vor fi implementate cu o clasă procese. O aplicaţie în timp real conţine un număr cunoscut şi finit de procese ce se desfăşoară concurent. ETR păstrează şi gestionează informaţiile referitoare la execuţia proceselor acelei aplicaţii. Pentru o eficienţă adecvată în domeniile timp şi memorie, se alege modul de alocare dinamic al proceselor (listă), alocare ce se efectuează la iniţializare ETR, astfel încât nu se limitează numărul de procese pe care le poate avea o aplicaţie, ETR devenind flexibil pentru orice aplicaţie. Deci în clasa ETR vom avea un câmp de genul:
proces * tabela_procese;
Informaţii necesare referitoare la un proces
• Starea procesului poate fi: activ, pregătit, întârziat, blocat, suspendat, inexistent
• Locul pe care îl ocupă un proces în tabela de procese procesului diferenţiază un proces de un altul (pot exista 2 procese identice în tabelă)
• Structura pentru salvarea "contextului" (prin context se înţelege conţinutul regiştrilor şi fanioanelor) proceselor. În acest proiect va fi folosită structura jmp_buf din cadrul headerului <setjmp.h>.
• Cuantumul de întârziere al procesului (dacă acesta există)
• Interfaţa cu utilizatorul
Aceasta va fi implementată în clasa Process
Fereastra procesului va fi un element de interfaţă grafică cu utilizatorul şi va fi o structură:
struct fereastra {int x1, y1, x2, y2, x, y} // poziţia ferestrei şi a cursorului pe ecran.
Pentru iniţializarea unui proces sunt necesare informaţiile:
• adresa iniţială a procesului (a funcţiei ce-l implementează)
• numărul procesului
• starea iniţială a procesului
• dimensiunea stivei alocate în cuvinte
Stările proceselor
La un moment dat un proces se poate afla în una din următoarele stări:
ACTIV: este procesul care rulează la un moment dat. Numărul lui şi pointerul la tabela_procese se păstrează în câmpurile executivului şi se modifică în secvenţa de alocare a UC unui nou proces.
PREGATIT: este un proces care dispune de toate resursele în afară de UC, fiind candidat la alocarea acesteia. Disciplina de alocare a UC poate fi funcţie de priorităţile proceselor sau funcţie de această stare. Se va folosi tehnica ROUND-ROBIN prin care parcurge tabela circular şi se execută primul proces care este găsit PREGĂTIT.
ÎNTÂRZIAT: e un proces ce a solicitat ETR serviciul de întârziere pentru un număr specificat de cuante (ce se introduce în câmpul cuante_delay). După expirarea acestora, revine în PREGĂTIT. Procesele aflate în întârziere formează o listă pe spaţiul tabelei de procese (implementată cu cursori prin câmpurile urm), lista e ordonată crescător după timpul de întârziere.
BLOCAT: e un proces ce a făcut operaţia P asupra unui semafor cu valoarea <=0. Listele cu procesele blocate ale semafoarelor se crează tot prin câmpul urm, pe spaţiul tabelei de procese.
SUSPENDAT: e un proces pentru care ETR are toate informaţiile, are o stivă alocată, dar nu participă la alocarea resurselor. Poate ajunge în această stare din orice altă stare prin operaţia de suspendare (spaţiul de stivă nu se eliberează). Din această stare în PREGĂTIT se ajunge prin execuţia de către alt proces a unei operaţii de pregătire.
Preview document
Conținut arhivă zip
- Programarea Aplicatiilor in Timp Real
- clase.h
- main.cpp
- metode.cpp
- Programarea Aplicatiilor in Timp Real.doc