Sunteți pe pagina 1din 23

Cap 1

 Multitaskingul reprezintă procesul de planificare si comutare între taskuri a


CPU-ulu. Un singur CPU este partajat de mai multe task-uri secvenţiale.
 Multitaskingul maximizează folosirea procesorului.
Resurse
 O resursă reprezintă o entitate folosită de un task. O resursă poate fi un
dispozitiv de I/O (exemplu imprimanta, o tastatură, un afişor) sau o variabilă, structură, array, etc.
 O resursă partajată reprezintă o resursă care este folosită de mai multe task-uri.
Fiecare task trebuie să aibă acces exclusiv la resursă pentru a evita coruperea datelor. Acest lucru se
realizează prin excludere mutuală.
 Un task, denumit şi fir de execuţie, este un program simplu care are impresia ca
foloseşte doar el procesorul. Fiecare task are asociată o prioritate, are propriul set de registre, și
propria stiva.
 Nucleul reprezintă partea sistemului multitasking care este responsabilă pentru
managementul task-urilor (administrarea timpului procesor) şi comunicaţia dintre task-uri. Serviciul
fundamental furnizat de nucleu îl reprezintă comutarea task-urilor.
 Nucleul consumă şi timp procesor (de obicei între 2 si 5%).
 Planificatorul, denumit şi dispatcher, este partea nucleului care este responsabilă
pentru determinarea task-ului care va rula în continuare. Cele mai multe nuclee de timp real sunt bazate
pe priorităţi.
 Există 2 tipuri de nuclee bazate pe priorităţi: preemtiv şi non-preemtiv.
 Nucleele non-preemptive solicită ca fiecare task să realizeze o funcţie explicită
de renunţare a controlului în favoarea CPU-ului. Planificarea non-preemptivă este denumită de
asemenea şi multitasking de colaborare; task-urile colaborează unele cu celelalte pentru a partaja CPU-
ul. Evenimentele asincrone sunt încă tratate de ISR-uri.
 Un nucleu preemtiv este folosit atunci când timpul de răspuns al sistemului este
important. Din acest motiv, majoritatea nucleelor in timp real sunt preemtive. Task-ul cu prioritatea cea
mai mare din starea ready va primi întotdeauna controlul procesorului. Executia task-ului cu prioritatea
cea mai mare este deterministă (putem calcula timpul în care task-ul cel mai prioritar preia cotrolul
CPU-ului).
 O funcție reentrantă este o funcție care poate fi apelată de mai multe task-uri fără
coruperea datelor. O funcție reentrantă poate fi intreruptă în orice moment și reluată mai târziu fără
pierderea datelor.

Priorități statice
 Prioritățile task-urilor sunt statice atunci când prioritatea fiecărui task nu se
schimbă în timpul execuției aplicației. Prioritățile task-urilor sunt asociate în momentul compilări.

Priorități dinamice
 Prioritățile task-urilor sunt dinamice atunci când prioritatea fiecărui task se
schimbă în timpul execuției aplicației.
Asignarea priorităţilor specifice task-urilor
Tabelul prezintă valoarea pentru dimensiunea (21/n-1) bazat pe numărul de taskuri.
Cele mai folosite medote pentru a obține acces exclusiv la o resursă
partajată sunt:
◦ Dezactivarea intreruperilor;
◦ Dezactivarea planificatorului;
◦ Folosirea semafoarelor.

Semaforul este un mecanism oferit de majoritatea nucleelor multitasking.


 Semafoarele sunt folosite pentru:
◦ controloarea accesului la o resursă partajată;
◦ semnalarea apariţiei unui eveniment;
◦ permite task-urilor să-și sincronizeze activităţile.
 Semaforul reprezintă o cheie pe care un task obţine pentru a-şi putea continua
execuţia.
 Dacă semaforul este deja folosit, taskul care cere semaforul este suspendat până
când acesta este eliberat.
 În general sunt doar trei operaţii care pot fi folosite la lucrul cu semafoare:
◦ Initializarea (CREATE);
◦ Aşteptarea semaforului (PEND);
◦ Eliberarea semaforului (POST).

Evenimente
 Evenimentele sunt folosite când un task trebuie să se sincronizeze cu apariţia
unor evenimente.
 Task-ul se poate sincroniza când a apărut oricare din evenimente. Aceasta este
denumită sincronizare disjunctivă (SAU logic).
 Task-ul se poate sincroniza când au apărut toate evenimente. Aceasta este
denumită sincronizare conjunctivă (SI logic).
 Evenimentele pot fi folosite pentru a semnala diferite task-uri. De obicei
evenimentele sunt grupate.
 În funcţie de nuclee, un grup este format din 8, 16, 32 de evenimente (32 este cel
mai utilizat).
 O rutina ISR poate seta sau sterge orice eveniment dintr-un grup. Un task este
reluat când toate evenimentele pe care le aşteaptă sunt active.

Tick-ul de ceas
 Un tick de ceas reprezintă o intrerupere care apare periodic. Această intrerupere
poate fi văzută ca “bătaia de inimă” a sistemului.
 Timpul dintre întreruperi este specific aplicaţiilor şi, în general, este de 10-
200ms.
 Tick-ul de ceas permite nucleului să aplice temporizări pentru un număr întreg de
tick-uri de ceas şi furnizează time-out-uri când task-urile aşteaptă apariţia de evenimente.
 Toate nucleele permit task-urilor să fie temporizate pentru un număr de tick-uri
de ceas. Rezoluţia temporizării este de 1 tick de ceas, lucru care nu înseamnă ca acurateţea lui este de 1
ciclu de ceas.
Cap 2

Pentru a facilita descrierea rezultatelor obținute în urma planificării, vom utiliza următoarele
notații:
• Γ – un set de taskuri periodice
• τi – un task periodic generic
• τi,j – a j-a instanță a taskului τi
• ri,j – timpul de execuție pentru a j-a instanță a taskului τi
• φi – faza taskului τi care este timpul de execuţie a primei instanțe (φi = ri,1)
• Di – termenul limită relativ a taskului τi
• di,j – termenul limită absolut pentru a j-a instanță a taskului τi (dij= φi+(j-i)Ti+Di)
• si,j – timpul de start pentru a j-a instanță a taskului τi (timpul la care incepe execuția)
• fi,j – timpul la care se termină j-a instanță a taskului τi (timpul la care s-a terminat execuția)

Pentru a simplifica analiza planicafibilității, se fac următoarele presupuneri:

• A1.Instanțele unui task periodic τi sunt activate periodic la o rată constantă. Intervalul Ti dintre
două activări consecutive reprezintă perioada taskului.
• A2.Toate instanțele unui task periodic τi au același timp pentru cazul cel mai defavorabil de
execuție Ci
• A3.Toate instanțele unui task periodic τi au același termen limită relativ Di, care este egal cu
perioada Ti.
• A4.Toate taskurile Γ sunt indepedente (nu există relații de precedență și constrângeri de
resurse).
În plus, următoarele presupuneri sunt făcute implicit:
• A5.Taskurile nu se pot autosuspenda, de exemplu la o operație I/O.
• A6.Toate taskurile sunt executate de îndată ce sosesc.
• A7.Tot supracontrolul generat de nucleu este neglijabil (timpul consumat este neglijabil).

 Fie Uub(Γ, A) limita superioară a factorului de utilizare a procesorului pentru un set de


taskuri Γ pentru un anumit algoritm A.
Când U = Uub(Γ, A), se spune că setul Γ poate utiliza pe deplin timpul procesor.
În această situație, Γ este planificabil de algoritmul A, dar o creștere a timpului de calcul
pentru oricare din taskuri va face setul nefezabil.
Ulub definește o caracteristică importantă a unui algoritm de planificare utilă pentru
verificarea cu ușurință a planificabilității unui set de taskuri.
De fapt, orice set de taskuri al cărui factor de utilizare a procesorului este mai mic sau egal
cu această limită, este planificabil de algoritm.
Pe de altă parte, atunci când Ulub<U≤1.0, planificabilitatea poate fi realizată numai în cazul
în care perioadele taskurilor sunt legate corespunzător.
Hrănește vaca 25 min la fiecare 50 min
Hrănește porcul 10 min la fiecare 20 min

Algoritmul optim: hrănește animalul cel mai flămând animal

Evaluare: Toată lumea este fericită

Hrănește vaca 4 min la fiecare 16 min


Hrănește porcul 20 min la fiecare 40 min

Ideea de bază:
• Împarte timpul in sloturi de lungime egală
• În cadrul fiecărui slot fiecare task cu un timp proporțional cu utilizarea lui:
Factor utilizare ptr. porc = 4/16 = 1/4
Factor utilizare ptr. vacă = 20/40 = 1/2

Porcul (4/16)
Vaca (20/40)
În general:
Fie: Ui = fracțiunea de timp necesară pentru hrănire
Δ = c.m.m.d.c (T1,T2) = 8

Execută fiecare task pentru δi=UiΔ pentru fiecare slot Δ


Porcul (4/16)
Vaca (20/40)

Planificarea Rate Monotonic (RM)

Algoritmul de planificare Rate Monotonic este de fapt o regulă simplă prin care sunt asignate
priorități task-urilor în funcție de perioadele lor.
Mai precis, task-urile cu o perioadă mai mică vor avea priorități mai mari.
Întrucât perioadele sunt constante, RM folosește priorități fixe: o prioritate Pi este atribuită unui
task înainte de execuție și nu se modifică în timpul execuției.
Mai mult, RM este intrinsec preemptiv: taskul aflat in execuție poate fi întrerupt de un alt task cu
prioritatea mai mare.

Să luăm în considerare un set de două taskuri periodice τ1 si τ2, cu T1 <T2. Dacă prioritățile nu
sunt alocate în conformitate cu RM, atunci taskul τ2 va primi cea mai mare prioritate. Această situație
este descrisă în Figura , din care este ușor să vedem că, la instanțele critice, planificarea este fezabilă
dacă este îndeplinită inegalitatea:
C 1 + C 2 ≤ T1 (2.1)

Pe de altă parte, în cazul în care prioritățile sunt alocate în conformitate cu RM, taskul τ1 va primi
cea mai mare prioritate.
În această situație, cu scopul de a garanta o planificare fezabilă trebuie să fie luate în considerare
două cazuri.
Considera F = T2/T1 numărul de perioade a taskului τ1 conținute în întregime în T2.
Practic, s-a demonstrat că, având două taskuri periodice τ1 si τ2, cu T1 <T2, în cazul în care
planificarea este fezabilă pentru o atribuire arbitrară de priorități, atunci este fezabilă și de RM.
Astfel, planificarea RM este optimă. Acest rezultat poate fi extins cu ușurință la un set de n
taskuri periodice.

Pentru un set arbitrar de taskuri periodice, limita superioară a factorului de utilizare procesorului
în algoritmul de planificare RM este:
Valorile lui Ulub pentru diferite valori a lui n:

Pentru valori mari ale lui n, limita superioară converge la:

EDF -EARLIEST DEADLINE FIRST

Algoritmul EDF (Earliest Deadline First) este o regula de planificare dinamică care selectează
taskurile în conformitate cu termenele lor limita absolute.
Concret, taskurile cu termene limită cele mare apropiate vor fi executate cu priorități mai mari.
Deoarece termenul limită absolut a unui task periodic depinde de a j-a instanță poate fi exprimat
ca

EDF folosește o asignare dinamică a priorităţilor.


Mai mult decât atât, taskurile sunt executate in mod preemptiv, in sensul ca taskul curent este
întrerupt atunci când apar instanțe ale altor taskuri care au termenul limita mai devreme.
Rețineți că EDF nu face nici o presupunere specifică privind periodicitatea taskurilor, prin
urmare, acesta poate fi folosit pentru planificarea taskurilor periodice, precum și taskurilor aperiodice.
În acest caz, cu toate că limita superioară este 1. Prin urmare, taskurile pot utiliza procesorul
până la 100% și totuși să fie planificabile. In special, se foloseşte următoarea teoremă:

Teorema. Un set de taskuri periodice este planificabil cu EDF, dacă şi numai dacă
Considerați setul de taskuri periodice ilustrat in fig., pentru care factorul de utilizare a
procesorului este:

Aceasta înseamnă că 97% din timpul procesorului este utilizat pentru execuția taskurilor
periodice, iar 3% din timp, procesorul stă în starea idle.
Deoarece U > 2(√2-1)≅0.83, planificabilitatea setului de taskuri nu poate fi garantată de
algoritmul RM, în schimb poate fi garantată de algoritmul EDF.
După cum se poate vedea și din figură, RM generează o ratare a termenului limită la timpul t = 7,
în schimb EDF completează toate taskurile cu respectarea termenelor limită.

DM–DEADLINE MONOTONIC

In Deadline monotonic (DM) atribuirea priorităților se bazează pe slăbiciunile sistemelor bazate


pe constrângerea "perioada este egală cu termenul limită" în cadrul unui sistem de planificare cu
priorități. statice.

Concret, fiecare task τi periodică este caracterizat de patru parametri:

• Faza φi
• Un timp de calcul Ci pentru cel mai prost caz de execuție (constant pentru toate instanțele)
• Un termen limită relativ Di (constant pentru toate instanțele)
• Perioada Ti
Conform algoritmului DM, fiecare activitate îi este atribuită o prioritate fixă Pi, invers
proporțională cu termen său limită relativ -Di.
Astfel, în orice moment, este executat taskul cu cel mai scurt termen limită relativ. Deoarece
termenele limită relative sunt constante, DM folosește priorități statice.
Ca şi RM, DM este utilizat în mod normal cu execuție preemptivă, în care, taskul aflat în execuție
este întrerupt de un task cu un termen limită mai mic (prioritate mai mare).
Fezabilitatea unui set de taskuri cu termene restrânse ar putea fi garantată prin utilizarea testului
bazat pe de utilizare, prin reducerea perioadelor taskurilor la termenele limite relative:

Pentru a clarifica testul de planificabilitate, considerarăm setul de taskuri periodice prezentat în


tabel, activate simultan la momentul t = 0.
Cu scopul de a garanta τ4, trebuie să calculeze R4 și să verifice dacă R4 ≤ D4.

Planificarea celor 4 taskuri de către DM

Deoarece R4 ≤ D4, τ4 este planificabil în termenul său limită. Dacă Ri ≤ Di pentru toate taskurile,
putem concluziona că setul de taskuri este planificabil de DM.
Cap 3
Toți algoritmi prezentați în acest capitol se bazează pe următoarele ipoteze:
 Taskurile periodice sunt planificate cu ajutorul unui algoritm cu priorități fixe, și anume,
algoritmul RM (Rate Monotonic).
 Toate taskurile periodice sunt activate simultan la momentul t = 0 și termenele lor limite
relative sunt egale cu perioadele lor.
 Nr. de activări a cererilor aperiodice sunt necunoscute.
 Atunci când nu este explicit specificat, se presupune că timpul minim dintre două activări
pentru un task sporadic este egal cu termenul său.
 Toate taskurile sunt complet întreruptibile (nucleul folosit este preemptiv).

PLANIFICAREA ÎN FUNDAL

Cea mai simplă metodă de a gestiona un set de taskuri aperiodice soft în prezența taskurilor
periodice este de a le planifica în fundal, atunci când nu există taskuri periodice în execute.
Problema majoră cu această tehnică este faptul că, pentru taskuri periodice mari, timpul de
răspuns al cererilor aperiodice poate fi prea lung pentru anumite aplicații.
Din acest motiv, planificarea în fundal poate fi adoptată numai în cazul în care activitățile
aperiodice nu au constrângeri stricte de timp și încărcarea cu taskurile periodice nu este mare.
Figura ilustrează un exemplu în care două taskuri periodice sunt planificate de către RM, în timp
ce două taskuri aperiodice sunt executate în fundal.

Deoarece factorul de utilizare a procesorului pentru setul de taskuri periodice (U = 0,73) este mai
mic decât limita superioară pentru două taskuri (Ulub(2)≃0,83), taskurile periodice fiind planificabile de
RM.

Avantajul major al planificării în fundal este simplitatea sa. Așa cum se arată în figură, sunt
necesare două cozi pentru punerea în aplicare a mecanismului de planificare: una (cu o prioritate mai
mare) dedicat taskurilor periodice și una (cu o prioritate mai mică) rezervată pentru cererile aperiodice.

SERVER DE SONDAJ
Timpul mediu de răspuns a taskurilor aperiodice poate fi îmbunătățit cu respectarea planificării în
fundal, prin utilizarea unui server, care este un task periodic al cărei scop este acela de a deservi
cererile aperiodice cât mai curând posibil.
Ca orice activitate periodică, un server este caracterizat printr-o perioadă Ts și un timp de calcul
Cs - numit capacitatea sau bugetul serverului.
În general, serverul este planificat cu același algoritm folosit pentru taskurile periodice, și o dată
activat servește cererile aperiodice în limita bugetului său.
Ordonarea cererilor aperiodice nu depinde de algoritmul de planificare utilizat pentru taskurile
periodice și se poate face după momentul activării, timpul de calcul, termenul limită sau orice alt
parametru.
Serverul de sondaj (PS – Polling Server) este un algoritm bazat pe o astfel de abordare.
La intervale regulate, egale cu perioada Ts, PS devine activ și servește cererile aperiodice în
așteptare în limita capacității sale Cs.
Dacă nu sunt în așteptarea cererilor aperiodice, PS se autosuspendă până la începutul următoarei
perioade, și bugetul alocat inițial pentru serviciul aperiodic este eliberat și cedat taskurilor periodice.
Rețineți că, dacă o cerere aperiodică este activată după ce serverul s-a autosuspendat, aceasta
trebuie să aștepte până la începutul următoarei perioade, atunci când capacitatea serverul este
alimentată la valoarea sa maximă.

Figura anterioară ilustrează un exemplu de serviciu aperiodic obținut prin intermediul unui server
de sondaj planificat de RM.
Cererile aperiodice sunt raportate pe al treilea rând, în timp ce al patrulea rând prezintă
capacitatea de serverul ca o funcție de timp.
Numerele de lângă săgețile indică timpul de calcul asociat cererilor aperiodice.
În exemplul prezentat în figura anterioară, SP are o perioadă de Ts = 5 și o capacitate Cs=2, deci
se execută cu o prioritate intermediară raportat la celelalte taskuri periodice.
La momentul t = 0, procesorul este atribuit taskului τ1, care este taskul cu cea mai mare cu
prioritate în conformitate cu RM.
Cu toate acestea, deoarece nu sunt în curs cereri aperiodice, serverul se autosuspendă și
capacitatea sa este folosită de taskurile periodice.
Ca o consecință, cererea care ajunge la momentul t = 2 nu poate primi serviciul imediat, trebuie
să aștepte până la începutul următoarei perioade a serverului (t = 5).
În acest moment, capacitatea este alimentată la valoarea sa totală (Cs = 2) și este folosită pentru a
servi taskul aperiodic până la finalizare.
Rețineți că, deoarece capacitatea a fost consumată în totalitate, nici o altă cerere aperiodice nu
poate fi servită în această perioadă, astfel serverul devine inactiv.
A doua cerere aperiodică primește același tratament.
Cu toate acestea, deoarece a doua cerere folosește doar jumătate din capacitatea serverului,
jumătatea rămasă este eliberată, deoarece nu sunt în curs alte taskuri aperiodice.
De asemenea, rețineți că la momentul t = 16, a treia cerere aperiodică este întreruptă de taskul τ1 și
capacitatea serverului este păstrată.

Analiza planificabilității

De fapt, independent de numărul de taskuri aperiodice gestionate de server, un timp maxim egal
cu Cs este dedicat cererilor aperiodice la fiecare perioadă a serverului.
Ca o consecință, factorul de utilizare al procesorului de către PS este de Us = Cs/Ts, și prin urmare
planificabilitatea unui set de n taskuri periodice cu factorul de utilizare a procesorului Up poate fi
garantată în cazul în care

În cazul în care taskurile periodice (inclusiv PS) sunt planificate de către RM, testul de
planificabilitate devine

Rețineți că pot fi create și executa simultan mai multe servere de sondare pe diferite
seturi de taskuri aperiodice.
De exemplu, un server cu prioritate mare ar putea fi rezervat pentru un subset de taskuri
aperiodice importante, în timp ce un server cu prioritate mică ar putea fi folosit pentru a trata cererile
mai puțin importante.
Pentru a simplifica calculul, mai întâi sunt stabilite relațiile dintre cele mai defavorabile cazuri
pentru taskuri și limita este calculată față de modelul corespunzător celui mai defavorabil caz.

Cap 4
Server cu schimb de priorități dinamice

Serverul cu schimb de priorități dinamice (DPE – Dynamic Priority Exchange) este o


tehnică de servire a cererilor aperiodice propusă de Spuri și Buttazzo.
Ideea principală a algoritmului este de a lăsa serverul să schimbe timpul său de execuție cu timpul
de execuție a taskurilor cu prioritate scăzută (in EDF acest lucru înseamnă un termen limită mai lung),
în cazul în care nu există în așteptare cereri de aperiodice.
În acest fel, timpul de execuție a serverului este schimbat cu taskurile periodice și niciodată
pierdut.
Timpul de execuție este pur și simplu păstrat, chiar dacă la o prioritate mai mică, și poate fi
recuperat mai târziu, atunci când solicitările aperiodice intra în sistem.
Algoritmul este definit dupa cum urmeaza:
 Serverul DPE are o perioada Ts specifica si o capacitata Cs
 La inceputul fiecarei perioade, capacitatea serverului aperiodica este setata la Cds, unde d este
termenul limita al perioadei curente a serverului

Un exemplu de planificare produsă de algoritmul DPE este ilustrată în Figura din slide-ul
următor.

Se consideră două taskuri periodice, τ1 si τ2, cu perioade T1 = 8 și T2 = 12 și timpii de execuție


pentru cel mai defavorabil caz C1 = 2 și C2 = 3, și un server de DPE cu perioada Ts = 6 și
capacitatea Cs = 3, sunt prezente în sistem.
Teorema. (Spuri, Buttazzo) Dat fiind un set de taskuri periodice cu utilizarea procesorului Up si
un server de DPE cu utilizarea procesorului Us, întregul set este planificabil de EDF dacă și numai
dacă
Up+Us≤1

Server sporadic dynamic

Serverul sporadic dinamic (DSS) este o strategie de servire a taskurilor aperiodice. La fel ca alte
servere, DSS se caracterizează printr-o perioadă Ts și o capacitate Cs, care este păstrat pentru
eventualele solicitări aperiodice.
Spre deosebire de alți algoritmi cu servere, capacitatea nu este inițializată la valoarea integrala la
începutul fiecărei perioade a serverului, numai atunci când aceasta a fost consumată.
Momentele în care sunt realizate reaprovizionările sunt alese în funcție de o regulă de
reaprovizionarea care permite sistemului să obțină utilizarea deplină a procesorului.
Figura următoare ilustrează o planificare EDF obținută pe un set de taskuri format din două
taskuri periodice cu perioadele T1 = 8, T2 = 12 și timpi de execuție C1 = 2, C2 = 3, și un DSS cu
perioada Ts = 6 și capacitate Cs = 3.
La momentul t = 0, capacitatea serverului este inițializată la valoarea completă Cs = 3.
Deoarece nu există cereri aperiodice în așteptare, procesorul este atribuit taskului τ1, care are cel
mai apropiat termen limită.
La momentul t = 3, este activată o cerere aperiodică cu timpul de execuție 2 sosește, deoarece
Cs> 0, primul moment de reaprovizionarea a capacității și termenul limită a serverului sunt stabilite la
RT1=dS=3+ Ts = 9.
ds fiind cel mai apropiat termen limită, DSS devine taskul cu cea mai mare prioritate în sistem,
iar cererea este servită până la finalizare.
La momentul t = 5, cererea este finalizată și nu există alte cereri aperiodice în curs, deci, o
reaprovizionarea cu două unități de timp este programată să aibă loc la momentul RT1 = 9.
La momentul t = 6, a doua cerere aperiodică este activată.
Fiind că Cs>0, următoare reaprovizionarea și noul termen limită a serverului sunt stabilite la RT2
= dS = 6 + T = 12.
Din nou, serverul devine taskul cu cea mai mare prioritate în sistem (presupunem că legăturile
dintre taskuri sunt întotdeauna rezolvate în favoarea serverului) și cererea primește serviciul imediat.
De data aceasta capacitatea are disponibilă o singură unitate de timp, și acesta devine epuizată la
momentul t = 7.
Prin urmare, o reaprovizionarea de o unitate de timp este programată pentru RT2 = 12, și cererea
aperiodică este întârziată până la t = 9, atunci când Cs devine din nou mai mare decât zero.
La momentul t = 9, următoare reaprovizionare și noul termen limită a serverului sunt setate cu
RT3 = dS = 9 + T = 15.
Ca și înainte, DSS devine taskul cu cea mai mare prioritate, astfel, cererea aperiodic primește
serviciul imediat si se termina la momentul t = 10.
O reaprovizionare a unei unități este programată să aibă loc la momentul RT3 = 15.
Rețineți că atât timp cât capacitatea serverul este mai mare decât zero, toate cererile aperiodice în
așteptare sunt executate cu același termen.
În figura se întâmplă acest lucru la momentul t = 14, când ultimele două cereri aperiodice sunt
deservite cu aceleași termen limită dS=20.
Teorema (Spuri, Buttazzo) Având dat un set de n taskuri periodice cu utilizarea procesorului Up
si un server sporadic dinamic cu utilizarea procesorului Us, întregul set este planificabil dacă și numai
dacă
Up+Us≤1
Cap 5
În acest capitol se folosesc următoarele notaţii:

Bi – timpul maxim de blocare a taskului τi..


zi,k – o secţiune critică a taskului τi controlată de semaforul Sk.
Zi,k – cea mai lungă secţiune critică a taskului τi controlată de semaforul Sk.
δi,k – durata secţiuni critice Zi,k.
z i ,h ⊂ z i, k indică faptul că secţiunea critică z i ,h este inclusă în totalitate în secţiunea critică z i ,k .
σi – reprezintă setul de semafoare folosit de taskul τi.
σi,j – reprezintă setul de semafoare asociate taskului de prioritate mai mică τj şi care pot bloca
taskul τi.
γi,j – reprezintă un set care conţine cele mai lungi secţiuni critice care pot bloca un task τi,
secţiuni critice accesate de taskul τi cu prioritate mai mică. Acest set este:
γ i , j={Z j , k ∨( P j < Pi ) ş i(S k ∈ σ i , j)}
γi – reprezintă un set care conţine toate secţiunile critice cele mai lungi care pot bloca un task τi.
Acest set este:
γ i=¿ j: P j< Pi γ i , j

Definirea protocolului de moştenire a priorităţilor

Blocarea directă. Ea apare atunci când un task cu prioritate mai mare încearcă să dobândească o
resursa deja deținută de un task cu o prioritate mai mică. Blocarea directă este necesară pentru a
asigura consistența resurselor partajate.
Blocarea indirectă. Ea apare atunci când un task cu prioritate medie este blocat de un task cu
prioritate redusă, care a moștenit o prioritate mai mare la un task pe care îl blochează direct. Blocarea
indirectă este necesară pentru a evita inversiunea de prioritate pentru un timp nedeterminat.
EX

Aici, taskul τ1 folosește o resursă Ra controlată de un semafor Sa, taskul τ2 folosește o resursă Rb
controlată de un semafor Sb, iar taskul τ3 utilizează ambele resurse prin intermediul unor secțiuni
imbricate (Sa este blocat primul).
La momentul t1, taskul τ2 întrerupe taskul τ3 în prin intermediul unei secțiuni critice imbricate,
prin urmare, în momentul t2, atunci când taskul τ2 încearcă să blocheze semaforul Sb, taskul τ3
moștenește prioritatea sa, P2.
În mod similar, în momentul t3, taskul τ1 întrerupe taskul τ3 în cadrul aceleași secțiunii critice, și în
momentul t4, atunci când taskul τ1 încearcă să blocheze semaforul Sa, taskul τ3 moștenește prioritatea
P1.
La momentul t5, când taskul τ3 deblochează semaforul Sb, taskul τ2 este trezit, dar taskul τ1 este
încă blocat, prin urmare, taskul τ3 îşi continua execuția cu prioritatea taskului τ1.
La momentul t6, taskul τ3 deblochează semaforul Sa și, din moment ce nu sunt blocate alte taskuri,
taskul τ3 reprimește prioritate sa originală P3.
Un exemplu de moștenire tranzitivă a priorități este prezentat în slide-ul următor.

Aici, taskul τ1 folosește o resursă Ra controlată de semaforul Sa, taskul τ3 folosește o resursă Rb
controlată de semaforul Sb, iar taskul τ2 utilizează ambele resursele prin intermediul unor secțiuni
imbricate (Sa controlează secțiunea critică externă și Sb controlează secțiunea critică internă).
La momentul t1, taskul τ3 este întrerupt în cadrul secțiunii sale critice de taskul τ2, care la rândul
său intră prima secțiune critică (cea controlată de Sa), iar în momentul t2 este blocat de semaforul Sb.
Ca o consecință, τ3 își reia execuția și moștenește prioritatea P2.
La momentul t3, taskul τ3 întrerupt de taskul τ1, care la momentul t4, încearcă să obțină semaforul
Ra.
Deoarece Sa este blocat de taskul τ2, taskul τ2 moștenește prioritatea P1.
Cu toate acestea, taskul τ2 este blocat de taskul τ3, prin urmare, pentru tranzitivitate, taskul τ3
moștenește prioritatea P1 prin intermediul taskului τ2.
Când taskul τ3 părăsește secțiunea sa critică, nu sunt blocate alte taskuri de către aceasta; astfel el
reprimește prioritatea sa P3. P1 este acum prioritatea moștenită de taskul τ2, care blochează în
continuare taskul τ1 până la momentul t6.

Determinarea timpului de blocare a unui task

• În conformitate cu Lema 4-3, un task τi poate fi blocat cel mult o dată de fiecare task din cele li
taskuri cu priorităţi inferioare. Prin urmare, pentru fiecare task τj cu prioritate mai mică care poate
bloca taskul τi, se adună secţiunile critice cele mai lungi care pot bloca taskul τi. Această sumă, notată
Bil, este:
l
Bi= ∑ max {δ j , k −1∨Z j , k ϵ γ i }
k
j : P j <Pi
• În conformitate cu Lema 4-4, un task τi poate fi blocat cel mult o dată de fiecare semafor din
cele si semafoare care pot bloca taskul τi. Prin urmare, pentru fiecare semafor Sk care poate bloca taskul
τi, se adună secţiunile critice cele mai lungi care pot bloca taskul τi. Această sumă, notată Bis, este:
m
B =∑ max {δ j , k −1∨Z j ,k ϵ γ i }
s
i
k=1 j

• În conformitate cu Teoremă 4-1, taskul τi poate fi blocat pentru cel mult αi=min(li,si) secţiuni
critice. Prin urmare, Bi poate fi calculat ca minimul dintre Bli şi Bsi :
l s
Bi=min ⁡(B i , Bi )
Identificarea secțiunilor critice care pot bloca un task poate fi mult simplificată dacă pentru
fiecare semafor Sk vom defini un plafon C(Sk), egal cu cea mai mare prioritate a taskurilor care folosesc
Sk:
C (S ¿¿ k ) ≝ max ( P ¿ ¿ i∨Sk ∈ σ i ¿ )¿ ¿ ¿
i

Prin urmare, se poate defini următoarea lemă.


Folosind rezultatele din Lema 4-5, parametri de blocare Bli și Bsi pot fi determinați ca:
n
B=l
i ∑ max {δ j , k −1∨C (S¿¿ k) ≥ Pi }¿
k
j= j+1
m
Bsi =∑ max {δ j , k −1∨C(S¿ ¿ k )≥ Pi }¿
k=1 j>i

Rețineți că factorul de blocare Bn este întotdeauna egal cu zero, deoarece nu există taskuri cu o
prioritate mai mică decât Pn, care poate bloca τn.
Pentru a ilustra algoritmul prezentat mai sus, considerăm exemplul prezentat în Tabelul 4-1, în
cazul în care patru taskuri partajează trei semafoare.
Pentru fiecare task τi, durata celei mai lungi secțiunii critice dintre cele care folosesc același
semafor Sk se notează cu δi,k și prezentate în tabel. δi,k = 0 înseamnă că taskul τi nu utilizează semaforul
Sk. Plafoanele semafor sunt indicate în paranteze.

Conform algoritmului prezentat, factorii de


blocare a taskurilor sunt calculați după cum
urmează (rețineți că se scade din fiecare durată o
unitate de timp):

l
B1= 8+7+5 = 20
8
B1 = 8+5 = 15 ==>B1 = 15
l
B2= 7+5 = 12
8
B2 = 7+6+3 = 16 ==>B2 = 12
l
B=5
3
8
B = 5+4+3 = 12
3 ==>B1 = 5
l 8
B = B4 = 0
4

Pentru a înțelege de ce algoritmul este pesimist, rețineți că Bl2este calculat prin adăugarea duratei
a două secțiuni critice controlate de semaforul S1, care nu pot apărea niciodată în practică.

Definirea protocolul cu plafonarea priorităţilor


Exemplu
Cu scopul de a ilustra protocol cu plafonarea priorităţii, să considerăm trei taskuri τ1, τ2 și τ3
având prioritățile ordonate descrescător. Taskul cu cea mai mare prioritate τ1 accesează succesiv două
secțiuni critice controlate de semafoarele Sa și Sb; taskul τ2 accesează doar o secțiune critică controlată
de semaforul Sc; iar taskul τ3 folosește semaforul Sc și apoi face un acces imbricat la semaforul Sb.
Din necesarul de resurse a taskurilor, toate semafoarele au atribuite următoarele priorităţi plafon:

{
C ( S A )=P1
C ( S B ) =P1
C ( SC ) =P2
Acum, să presupunem că evenimentele evoluează așa cum este ilustrat în figura următoare:

La momentul t0, taskul τ3 este activat, iar din moment ce este singurul task gata de execuţie, el
trece în starea de execuţie, iar mai târziu blochează semaforul SC.
La momentul t1, taskul τ3 devine gata de execuţie şi întrerupe taskul τ3.
În momentul t2, taskul τ2 încearcă să blocheze semaforul SC, dar este blocat de protocol, deoarece
P2 nu este mai mare decât C(SC). In acest moment taskul τ3 moștenește prioritatea taskului τ2 şi își reia
execuţia.
La momentul t3, taskul τ3 intră cu succes într-o secțiune critică imbricată prin blocarea
semaforului SB. Rețineți că taskului τ3 îi este permis să blocheze semaforul SB, deoarece nu sunt
semafoare blocate de alte taskuri.
La momentul t4, în timp ce taskul τ3 este în stare de execuţie cu prioritatea p3 = P2, taskul τ1 devine
gata de execuţie și întrerupe taskul τ3 deoarece P1> p3.
La momentul t5, taskul τ1 încearcă să blocheze semaforul SA, care nu este blocat alt task.
Cu toate acestea, taskul τ1 este blocat de protocol, deoarece prioritatea sa nu este mai mare decât
C(SB), care este cea mai mare prioritate plafon dintre toate semafoarele care sunt blocate de alte taskuri.
Deoarece semaforul SB este blocat de taskul τ3, taskul τ3 moștenește prioritatea taskului τ1 și îşi
reia execuţia.
La momentul t6, taskul τ3 părăseşte secțiunea critică imbricată, deblochează semaforul SB, și
revine la prioritatea p3 = P2. La acest punct, P1>C(SC), prin urmare, taskul τ1 întrerupe taskul τ3 și intră
în starea de execuţie până la finalizarea sa.
La momentul t7, taskul τ1 este finalizat, iar taskul τ3 își reia execuţia cu prioritatea p3=P2.
La momentul t8, taskul τ3 părăseşte secțiunea critică, eliberează semaforul SC şi prioritatea
taskului τ3 revine la prioritatea sa nominală P3. În acest moment, taskul τ2 întrerupe taskul τ3 și trece în
tarea de execuţie până la finalizarea sa.
La momentul t9, taskul τ2 este finalizat, astfel, τ3 îşi reia execuţia.
Rețineți că protocolul cu plafonarea priorităţii introduce o a treia formă de blocare, numită
blocarea plafon în plus față de blocarea directă și blocarea indirectă provocate de protocolul cu
moștenirea priorităţilor.
Acest lucru este necesar pentru a evita punctele moarte și blocarea înlănțuită. În exemplul
anterior, o blocare plafon este experimentată de taskul τ1 la momentul t5.

Determinarea timpului de blocare a unui task

Să luăm în considerare același exemplu ilustrat pentru


protocolul cu moștenirea priorităţilor (vezi Tabelul 5-1).
Conform ecuației (5-4), avem:
γ 1 = { Z 2 b , Z 3 a , Z3 b , Z 4 a , Z 4 b }
γ 2= { Z 3 a , Z 3 b , Z 4 a , Z 4 b , Z 4 bc }
γ 3= { Z 4 a , Z 4 b , Z 4 c }
γ 4 ={}
Prin urmare, pe baza ecuației (5-5), factorii de blocare a taskurilor sunt calculate după cum
urmează:
B1=max {8 , 7 , 6 , 5 , 4 }=8
B2=max {7 , 6 , 5 , 4 ,3 }=7
B3=max {5 , 4 , 3 }=5
B4 =0.

Plafonarea resursei

Fiecare resursă Rk (sau semafor Sk) este atribuit un plafon CRk(nk) egal cu cel mai înalt nivel
preemțiune al taskurilor care ar putea fi blocate pe resursa Rk, dacă depășește cererea lor maximă.
Prin urmare, plafonul de resurse este o valoare dinamică, care este o funcție de unitățile resursei
Rk, care sunt disponibile în prezent.
Asta este determinată folosind următoarea relaţie:
C Rk ( nk ) =max { π i|μ i ( R k ) >nk }
În cazul în care sunt disponibile toate unitățile resursei Rk (dacă nk = Nk) atunci CRk(Nk)=0.
Pentru a clarifica mai bine acest concept, luați în considerare următorul exemplu, în care trei
taskuri (τ1, τ2, τ3) partajează trei resurse (R1, R2, R3), formate din trei, una, respectiv trei unități,
Toți parametrii taskurilor - termene limită relative, nivelurile de preemţiune și cerințele de resurse
- sunt prezentate în Tabelul 6-1.
Pe baza acestor cerințe, plafoanele actuale ale resurselor
în funcție de numărul de unități disponibile nk sunt prezentate
în Tabelul 6-2. (liniuțele indică cazuri imposibile).

De exemplu, să calculăm plafonul resursei R1


atunci când doar două unități (din trei) sunt disponibile.
Din Tabelul 6-2 vom vedea că singurul task care
ar putea fi blocat în această condiție este τ3, deoarece
este nevoie de trei unități a resursei R1, prin urmare,
CR1(2) = π3 = 1.
În cazul în care este disponibilă o singură unitate a resursei R1, taskurile care ar putea fi blocate
sunt τ2 și τ3, prin urmare, CR1(1) = max (π2, π3) = 2.
În cele din urmă, în cazul în care nu este disponibilă nici una dintre unitățile resursei R1, toate cele
trei taskuri ar putea fi blocate pe R1, prin urmare, CR1(0) = max (π1, π2, π3) = 3.

Exemplu
Cu scopul de a ilustra modul în care funcționează SRP, considerăm setul de taskuri deja descris
în Tabelul 6-1.
Structura taskurilor este prezentată în Figura 6-2.
În cazul în care directiva wait(Rk,r) reprezintă cererea de r unităţi a resursei Rk, iar signal(Rk)
reprezintă eliberarea lor.
Plafoanele actuale ale resurselor au fost deja prezentate în Tabelul 6-2, iar o posibilă planificare
EDF pentru acest set de taskuri este prezentată în Figura 6-3.
În această figură, graficul prezintă variaţia priorităţi plafon a sistemului, iar numerele din timpul
planificării reprezintă indici de resurse.

Figura 6-2.Structura taskurilor in exemplul SRP


• Figura 6-3. Exemplu de planificare cu EDF şi SRP. Numerele din zona de execuţie a taskurilor
reprezintă indecșii resurselor.
• La momentul t0, taskul τ3 începe execuţia și plafonul sistemului este zero, deoarece toate
resursele sunt complet disponibile.
• Atunci când taskul τ3 intră în prima secțiune critică, are nevoie de o unitate a resursei R2, astfel
plafonul sistemului este setat la cel mai înalt nivel preemțiune dintre taskurile care ar putea fi blocate
pe R2 (a se vedea Tabelul 6-2), care este Πs = π2 = 2. Ca o consecință, taskul τ2 este blocat de testul de
precedenţă și taskul τ3 îşi continuă execuţia.
• Rețineți că atunci când taskul τ3 intră într-o secțiune critică imbricată (luând toate unitățile
resursei R1), plafonul sistemului este ridicat la Πs = π1 = 3.
• Acest lucru determina ca taskul τ1 să fie blocat de testul de precedenţă.
• Imediat ce taskul τ3 eliberează R1 (în momentul t2), plafonul sistemului devine Πs = 2; astfel,
taskul τ1 întrerupe taskul τ3 și începe execuţia.
• Rețineți că odată ce taskul τ1 este pornit, acesta nu este blocat în timpul execuției sale, deoarece
starea π1> Πs garantează faptul că toate resursele necesare taskului τ1 sunt disponibile.
• Imediat ce taskul τ1 se termină, taskul τ3 îşi reia execuţia şi eliberează resursa R2.
• Imediat ce resursa R2 este eliberată, plafonul sistemului revine la zero și taskul τ2 poate întrerupe
taskul τ3.
• Din nou, o dată τ2 este pornit, toate resursele de care are nevoie sunt disponibile, astfel taskul τ2
nu este niciodată blocat.
Partajarea stivei de executie

De exemplu, ia în considerare patru taskuri τ1, τ2, τ3, și τ4, cu un nivel de preemţiune 1, 2, 2, și
3v (3 fiind cel mai înalt nivel preemțiune).
Figura din slideul urmator ilustrează o posibilă evoluție a stivelor, presupunând că fiecare task are
alocată o stivă proprie, a cărei mărime este egală cu cerința maximă.

În momentul t1, taskul τ1 începe execuţia, la momentul intră în execuţie τ2 (întrerupe taskul τ1) și
se finalizează în momentul t3, permițând taskului τ1 săşi reia execuţia.
În momentul t4, taskul τ1 este întrerupt de taskul τ3, care, la rândul său, este întrerupt de taskul τ4
la momentul t5.
La momentul t6 taskul τ4 se finalizează și taskul τ3 îşi reia execuția.
La momentul t7, taskul τ3 se finalizează și τ1 îşi reia execuția.
Rețineți că vârful stivei fiecărui task variază în timpul execuției, în timp ce regiunea de stocare
rezervat pentru fiecare stiva rămâne constantă și corespunde distanței dintre două linii orizontale.
În acest caz, zona de memorie totală care trebuie să fie rezervată este egală cu suma regiunilor
stivei dedicate pentru fiecărui task.
Cu toate acestea, în cazul în care toate sunt independente sau folosesc politica stivei de resurse
pentru a accesa resursele partajate, atunci pot partaja o singură stivă.
În acest caz, atunci când un task τ este întrerupt de un task τ’, taskul τ îşi menţine stiva sa și stiva
taskului τ’ este alocă pe stiva taskului τ.
Figura următoare prezintă o posibilă evoluție a setului precedent de taskuri, când o singură stivă
este alocată la toate taskurile.
Rețineți că spațiul de stivă între cele două linii orizontale superioare (care este echivalentă spațiul
de stivă dintre τ2 și τ3) nu mai este necesară, deoarece τ2 și τ3 au același nivel de preemțiune, astfel
încât ele nu pot ocupa spațiul alocat stivei în același timp.
În general, cu cât este mai mare numărul de taskuri cu același nivel de preemțiune, cu atât este
mai mare economia cu spaţiul alocat stivei.

Analiza planificabilitatii

Testul Liu si Layland pentru algoritmul RM (Rate Monotonic). Un set de taskuri periodice cu
factori blocare și termene limită relative egale cu perioadele este planificabil de RM în cazul în care
C h C i + Bi
∀ i=1 , … ,n ∑ Th
+
Ti
≤ i(21/ 2−1)
h : Ph >Pi

Testul Liu si Layland pentru EDF. Un set de taskuri periodice cu factori de blocaj și termene
relative egale cu perioadele este planificabil de EDF în cazul în care
C h C i + Bi
∀ i=1 , … ,n ∑ Th
+
Ti
≤1
h : Ph >Pi

S-ar putea să vă placă și