Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Fondamenti di informatica Prof. Lorenzo Mezzalira Appunti del corso 9 Sistema operativo Esecuzione di processi concorrenti 1 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira SERVIZI PER L’ESECUZIONE DI PROGRAMMI Utente 1 Utente 2 Compilatore Editor Utente 3 Utente 4 Base di dati Excel Programmi applicativi Sistema operativo CPU Memorie Interfacce Hardware Fig. – Struttura funzionale di un sistema di calcolo multiutente I compiti di un sistema operativo sono: fornire servizi all‟utente tramite l’interprete comandi (shell) Video, tastiera, mouse fornire un supporto di esecuzione dei programmi mediante le primitive di sistema Funzioni invocabili come sottoprogrammi 2 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Servizi del Sistema Operativo Il supporto all‟esecuzione viene fornito con: gestione delle risorse interne al sistema di elaborazione gestione delle comunicazioni con l‟esterno tramite le unità periferiche La gestione delle risorse interne al sistema riguarda tipicamente le seguenti funzioni gestione della memoria di lavoro, eventualmente a più livelli (memoria virtuale, memoria cache), con relativi registri di indirizzamento della CPU per accedere ai vari segmenti di memoria. gestione delle temporizzazioni (orologio/calendario, Real Time Clock, ecc.) gestione dei file e delle memorie di massa gestione delle interazioni e comunicazioni tra i programmi o processi in esecuzione La gestione delle unità periferiche di comunicazione col mondo esterno è sostanzialmente basata su una collezione di driver ognuno dei quali presenta una serie di servizi. Un driver è il software di gestione di una periferica, che comprende le strutture dati e le funzioni che si fanno carico dei meccanismi, talora anche piuttosto complessi, per la corretta gestione delle operazioni con quella periferica. Tipici servizi sono ad esempio: inizializzazione di HW e SW della periferica impostazione delle modalità operative operazioni di input/output informazioni sullo stato della periferica 3 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Struttura tipica dei sistemi operativi Generalmente i sistemi operativi sono realizzati con una struttura a strati sovrapposti, con funzionalità gerarchiche a partire dal livello di gestione dell‟hardware fino alle funzioni di alto livello per l‟operatore e per l‟esecuzione dei programmi. Gli strati inferiori contengono le funzioni che gestiscono i meccanismi di basso livello, mentre gli strati superiori utilizzano le funzioni messe a disposizione dallo strato inferiore per realizzare funzioni più complesse e con crescente astrazione dai meccanismi dell‟hardware. A livelli decrescenti verso l‟hardware una stratificazione potrebbe essere la seguente: Window system gestione delle finestre su video Shell gestione operatore con interprete comandi Network stack gestione dei protocolli di scambio messaggi in rete File system gestione dei file I/O system gestione delle funzionalità di I/O Pager – swapper gestione della memoria di lavoro, virtuale e cache Scheduler assegnazione della CPU ai processi Device drivers gestione dei meccanismi hardware di interfaccia I livelli inferiori costituiscono il cosiddetto nucleo (kernel) del sistema operativo. 4 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Processi I processi sono dei programmi in esecuzione, e quindi contenuti nella memoria di lavoro, composti da codice eseguibile (linguaggio macchina) area di memoria per i dati sui quali opera l‟esecuzione del codice area di memoria per lo stack (per la gestione dei sottoprogrammi) contesto – contenuto dei registri e stato della CPU (PSW = Processor Status Word) eventuale area di memoria per l‟allocazione dinamica (heap) Diversi processi possono coesistere “attivi” in un calcolatore, anche se in ogni istante uno solo può essere effettivamente in esecuzione. Una CPU con un solo Program Counter può seguire un solo flusso di esecuzione. 5 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Classificazione dei sistemi di elaborazione in base alle modalità di esecuzione dei processi e di interazione con l’operatore Monoprogrammato monoutente (Personal Computer anni „80) Esecuzione a lotti (batch – centri di calcolo) Multiprogrammato monoutente (Personal Computer) Multiprogrammato multiutente time-sharing (server) Multiprogrammato real-time (automazione di macchine) Monoprogrammato monoutente L‟utente interagisce con il calcolatore e può comandare l‟esecuzione di un programma alla volta, cioè solo quando l‟esecuzione di un programma è terminata se ne può lanciare un altro. Gestione interattiva relativamente semplice. Esecuzione sequenziale a lotti (batch) L‟utente non interagisce direttamente con il calcolatore, ma affida ad un operatore il compito di eseguire i programmi di interesse. Questi sono eseguiti uno alla volta in sequenza. Modalità di esecuzione in disuso. Gestione semplice. Esecuzione multiprogrammata a lotti (batch) Come nel caso precedente, ma ci possono essere diversi processi in esecuzione contemporaneamente, che si avvicendano nell‟uso di risorse come vari tipi di memoria di massa, stampanti, linee di comunicazione, ecc. Questa gestione, tipica dei centri di calcolo con notevoli risorse, è relativamente complessa, ed ha come obiettivo principale il massimo sfruttamento delle risorse, quindi il massimo throughput. 6 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Classificazione dei sistemi di elaborazione Multiprogrammato multiutente time-sharing Diversi utenti, ognuno dotato di un proprio terminale, interagiscono con il sistema di calcolo che è in grado di eseguire “contemporaneamente” i vari processi richiesti dagli utenti, rigorosamente indipendenti tra loro. In questi sistemi lo scopo è di fornire un servizio soddisfacente per gli utenti. Multiprogrammato monoutente (Personal Computer) Un solo utente interagisce direttamente con il calcolatore e può lanciare l‟esecuzione di diversi programmi con i quali interagisce per fornire dati e comandi. Qualche interazione è possibile tra i processi: ad es. cut and paste. Lo scopo principale è avere un‟interfaccia operatore di facile uso (user friendly). Multiprogrammato real-time Il sistema è in grado di eseguire diversi processi contemporaneamente, facendo in modo che l‟esecuzione di ognuno di essi rispetti precisi vincoli temporali riguardo agli istanti di attivazione e soprattutto di emissione dei risultati delle elaborazioni. I processi sono spesso interagenti e cooperanti tra loro. Il caso tipico è costituito dalle applicazioni di automazione di macchine e processi fisici. In questo caso lo scopo principale è quello di garantire il rispetto dei vincoli temporali. 7 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Gli obiettivi di un sistema di elaborazione possono quindi essere svariati e concomitanti, come ad esempio: semplicità ed economia massimo sfruttamento di alcune risorse (stampanti, dischi) massimo throughput di elaborazione adeguatezza alle esigenze di una multiutenza rispetto di vincoli temporali nelle interazioni con l‟esterno massima affidabilità La “personalità” del sistema, sia rispetto all‟interazione con l‟operatore sia rispetto alle funzioni offerte ai programmi applicativi, dipende notevolmente dal tipo di macchina virtuale che il sistema operativo implementa sulla macchina fisica. Il SW applicativo infatti si appoggia (in genere) al supporto del S.O. 8 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Meccanismi specifici dei sistemi operativi multi programmati Esecuzione in modo utente e modo supervisore (modo sistema) privilegiato Rilocazione degli indirizzi di memoria nei processi Diverse aree di stack utente e di stack di sistema Esecuzione in modo utente e supervisore Nel modo utente la CPU può eseguire solo un sottoinsieme delle istruzioni macchina. Sono tipicamente istruzioni privilegiate, eseguibili solo in modo supervisore, le istruzioni di I/O e le istruzioni di modifica dei registri base delle aree di memoria. Il passaggio da modo utente a modo supervisore avviene automaticamente quando la CPU esegue una istruzione di chiamata di sistema, detta SVC = Supervisor Call. (invocazione di primitive) Il tentativo di eseguire in modo utente un‟istruzione privilegiata comporta l‟interruzione dell‟esecuzione del processo e la cessione del controllo al sistema operativo. 9 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira NECESSITÀ DI PARALLELISMO (Per l‟elaborazione in tempo reale) Il carico di lavoro di un sistema di elaborazione che debba interagire in tempo reale con fenomeni esterni è scomponibile in: attività costituite da azioni periodiche (campionamenti, monitoraggio, regolazioni, ecc.) azioni aperiodiche (generalmente risposte ad eventi sporadici) attività di sottofondo (non real-time – stampe, interazioni con operatore, ecc.). Eventi periodici Sono eventi per cui ogni istanza di evento si verifica sempre alla stessa distanza temporale dall‟istanza precedente. Sono quindi eventi che si verificano con regolarità in modo predicibile. Eventi sporadici Sono eventi che si verificano in modo imprevedibile, a maggiore o minore distanza temporale rispetto all‟evento precedente. Chiamiamo scopo temporale ST di un'azione l'intervallo di tempo tra l'istante in cui si verifica l'evento che consente o richiede l'esecuzione dell'azione (triggering event) e l'istante di tempo in cui tale attività deve (deadline) essere, completata. 10 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Scopo temporale di un’azione Lo scopo temporale è scomponibile in due componenti temporali: TLatenza = tempo di attesa inerte TEsecuzione = tempo dedicato ad effettiva elaborazione ST = TLatenza + TEsecuzione Definizione: LATENZA = tempo che un’azione, pronta per l’esecuzione, trascorre senza poter procedere nell’esecuzione a causa della temporanea non disponibilità di qualche risorsa (in genere la CPU) che è attualmente assegnata ad altre azioni (in genere più prioritarie). La latenza entra in gioco quando ci sono i momenti di sincronizzazione tra produttore di uno stimolo ed esecutore delle operazioni di risposta allo stimolo. La latenza è molto variabile di volta in volta, generalmente in modo casuale. La latenza minima è nulla, e si verifica quando in occasione dello stimolo l‟esecutore trova tutte le risorse disponibili. La latenza massima (caso peggiore) si verifica quando lo stimolo arriva in un momento di uso intenso delle risorse. 11 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Latenza Nei sistemi correttamente progettati la latenza massima di ogni azione ha un limite superiore compatibile con i tempi di risposta (deadline) di quell‟azione. Quando invece la latenza massima è arbitrariamente lunga si parla di starvation (lett. morte per inedia). In questo caso un‟azione continua a non poter essere eseguita perchè altre azioni monopolizzano l‟uso delle risorse. Il tempo di esecuzione (netto) è il tempo impiegato dalla CPU per eseguire le istruzioni dell‟azione da compiere, ed è in genere più prevedibile di quanto non sia il tempo di latenza. Anche il tempo di esecuzione netto potrà variare nelle varie istanze di esecuzione dell‟azione, in dipendenza dei dati da trattare, come ad es. la quantità di elementi significativi di un array, il numero di cicli necessari per arrivare alla soluzione, ecc. 12 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira PARALLELISMO Chiamiamo concorrenti attività le cui azioni hanno scopi temporali che presentano sovrapposizioni (overlapping), in contrapposizione al termine sequenziali che designa azioni con scopi temporali senza intersezioni. Un'elaborazione ad attività concorrenti è detta real-time se l'inizio e/o la fine di alcuni o tutti gli scopi temporali delle azioni è vincolata da specifiche temporali. Chiamiamo processo sequenziale un'attività internamente sequenziale e caratterizzata da un proprio contesto, cioè l'insieme delle risorse ad essa allocate ed i rispettivi stati. I sistemi di elaborazione in tempo reale devono essere dotati di una capacità di parallelismo tra diverse elaborazioni, cioè la capacità di iniziare e completare in tempo utile (rispettando i vincoli temporali) una nuova azione anche se altre sono già in corso (sovrapposizione di scopi temporali di diverse azioni). La necessità di parallelismo deriva dal fatto che si richiede una corretta e tempestiva interazione del sistema di elaborazione con diversi fenomeni esterni (fenomeni fisici, operatori umani, altri calcolatori) che evolvono in parallelo tra loro e richiedono ognuno l‟esecuzione di azioni. Chiamiamo: TDi la durata dello scopo temporale dell'azione i-esima (esprime la rapidità di risposta richiesta al sistema di elaborazione dallo stimolo i-esimo) detta DEADLINE. TEi il massimo tempo di esecuzione netto dell'azione iesima (esprime la velocità offerta dal sistema di elaborazione). E‟ il tempo necessario per l‟esecuzione con tutte le risorse disponibili ed in assenza di interruzioni, cioè senza latenze. 13 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira PARALLELISMO FISICO Un totale parallelismo reale (o fisico) tra le varie azioni è ottenibile solo se sono disponibili tante risorse processori (multiprocessing), quante sono richieste dalle diverse attività potenzialmente concomitanti. In questo caso le latenze dei processi di elaborazione sono sempre nulle, infatti i processori dedicati alle singole azioni sono immediatamente disponibili ad eseguirle quando si verificano le richieste (eventi trigger). Questo parallelismo implica un'assegnazione (scheduling) spaziale delle attività alle varie CPU. Ogni CPU rimane inattiva (idle) per tutto il tempo in cui non è richiesto lo svolgimento di azioni dell'attività assegnatale, e ciò può portare ad uno scarso sfruttamento di tali risorse. Quindi generalmente non si adotta una configurazione come questa, che possiamo chiamare “a risorse illimitate”. Un'applicazione non è fisicamente realizzabile, neppure con un sistema a parallelismo fisico, se per almeno un'azione i-esima si ha: TEi > TDi che corrisponde a tempo di elaborazione maggiore del tempo di risposta disponibile, cioè potenza di calcolo insufficiente per l‟algoritmo adottato, rispetto alle prestazioni temporali richieste. In questo caso occorre ridurre TEi, e ciò si ottiene individuando un algoritmo più efficiente per l‟azione i-esima oppure utilizzando un processore con maggiore “potenza di calcolo”, cioè più veloce. 14 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira PARALLELISMO VIRTUALE Molto interessante è il parallelismo virtuale (o logico) che è ottenibile con l'assegnazione nel tempo delle (scarse) risorse (CPU) alle varie azioni in corso. Questa modalità di esecuzione viene detta multitasking = multiprogrammazione. In altre parole, una singola CPU potrà essere dedicata nel tempo ad eseguire ora una e ora un‟altra tra le diverse azioni di cui è stata richiesta ed è “in corso” (cioè è dentro lo scopo temporale) l‟esecuzione. Questo approccio consente generalmente un migliore sfruttamento delle risorse (tipicamente la CPU) rispetto al parallelismo esclusivamente fisico, ma richiede uno scheduling temporale. Per scheduling si intende una politica di scelta a quali azioni dedicare la CPU in quali intervalli di tempo, preservando la correttezza di esecuzione, con la gestione del passaggio dall‟esecuzione di un‟azione ad un‟altra. Con questa esecuzione multiprogrammata il tempo di elaborazione di un‟azione corrisponde a tempo di latenza per tutte le altre azioni triggerate, che quindi in quel momento hanno scopo temporale sovrapposto. 15 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Carico di lavoro della CPU Per valutare il carico di lavoro della CPU in presenza di richieste di eseguire un certo numero di azioni, ognuna con la sua periodicità TAi, si è introdotto il coefficiente di utilizzazione del processore: U 1 n TEi TAi n = numero di azioni potenzialmente richieste al processore TEi = tempo (max) di esecuzione netto dell'azione i-esima TAi = intervallo (min) tra le successive attivazioni dell'azione i-esima. La realizzabilità fisica con un solo processore impone che sia U < 1 che è condizione necessaria, ma non sufficiente (dipende dalle politiche di scheduling), perchè possano essere rispettati tutti i vincoli temporali richiesti per una elaborazione real-time. Per il carico di lavoro imposto da eventi periodici i valori TAi corrispondono ai periodi dei rispettivi eventi, Per le componenti del carico di lavoro imposte da eventi sporadici si può parlare di utilizzazione "media" o "di picco" a seconda che per i vari TAi si adottino i valori medi o minimi (tempo morto) di ripetizione del corrispondente evento sporadico. Per gli eventi sporadici si dice tempo morto la minima distanza temporale tra due eventi consecutivi, che quindi costituisce il caso peggiore per quanto riguarda il carico di lavoro per la CPU. 16 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira PARALLELISMO Purchè il coefficiente di utilizzo della CPU sia U<1 e lo scheduling temporale sia tale da contenere l'esecuzione di ogni azione all'interno del proprio scopo temporale, l'effetto complessivo osservabile è "equivalente" a quello ottenibile da diversi processori con esecuzione fisicamente in parallelo. Consideriamo temporalmente equivalenti i sistemi in cui ogni azione rispetta il vincolo temporale della propria deadline (cioè è temporalmente corretta). Questa equivalenza è lecita in quanto le specifiche temporali richieste alle elaborazioni riguardano solo certi momenti delle elaborazioni ed in particolare quasi sempre riguardano solo l'operazione conclusiva di emissione del risultato finale. Parliamo quindi di parallelismo virtuale di un sistema multiprogrammato perchè il suo comportamento è equivalente a quello di un sistema fisicamente parallelo. 17 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Esempio di esecuzione di azioni con scopi temporali sovrapposti. La sospensione dell‟esecuzione di un‟azione per passare ad eseguire un‟altra azione (più prioritaria) è detta preemption. Preemption di A1 Scopo temporale Azione A1 Esec. Azione A1 Latenza di A1 Esec. Azione A1 Deadline di A1 t Scopo temp. A2 Azione A2 Deadline di A2 t Evento E2 trigger dell‟Azione A2 Evento E1 trigger dell‟Azione A1 In questa situazione se l‟esecuzione di A2, triggerata quando è già in corso A1, fosse stata rimandata alla conclusione di A1 (quindi senza preemption), A2 non avrebbe rispettato la sua scadenza. Si noti l‟importanza di un opportuno scheduling temporale e della preemption. 18 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira MODELLI IMPLEMENTATIVI DI PARALLELISMO VIRTUALE Per ottenere una corretta esecuzione di azioni che presentano scopi temporali sovrapposti è necessario organizzare il modo con cui si assegna la CPU alle varie azioni da compiere, cioè alle varie parti di codice da eseguire. Si dice “cedere il controllo ad un’azione” l‟operazione tramite la quale si attiva il contesto del programma che esegue quell‟azione ed in particolare si carica nel registro PC (Program Counter) della CPU l‟indirizzo dell‟istruzione prossima da eseguire, cioè della prima istruzione di un‟azione da iniziare o dell‟istruzione da cui riprendere l‟azione interrotta per qualche motivo. Le due tecniche implementative di cessione del controllo alle varie azioni da eseguire sono: Cessione del controllo guidata dal tempo. Ciclicamente si cede il controllo alle varie azioni, una dopo l‟altra, concedendo ad ognuna il suo turno di esecuzione. Sarà compito di ogni azione vedere se ci sono o meno operazioni da eseguire in quel momento. Le parti di codice relative alle varie azioni vengono collocate sequenzialmente dal programmatore che realizza così un unico processo da eseguire ciclicamente. Cessione del controllo guidata dagli eventi. Le azioni sono concretizzate in processi che restano in stato di attesa del loro evento (trigger). Al verificarsi dell‟evento atteso sono collocati nello stato di pronto. Lo scheduler del sistema operativo decide a quale dei processi nello stato di pronto cedere il controllo di esecuzione. 19 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira 1 - TIME-DRIVEN = Guidato dal tempo Chiamiamo Ii - l‟insieme dei valori delle variabili di ingresso, che contengono i valori acquisiti dai segnali del mondo esterno nell‟istante temporale i-esimo Ti. Oi - l‟insieme dei valori delle variabili di uscita, destinati ad essere emessi verso il mondo esterno nell‟istante temporale i-esimo Ti. Si - l‟insieme dei valori di variabili interne (variabili di stato) nell‟istante temporale i-esimo Ti. La funzionalità di un sistema può essere scomposta in un insieme di attività concorrenti (che operano in parallelo tra loro). Ogni attività può essere vista come un processo trasformazionale che riceve in ingresso informazioni dal mondo esterno e (idealmente con continuità) produce in uscita informazioni e comandi da emettere verso il mondo esterno. Nella maggior parte delle applicazioni è pensabile che le informazioni in ingresso (Ii) al sistema di elaborazione siano ottenute mediante una periodica osservazione (campionamento) di stati continui (analogici) e discreti (digitali). L‟implementazione di ogni attività può essere realizzata da un pezzo di programma (che descrive un’azione) da eseguire ad ogni campionamento (quindi ripetuta ciclicamente) per produrre gli effetti richiesti dall‟attività. 20 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Time driven Con l'approccio time-driven ogni attività viene implementata come un‟esecuzione, ripetuta ad ogni campionamento, di una nuova istanza di una stessa azione che utilizza i valori catturati in ingresso (Ii) ed eventualmente uno stato interno (Si) e produce alcuni valori di uscita (Oi) e l'eventuale nuovo valore dello stato interno (Si+1). Se si adotta lo stesso periodo di campionamento per tutti gli ingressi, si avrà anche lo stesso periodo di ripetizione ciclica delle azioni che realizzano le varie attività. In questo caso (che è quello più usuale): Il SW applicativo con approccio time-driven consiste in un unico processo da eseguire ciclicamente con periodo temporale (Tp) costante, che contiene in sequenza le parti di programma che realizzano le azioni delle varie attività. Implementativamente Il programma è costituito dalla sequenza delle operazioni a, b, c Ad ogni scadenza temporale "scadenza dell'istante Ti" si esegue un nuovo ciclo: leggi i valori VAR-IN = Ii con campionamento in ingresso esegui il programma, cioè le azioni a(i), b(i), c(i) emetti i valori Oi = VAR-OUT appena calcolati e aggiorna lo stato interno copiando in S i valori Si+1. 21 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Esempio Si voglia realizzare un‟applicazione che svolge in parallelo tra loro le seguenti attività: 1) – Contare gli oggetti che passando davanti ad una fotocellula portano a livello “ON” un segnale binario che a riposo è a livello “OFF”. Il conteggio deve iniziare dal momento di attivazione del sistema. Gli oggetti attivano la fotocellula per tempi > 0,2 s 2) – Emettere un suono con un cicalino al passaggio degli oggetti multipli di 10 3) – Regolare una temperatura accendendo (ON) un elemento riscaldante se essa è inferiore a SOGLIA e spegnendolo (OFF) se essa è superiore. 4) – Lampeggiare con frequenza di 1 Hz e duty-cycle 60% un LED (indicatore luminoso) se la temperatura è inferiore di 10 gradi rispetto alla SOGLIA 22 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Pseudocodice del processo time driven Inizializzazione – eseguita una volta all’accensione del sistema conta_oggetti = 0 tempo_decimi_sec = 0 fotocellula = OFF foto_precedente = OFF LED = OFF riscalda = OFF cicalino = OFF Ciclo ogni 100 ms (timer) – esecuzione time driven aspetta_timer_100ms ( ) Acquisizione degli ingressi fotocellula = acquisisci_foto( ) temperatura = acquisisci_temp ( ) Esegui le azioni cicliche azione 1 if (fotocellula == ON e foto_precedente == OFF) conta_oggetti++ azione 2 if (conta_oggetti modulo 10 == 0 e fotocellula == ON) cicalino = ON else cicalino = OFF azione 3 if (temperatura < SOGLIA) riscalda = ON else riscalda = OFF azione 4 if (temperatura < SOGLIA-10 e (tempo_decimi mod 10) < 6) LED = ON else LED = OFF Emetti valori in uscita emetti_suono (cicalino) emetti_luce (LED) emetti_caldo (riscalda) Aggiorna lo stato interno tempo_decimi = tempo_decimi + 1 foto_precedente = fotocellula Torna a ciclo 23 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Time driven Questo approccio, di tipo “polling”, è detto "guidato dal tempo" (time-driven) perchè tutte le azioni sono eseguite solo in base agli eventi temporali periodici ed indipendentemente dal verificarsi di altri eventi interni od esterni, che quindi giocano un ruolo passivo. Con l’approccio time-driven è dominante il concetto di stato e il comportamento del sistema di elaborazione è di tipo trasformazionale. Con questo approccio gli eventi esterni giocano un ruolo passivo, cioè non provocano direttamente nessuna azione, ma possono essere rilevati (se necessario) deducendoli dalle differenze di valori degli stati campionati in ingresso, rispetto ai valori campionati nel ciclo precedente. Le eventuali sincronizzazioni di operazioni con eventi esterni sono effettuate secondo la modalità a controllo di programma. Lo scheduling delle azioni è statico (off-line), dato che il programmatore, con la stesura del programma, decide la sequenza di esecuzione delle azioni collocandole nella loro posizione nell‟ambito del ciclo, e non viene quindi effettuata nessuna preemption. 24 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Time driven I pregi non trascurabili di questo approccio lo rendono interessante in molte semplici applicazioni e ne hanno fatto il modello di esecuzione tipico dei PLC (Programmable Logic Controller) -- Semplicità: il supporto "run-time" è costituito da un “sistema operativo” molto ridotto che si limita alle funzioni di lettura degli ingressi, scrittura delle uscite e alla gestione di un temporizzatore di attivazione ciclica del programma. -- Predicibilità: i tempi di esecuzione molto regolari rendono facile verificare se il fattore di utilizzazione del processore è < 1. U = TEi / Tp Condizione sufficiente perchè si possa adottare un approccio time-driven con un singolo processo ciclico è che sia TEi < Tp TEi è il tempo netto di esecuzione dell‟azione i-esima e Tp è il periodo di ciclo. Il tempo di risposta ad una variazione degli ingressi è Tp < Trisp < 2*Tp In questo caso per tempo di risposta si intende dopo quanto tempo i valori emessi in uscita risentono della variazione di qualche valore in ingresso. 25 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Multitasking Event-Driven In questa modalità di esecuzione multiprogrammata le azioni sono eseguite da processi (detti task o thread) che vengono attivati da eventi esterni o da eventi prodotti da altri processi, o da eventi temporali. Gli eventi assumono quindi un ruolo attivo Si parla in questo caso di comportamento reattivo del sistema di elaborazione, perchè al verificarsi di eventi il sistema reagisce con l‟acquisizione dei dati corrispondenti e con l‟esecuzione dei processi che producono le risposte a tali eventi. Poichè agli eventi sono associate delle informazioni (dati) questo approccio si può chiamare anche data-driven Le sincronizzazioni con gli eventi sono tipicamente basate sul meccanismo dell’interrupt. Evento -> sync 1° -> ISR -> sync 2° -> Processo Cioè da un evento con una sincronizzazione di primo livello si attiva l‟esecuzione di una routine di servizio (ISR) e da questa con una sincronizzazione di secondo livello si attiva l‟esecuzione del processo (task) che deve elaborare i dati ricevuti e fornire i risultati di risposta. Per garantire il rispetto di vincoli temporali occorre una opportuna politica di scheduling che assegni la CPU all‟esecuzione dei vari processi tenendo conto della loro priorità e delle loro scadenze temporali. Questo approccio richiede un sistema operativo più complesso dell‟approccio time-driven, ma è anche più generale, e può adottare accanto a dei task attivati da eventi anche alcuni task ciclici, cioè con esecuzione di tipo time-driven. 26 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Considerazioni sulle tecniche presentate L'approccio guidato dagli eventi costituisce il caso più generale (perchè è in grado di considerare eventi temporali, esterni e interni) può supportare al suo interno anche sottoinsiemi di attività impostate secondo gli schemi precedenti (processi time-driven), fornendo quindi la massima flessibilità progettuale anche se a costo di una problematica molto più articolata e complessa. In particolare un'applicazione complessa potrà comprendere: un sottoinsieme di attività cicliche di controllo e supervisione (trasformazionali) i cui vincoli temporali consistono sostanzialmente in una attivazione ciclica regolare, adatte ad una gestione di tipo time-driven; alcune attività di tipo reattivo a eventi sporadici e con vincoli temporali sui tempi di risposta, per cui è conveniente una gestione event-driven; attività di sottofondo senza particolari vincoli temporali che utilizzano in modo execution-driven i tempi lasciati liberi dalle attività precedenti. 27 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Modello a Processi Concorrenti I PROCESSI (Task e Thread) sono attività dotate di contesto (stato interno), che possono eventualmente condividere codice e parte dei dati, e che competono per l'uso di risorse condivise (CPU, ...) I processi sono caratterizzati da uno STATO ESTERNO, gestito dal S.O., che può essere: INESISTENTE Il processo non esiste nella memoria di lavoro, ma è presente solo come file nella memoria di massa. DORMIENTE (Sleeping) Il processo è presente nella memoria di lavoro, ma non è ancora stato dotato di un completo contesto di esecuzione (con stack, descrittore di processo, ecc.) PRONTO (Ready) in latenza Si è verificato un evento che richiede l‟esecuzione del processo, ma al momento la CPU è occupata nell‟esecuzione di un altro processo. IN ESECUZIONE (Running) Modo Utente Il processo è in esecuzione nelle istruzioni del programma applicativo (scritto dal programmatore progettista) Modo Sistema Il processo sta eseguendo istruzioni di sistema, in seguito ad una Supervisor Call = invocazione di servizio del sistema operativo. INTERROTTO (interrupted) in latenza La CPU sta eseguendo una ISR = Interrupt Service Routine come risposta ad una richiesta di interruzione mentre il processo era in esecuzione. IN ATTESA (Waiting) Il processo, per svolgere le prossime elaborazioni aspetta una scadenza temporale, oppure dei nuovi dati, oppure che una risorsa (ad es. la memoria di massa) si renda libera, ecc. SOSPESO (Suspended) Il processo non ha più elaborazioni da eseguire e quindi termina, oppure si è verificata una condizione di errore che ne impedisce il proseguimento, e quindi viene terminato di forza dal sistema operativo che è stato attivato dalla “trap” dell‟errore. 28 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira DIAGRAMMA DEGLI STATI DEI PROCESSI Caricamento in Memoria Inesistente Dormiente Creazione Preemption Occorrenza di un evento Pronto Assegnazione della CPU In esecuzione Ritorno da interruzione Utente Invocazione di primitiva Rit. da prim. non bloccante Interrotto Interruzione Sistema Rich. di sospensione 29 / 45 Rich. di attesa di risorsa o evento Eccezione fatale Sospeso In attesa d'evento Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Transizioni di Stato dei Processi CARICAMENTO IN MEMORIA Il codice eseguibile del processo viene scaricato dalla memoria di massa nella memoria di lavoro CREAZIONE Il sistema operativo “prende in carico” il processo, assegnandogli un descrittore (Task Control Block) che ne descrive le caratteristiche (nome, priorità, aree di memoria e risorse assegnate, ecc.) e l‟evoluzione attraverso i vari stati. ASSEGNAZIONE DELLA CPU Ogni volta che la CPU si rende libera lo scheduler sceglie a quale dei processi pronti assegnarla, portando così quel processo nello stato di esecuzione. INVOCAZIONE DI PRIMITIVA Quando un processo in esecuzione ha bisogno di servizi da parte del sistema operativo invoca la funzione (primitiva) corrispondente, quasi come un sottoprogramma. Se il servizio richiesto consiste nell‟assegnazione di una risorsa (ad es. un dato o una periferica) che al momento non è disponibile, la primitiva risulta “bloccante”. RITORNO DA PRIMITIVA NON BLOCCANTE Se il servizio richiesto con l‟invocazione di una primitiva può essere svolto subito, il sistema operativo ritorna poi il controllo al processo richiedente. INTERRUZIONE In occasione delle richieste di interruzione la CPU sospende l‟esecuzione del processo e passa ad eseguire la ISR (routine di servizio) che costituisce parte del sistema operativo. RITORNO DA INTERRUZIONE In generale terminata l‟esecuzione della ISR la CPU viene nuovamente assegnata all‟esecuzione del processo da dove era stato interrotto 30 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Transizioni di Stato dei Processi (seguito) PREEMPTION Nei sistemi operativi real-time è previsto che al termine di una ISR non si torni necessariamente ad eseguire il processo interrotto, ma se un processo più prioritario è nello stato “pronto” la CPU verrà ceduta a quest‟ultimo processo. La preemption corrisponde quindi alla “sottrazione” della CPU al processo che la stava usando prima dell‟interruzione. ECCEZIONE FATALE E‟ il verificarsi di una situazione erronea o comunque non risolvibile, che richiede la sospensione del processo interessato. RICHIESTA DI RISORSA O EVENTO Invocazione, da parte di un processo, di primitive con cui esso chiede al sistema operativo che gli venga assegnato l‟uso di una risosrsa o che il sistema operativo lo metta in esecuzione in seguito al verificarsi di un evento (tipica sincronizzazione di secondo livello). OCCORRENZA DI EVENTO ATTESO Quando si verifica un evento atteso da un processo (in attesa) o diventa disponibile una risorsa richiesta, il processo interessato viene messo dal sistema operativo nello stato di pronto. RICHIESTA DI SOSPENSIONE Quando un processo ha terminato definitivamente le sue elaborazioni e non verrà più richiesta la sua esecuzione, può venire collocato nello stato di sospeso. 31 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Scheduling Temporale Lo Scheduling è una funzione del Sistema Operativo che sceglie a quale processo assegnare il controllo della CPU 1. In seguito ad invocazione di primitive dal processo in esecuzione 2. In occasione di risposte ad interrupt (tipicamente da RTC = Real Time Clock) 1) – Scheduling non-preemptive (solo nel caso 1) - Riduce overhead e riduce i problemi di rientranza - Adatto per real-time lasco, per il quale un‟occasionale mancata deadline con un piccolo ritardo non costituisce un errore “catastrofico”. 2) – Scheduling preemptive - (nei casi 1 e 2) Gestione a priorità. Richiede: Protezione delle regioni critiche Accurata verifica della rientranza delle funzioni condivise (Librerie) Tutte le gestioni di interruzione devono essere gestite da S.O. Lo Scheduling preemptive è necessario per poter fornire prestazioni corrette con requisiti di tempo reale stretto. Infatti con la preemption si evita che un processo a bassa priorità possa monopolizzare la CPU, senza rilasciarla ai processi più prioritari che quindi mancano le loro deadline. Nota – La rientranza è la caratteristica di un sottoprogramma di poter essere eseguito correttamente anche quando venga invocato da diversi processi concorrenti. In caso di scheduling preemptive la rientranza è ovviamente una caratteristica essenziale per le funzioni di libreria che per loro natura sono destinate ad essere invocate dai vari processi applicativi. 32 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Algoritmi di Scheduling FIFO – attivazione in ordine cronologico I processi pronti vengono messi in coda e vanno in esecuzione (ricevono la CPU) nell‟ordine con cui sono diventati pronti (triggerati). Pro Semplicità e basso overhead Evita la starvation dei processi Contro Nessuna garanzia di Tempo Reale Non si privilegiano azioni urgenti FIXED PRIORITY - Processi con priorità statica Quando la CPU si libera viene assegnata a quello, tra i processi pronti, che ha la priorità più alta. La priorità di ogni processo viene assegnata come parametro costante dal progettista programmatore. Pro Semplicità Tiene conto di urgenza e importanza Contro Occorre attenta attribuzione delle priorità Le diverse azioni di un processo sono indifferenziate tra loro come urgenza Presenta il problema dell'inversione di priorità con l'uso di risorse condivise tra processi a diversa priorità EARLIEST DEADLINE FIRST - Priorità dinamica Dà la precedenza al processo con scadenza (deadline) più vicina. Tipico algoritmo per real-time Il S.O. deve conoscere le scadenze delle azioni SHORTEST SLACK - Priorità dinamica Dà la precedenza al processo meno dilazionabile La dilazionabilità (Laxity) è la differenza tra scadenza e tempo di esecuzione netto ancora mancante. Il S.O. deve conoscere le scadenze e i tempi di esecuzione netti 33 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Interruzioni: priorità e annidamento INTERRUZIONI NON ANNIDATE Nelle applicazioni più semplici non si ha annidamento delle interruzioni, cioè quando è in esecuzione una ISR gli interrupt sono disabilitati ed eventuali richieste pendenti, anche se più prioritarie, devono aspettare (latenza) il termine della ISR in esecuzione. Se non si gestisce l‟annidamento delle interruzioni l’efficacia della priorità di un canale di interrupt per ridurne il tempo di latenza è molto ridotta. INTERRUZIONI ANNIDATE L‟annidamento delle interruzioni consiste nella gestione delle risposte organizzata in modo che all‟arrivo di una richiesta più prioritaria di quella in corso, quest‟ultima venga a sua volta interrotta per passare all‟esecuzione della nuova ISR più prioritaria, terminata la quale si torna a completare quella che era stata interrotta. Con le interruzioni annidate si ottiene l‟effetto di avere la latenza massima delle richieste di interruzione dei vari canali decrescente con la loro priorità. Questo aspetto è molto importante nelle applicazioni con vincoli temporali. CON preemption TUTTI i vettori di interrupt DEVONO passare attraverso la gestione del Sistema Operativo NOTA – La priorità ha lo scopo di ridurre la latenza di esecuzione di azioni più prioritarie a scapito dell‟aumento della latenza di altre azioni (meno prioritarie) 34 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira INTERRUZIONI ANNIDATE PROCESSO IN ESECUZIONE SISTEMA OPERATIVO ISR DI GESTIONE INTERRUPT CODICE APPLICATIVO ISRi specifica del canale i-esimo - interrupt -> Maschera livelli (HW) pari e inferiori Nesting = Nesting + 1 if Nesting = 1 then Salva contesto Processo Assume contesto Sistema else Salva registri Enable Interrupt - Call ----------------------------------> Individua causa Rimuove causa Servizio Indicatori o segnali <-------------------------------- Ret --Disable Interrupt End Of Interrupt Nesting = Nesting - 1 if Nesting > 0 then Ripristina registri Enable Interrupt <--------------------------- Ritorno else Scheduling (preemption) 35 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Competizione e Cooperazione Tra processi COMPETIZIONE Tipica di ambienti GESTIONALI e MULTIUTENTE Diversi JOB svolgono compiti scorrelati tra loro Si tende ad evitare le interferenze tra i Job Le PRIMITIVE di coordinamento tra attività sono generalmente invocate internamente ai servizi del Sistema Operativo COOPERAZIONE Tipica delle applicazioni di AUTOMAZIONE e CONTROLLO Diversi TASK concorrono ad una funzionalità organica Le Interferenze tra i Task sono evitate per ottenere correttezza, ma sono facilitate le interazioni tra processi Le PRIMITIVE di sincronizzazione e comunicazione sono invocate anche direttamente dai processi applicativi 36 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Primitive di S.O. Real-Time Le primitive sono delle funzioni, come dei sottoprogrammi messi a disposizione dal Sistema Operativo per svolgere i servizi utili per una corretta ed efficiente esecuzione dei processi. Le invocazioni di primitive sono anche dette supervisor call. Le primitive possono essere: Invocate esplicitamente dai processi Invocate da istruzioni macchina generate dai compilatori nella traduzione di costrutti di alto livello Invocate all‟interno di funzioni di libreria L‟esecuzione delle primitive costituisce un'occasione perchè il S.O. possa svolgere le sue funzioni di gestione dell‟esecuzione dei vari processi, e non solo di quello che ha in quel momento invocato la primitiva. L'altra occasione in cui il S.O. prende il controllo dell‟esecuzione è costituita dalle risposte ad interruzioni, in cui le ISR sono in realtà “parti” del S.O. stesso. Sono dette bloccanti le primitive che possono portare allo stato di attesa il processo invocante e attivare un altro processo Nel seguito vengono elencate le principali primitive per la gestione dei processi in ambiente di esecuzione multiprogrammata. Dato che ogni sistema operativo adotta specifici identificatori per le sue primitive, nel seguito si utilizzano dei nomi mnemonici che richiamano i significati delle primitive stesse. 37 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Primitive per Servizi Generali CREATE (task) Porta un processo dallo stato dormiente a pronto, allocandogli un contesto con descrittore dinamico, con i parametri: priorità, entry point, ampiezza di stack SUSPEND (task) Porta un processo nello stato sospeso ENINT (channel, ISR) Abilita un livello di interruzione e gli associa una specifica routine di servizio applicativo, con visibilità sul contesto del processo invocante che ne diventa proprietario DISINT (channel) Disabilita un livello di interruzione di cui il processo invocante è proprietario 38 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Primitive di Temporizzazione ABS_WAIT (abs_time) Attesa a tempo assoluto. - Risveglia il processo invocante quando t = abs_time REL_WAIT (rel_time) Attesa a tempo relativo - Risveglia il processo invocante dopo un intervallo pari a rel_time CYC_WAIT (period) Attesa di tempo ciclico - Riattivazione periodica dopo ogni intervallo pari a period .....T_OUT (...., tout_time)Associa ad altre attese una scadenza di Time_Out La variante con “time-out” si applica ad altre primitive di “attesa”. In questo caso se l‟evento atteso non si verifica entro il tempo massimo di time-out il processo viene comunque messo nello stato di pronto e riceve l‟informazione che non si è verificato l‟evento atteso, ma è scaduto il tempo. Usata quando il mancato verificarsi di un evento rappresenta una situazione anomala che il processo deve gestire, e per fare ciò deve essere ovviamente attivato. 39 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Primitive di Sincronizzazione WAIT (Semaphore [, t_out]) Attesa su un semaforo con eventuale t_out Si dice semaforo una variabile indicatrice di eventi verificati. Si possono adottare diverse semantiche per gli eventi sul semaforo: Eventi volatili – L‟evento viene acquisito solo se quando si verifica c‟è un processo che ha chiesto al S.O. di aspettarlo, altrimenti l‟evento viene scartato. Eventi persistenti binari – Il semaforo è un tipico indicatore a due stati. TRUE significa che si è verificato uno o più eventi non ancora gestiti. FALSE significa che tutti gli eventuali eventi precedenti sono stati gestiti e non c‟è nulla di nuovo. Eventi persistenti a conteggio (= Risorse) – Il semaforo è gestito come un contatore di eventi ancora da trattare. Se è maggiore di zero indica quanti eventi si sono verificati e non sono ancora stati gestiti. SIGNAL (Semaphore) Produce un evento sul semaforo 40 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Primitive di Comunicazione Costituiscono un'estensione delle primitive di sincronizzazione, cui è associato un trasferimento di informazioni per realizzare il rapporto PRODUTTORE CONSUMATORE Con accodamento di Messaggi In genere le code sono realizzate con liste dinamiche a gestione FIFO. SEND_MESS (message, queue) Accoda il messaggio message nella coda queue, senza attendere che il processo consumatore riceva il messaggio dalla coda di attesa. RECEIVE_MESS (queue, message [,tout]) Il processo riceve il primo messaggio nella coda queue, eventualmente attendendo che ne arrivi uno. Spesso è precisato un Time-Out, cioè il massimo tempo che il processo è disposto ad aspettare. Con deposito di singoli caratteri su Buffer Circolare. In genere il buffer circolare è un array di dimensione DIM in cui l‟indice di accesso all‟elemento di deposito e l‟indice di accesso all‟elemento di consumo vengono incrementati “modulo DIM” PUT_CHAR (char, buffer [,tout]) Inserisce il carattere char nel buffer (circolare) se c'è posto, altrimenti il processo viene messo nello stato di attesa (attende che si liberi un posto, eventualmente con il tempo limite tout). GET_CHAR (buffer, char [,tout]) Attende, eventualmente con time-out, che ci sia un carattere nel buffer (circolare). 41 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Descrittore Dinamico di Processo E‟ una struttura di tipo record, spesso chiamata TCB = Task Control Block, associata ad ogni processo all'atto della sua creazione e che descrive l'evoluzione del processo. Si noti che ogni sistema operativo multitasking adotta una propria struttura di descrittore dei processi. Alcuni campi tipici di queste strutture sono presentati nel seguito. STATO DEL PROCESSO Lo stato può essere descritto in vari modi, con l'accodamento del TCB in code di attesa di eventi o risorse. con un indicatore di stato corredato con l'indicazione di quale evento è atteso dal processo, e se con time-out. TEMPO DA ATTENDERE Indica il tempo di attesa rimanente per le attese temporizzate o con time-out. Talvolta si adottano variabili distinte per le attese di scadenze temporali o le scadenze di time-out, eventualmente con diverse granularità temporali INIZIO STACK Indica l‟indirizzo di confine dell‟area di memoria di lavoro dedicata allo stack del processo. Non necessario, ma utile in sede di debug (verifica di stack overflow). STACK POINTER In questo campo viene salvato il contenuto del registro stack pointer quando il processo non è in esecuzione. E' la parte minima di contesto che non può venire salvata sullo stack 42 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira RISORSE Indica le risorse allocate al processo Tra le risorse ci possono essere: - messaggi ricevuti - code private - aree di memoria - vettori di interrupt - file in uso - periferiche condivise La descrizione delle risorse serve per: - verificare i diritti di accesso - realizzare particolari protocolli di scheduling che tengano conto dell‟impiego delle risorse - effettuare i necessari rilasci di risorse in caso di terminazione o sospensione del processo TEMPO DI ESECUZIONE Contatori del tempo che il processo trascorre in esecuzione usati per: - una valutazione del tempo di CPU mediamente utilizzato dal processo, - la gestione di un eventuale time-slicing per i processi, che prevede di mettere nello stato di pronto il processo in esecuzione che superi il tempo (time-slice) ad esso concesso - il calcolo del tempo di esecuzione residuo (per politica di scheduling con minimum slack) PRIORITA' Usata dallo scheduler per decidere l‟assegnazione della CPU ai processi. Può essere prevista una eventuale modifica dinamica della priorità - i processi possono chiedere che la priorità venga aumentata o diminuita in base all'importanza o urgenza delle azioni che devono eseguire; - lo scheduler può cambiare la priorità quando si adottano particolari politiche di scheduling, come earliest deadline first. - il sistema operativo cambia dinamicamente la priorità per limitare l'inversione di priorità tra processi 43 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira Appendice - Glossario FUNZIONE COMBINATORIA - Una funzione il cui risultato dipende solo dagli ingressi (o dai parametri). FUNZIONE SEQUENZIALE - In contrapposizione a combinatoria. Una funzione il cui risultato dipende non solo dagli ingressi, ma anche dall’evoluzione precedente (storia). Questo tipo di funzioni deve essere dotato di un proprio stato basato su variabili statiche, che contiene l’informazione significativa sulla storia. VARIABILI AUTOMATICHE - Sono variabili locali (nel record di attivazione) di sottoprogrammi, la cui vita termina con il termine dell’esecuzione del sottoprogramma e quindi non mantengono il loro valore tra una chiamata e l’altra, ma anzi devono venire inizializzate ogni volta. VARIABILI STATICHE - Sono variabili (eventualmente anche locali di sottoprogrammi) che mantengono il loro valore anche tra una chiamata e l’altra. Sono necessarie perchè un sottoprogramma possa avere una sua storia interna (sia sequenziale, in contrapposizione a combinatorio). STACK - Area di memoria, con gestione LIFO, associata ad ogni processo, in cui possono essere temporaneamente salvati i registri, gli indirizzi di ritorno da sottoprogrammi o da interruzioni e in cui possono essere allocati i record di attivazione dei sottoprogrammi con il relativo spazio per parametri e variabili locali automatiche. HEAP - Area di memoria globale di un’applicazione, quindi accessibile da tutti i suoi processi, porzioni della quale vengono associate a dei puntatori mediante opportune funzioni (malloc()). RISORSA - Entità interna (variabile, area dello heap, sottoprogramma) o esterna (unità periferica) che un processo può utilizzare (risorse passive) come lettore o come lettore-e-scrittore. Un caso particolare di risorsa attiva è costituito dalla CPU. CONDIVISIONE STRETTA - Situazione in cui una risorsa viene utilizzata da un processo mentre il suo uso da parte di altri processi non è ancora terminato. CONDIVISIONE LASCA - Situazione in cui una risorsa può essere usata da diversi processi, ma solo da uno alla volta. RIENTRANZA - Proprietà di un sottoprogramma di poter essere interrotto e richiamato, mantenendo la correttezza di esecuzione per ogni sua istanza. Si ottiene facendo in modo che ogni istanza possa modificare solo variabili non condivise con altre istanze. Consente la condivisione stretta del sottoprogramma. La rientranza pone vincoli più restrittivi della ricorsione, dato che deve poter gestire correttamente l’interruzione in qualsiasi punto (asincrona) del sottoprogramma, e non solo in occasione di un ben preciso punto (sincrona) di chiamata ricorsiva. CONCORRENZA - Parallelismo virtuale tra processi (attività) le cui azioni possono essere effettuate in modo intercalato le une tra le altre. COOPERAZIONE - Rapporto tra processi (thread) che correlano le loro azioni in modo da perseguire correttamente un obbiettivo comune (es. automazione di una macchina). COMPETIZIONE - Rapporto tra processi (thread e task) che condividono delle risorse e quindi devono correlare le loro azioni in modo da non interferire tra loro, ed evitando così di compromettere la correttezza delle rispettive elaborazioni. 44 / 45 Fondamenti di informatica – Esecuzione parallela Lorenzo Mezzalira TEMPORIZZAZIONE - Meccanismo tramite cui si fa in modo che l’esecuzione di un’azione sia correlata con istanti temporali assoluti, o avvenga a distanza temporale relativa rispetto ad un altro evento. SINCRONIZZAZIONE STRETTA - Meccanismo che assicura un ordinamento tra le azioni di due processi. Ad esempio l’azione B1 potrà essere eseguita solo se l’azione A1 è completata e l’azione A2 a sua volta sarà eseguita solo dopo B1. SINCRONIZZAZIONE LASCA - Meccanismo tramite cui si assicura un parziale ordinamento temporale tra azioni. Cioè ad esempio si garantisce che l’azione B1 non sia eseguita prima che l’azione A1 sia completata, ma nel frattempo possono essere eseguite anche le azioni A2, A3, ecc.. MUTUA ESCLUSIONE - Tecnica adottata per rendere atomiche (non interrompibili) sequenze di operazioni che operano su risorse non accessibili contemporaneamente, come ad es. i sottoprogrammi non rientranti, per cui è corretta solo una condivisione lasca. DEADLOCK - (Stallo, blocco critico) Situazione in cui due o più processi non possono più evolvere perchè ognuno blocca parte delle risorse necessarie agli altri. STARVATION - Situazione in cui un processo può essere impedito dal proseguire nell’esecuzione per un tempo non limitato, perchè le risorse di cui necessita gli vengono continuamente sottratte da altri processi. PRIMITIVA - Funzione del sistema operativo, che i processi invocano ed eseguono nel modo sistema, nell’ambito della cui esecuzione il sistema operativo svolge le sue funzioni, ma che è vista come operazione elementare dal processo applicativo. PRODUTTORE-CONSUMATORE - Ogni informazione generata dal processo produttore viene successivamente utilizzata, nello stesso ordine, dal processo consumatore. Richiede sincronizzazione per ottenere il parziale ordinamento temporale tra le azioni di produzione e di consumo, con eventuale accodamento FIFO se la sincronizzazione è lasca. Le informazioni sono viste come eventi incrementali. Se le variabili utilizzate per comunicare le informazioni non sono accessibili ad entrambi i processi è necessaria un’operazione di copiatura a carico del S.O. SCRITTORE-LETTORI - Un insieme di variabili è considerato rappresentativo di uno stato che può essere modificato da un processo scrittore ed utilizzato da più processi lettori. Ogni modifica dei valori da parte del processo scrittore costituisce un evento assoluto, che deve essere reso atomico eventualmente con mutua esclusione. Non è necessario alcun ordinamento temporale tra i vari accessi in lettura o scrittura. Le variabili devono essere accessibili direttamente da tutti i processi interessati. CLIENT-SERVER - I processi Client producono eventi di richiesta di servizi diretti al Server in grado di svolgere tali servizi. Il processo Server a sua volta produrrà eventi di esito del servizio svolto, diretti al Client che l’aveva richiesto. FARMER-WORKERS - Il processo Farmer svolge il ruolo di coordinatore di attività le cui azioni possono essere eseguite in parallelo, affidandone l’esecuzione a diversi processi Worker. Il Farmer funge quindi da distributore di dati e collettore di risultati. Questo approccio è significativo in sistemi con parallelismo fisico, in cui i processi Worker risiedano su diversi processori. 45 / 45