Programare: Tema 1 - Planificarea sarcinilor

Cu această temă exersăm folosirea deciziei (operatorul condițional) pentru scrierea unor funcții simple a căror expresie de calcul depinde de intervalele de valori în care se află parametrii de intrare. Vom modela prin program o problemă simplă de planificare: sunt de efectuat mai multe sarcini, fiecare de durată cunoscută, pentru care nu e posibilă execuția lor concomitentă.

Situația poate apărea pe un procesor care trebuie să execute mai multe programe, într-un flux de producție, in viața de zi cu zi, etc. Se pune problema de a calcula momentul în care e terminată execuția fiecărei sarcini, în funcție de timpii la care au fost făcute solicitările.

În general, se pot alege diverse criterii de decizie: luând în considerare ordinea solicitărilor, prioritatea acestora, durata executiei sau termenul limită. Discutăm planificarea bazată pe prioritate: în momentul deciziei asupra următoarei sarcini de executat se alege cea de prioritate maximă între toate cele solicitate (se presupune că fiecare sarcină are asociată o prioritate cunoscută). Pot apărea două subcazuri:

Presupunem în cele ce urmează ca planificarea se face dinamic, adică nu se cunosc dinainte momentele la care se solicită execuția diverselor sarcini.

Exemplu: Presupunem că avem de planificat următoarele sarcini:
SarcinaDurataPrioritateMoment
solicitare
J11015
J2728
J38312
În cazul planificării non-preemptive, sarcinile vor fi executate în felul următor:

                      
                              -----------------
                              |               |--------------
          --------------------|       J3      |      J2     |
          |        J1         |               |             |
|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|--> t
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
                ^       ^
	        J2      J3
Solicitările pentru sarcinile J2 și J3 apar în timpul execuției lui J1, dar aceasta nu poate fi întreruptă. La încheierea lui J1 (t = 5 + 10 = 15), se dă în execuție solicitarea existentă de prioritate maximă, J3, iar la terminarea acesteia se executa J2. În cazul planificării preemptive, aceleași sarcini se execută în felul următor:
                      
                        -----------------
                --------|               |----- 
          ------|  J2   |       J3      |  J2 |-------------|
          |  J1 |       |               |     |     J1      |
|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|-|--> t
0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 3 3 3
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2
                ^       ^
	        J2      J3
La apariția lui J2 (t = 8), e oprit J1 și se trece la execuția lui J2, acesta fiind prioritar. La fel, la apariția lui J3 se oprește J2 și se începe execuția lui J3. La terminarea lui J3, sarcina cea mai prioritară e J2, din care au mai rămas de executat 3 unități de timp. În final, se execută cele 7 unități de timp rămase din J1.

Problema de rezolvat

Fiind dat un tabel ca și cel de mai sus, cu 2-3 sarcini, și 1-2 dintre caracteristici parametri variabili (restul fiind dați ca si constante), să se scrie pentru fiecare sarcină câte o funcție care determină timpul la care se încheie execuția sa. În programul principal, alegând câte o valoare pentru fiecare parametru, să se afișeze rezultatele, împreună cu câte un mesaj explicativ.

Exemple:
SarcinaDurataPrioritateMoment
solicitare
J1101x
J23212
pentru planificare non-preemptivă
SarcinaDurataPrioritateMoment
solicitare
J161x
J242y
pentru planificare preemptivă


Marius Minea
Last modified: Sun Mar 54 17:38:25 EET 2006