Concorrenza (informatica): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
ZéroBot (discussione | contributi)
m r2.7.1) (Bot: Aggiungo ro:Concurența datelor (Informatică)
Xqbot (discussione | contributi)
m r2.7.3) (Bot: Modifico ro:Concurență (informatică); modifiche estetiche
Riga 1:
In [[informatica]] la '''concorrenza''' è una caratteristica dei sistemi nei quali può verificarsi che un insieme di [[Processo_Processo (informatica)|processi]] computazionali sia in esecuzione nello stesso istante. Tale sistema viene appunto chiamato '''sistema a concorrenza''' o '''sistema concorrente'''. L'esecuzione parallela può condurre a interazione tra processi quando viene coinvolta una risorsa condivisa.
 
Un'importante classe di sistemi informatici nei quali gli aspetti di concorrenza sono fondamentali è quella dei [[sistema operativo|sistemi operativi]].
 
[[ImmagineFile:Dining philosophers.png|thumb|200px|Il problema dei cinque filosofi a cena, un classico problema inerente concorrenza e condivisione di risorse]]
== Introduzione ==
Il concetto di concorrenza è contrapposto a quello di sequenzialità. In un sistema sequenziale i processi vengono eseguiti uno per volta e non si verifica alcuna forma di interazione tra essi durante l'esecuzione.
Riga 15:
Dato che in un sistema concorrente la varietà di interazioni che si possono verificare tra processi in esecuzione è notevole, sono state elaborate delle teorie in merito alla gestione delle problematiche connesse alla concorrenza. Sulla base di queste teorie sono state sviluppate sia delle tecniche di [[programmazione]] ([[programmazione concorrente]]) sia dei [[linguaggio di programmazione|linguaggi]] che integrano nativamente primitive per la corretta gestione della concorrenza.
 
== Problematiche ==
La concorrenza può portare ad una serie di problematiche legate all'utilizzo di una stessa [[Risorsa informatica|risorsa]] condivisa da parte di più processi. Un determinato susseguirsi di eventi può causare condizioni critiche. La [[Programmazione (informatica)|programmazione]] concorrente sfrutta alcuni principi per fronteggiare e risolvere questo tipo di problematiche.
 
* '''Corse critiche (Race Conditions)'''<br />In alcuni sistemi può accadere che i processi in esecuzione condividano una risorsa comune di qualsiasi natura (sia essa un'area di memoria condivisa o una periferica). In particolare se si verifica che il risultato finale dell'esecuzione di più processi dipende dall'ordine in cui essi vengono eseguiti, questa è una ''condizione di corsa critica'' (race condition). Il risultato dell'esecuzione nel caso di corse critiche è assolutamente impredicibile.
Il problema delle "corse critiche" può essere evitato impedendo che più di un processo per volta acceda a risorse condivise. Con la '''mutua esclusione''' si evita che più processi che contendono una risorsa riescano ad accedervi contemporaneamente.
 
* '''Stallo (Deadlock)'''<br />Quando ad un processo viene garantito l'accesso esclusivo (ad esempio tramite una mutua esclusione) ad una risorsa, possono crearsi situazioni di stallo. Formalmente un insieme di processi è in stallo (deadlock) quando ogni processo dell'insieme attende un evento che può avvenire soltanto tramite un altro processo dell'insieme. Essendo tutti i processi in attesa, nessuno potrà mai creare l'evento di sblocco protraendo l'attesa all'infinito. Le tecniche per individuare situazioni di stallo prevedono l'analisi di grafi delle risorse allocate oppure mediante la creazione di cosiddette "matrici di allocazione". La risoluzione degli stalli può essere affrontata in vari modi. Concettualmente si possono suddividere in:
** '''Risoluzione mediante prerilascio''': viene scelto un processo che detiene una risorsa dall'insieme dei processi in stallo e viene tolto l'accesso esclusivo (prerilascio o preemption) ad una risorsa condivisa (causa di stallo). L'operazione è talvolta difficile, talvolta impossibile e dipende dal tipo di risorsa che il processo stava bloccando.
** '''Risoluzione mediante punto di controllo''': vengono creati dei registri (checkpoint) che descrivono lo stato di utilizzo delle risorse condivise. Quando viene rilevato uno stallo si effettua un "ritorno" (rollback to checkpoint) alle condizioni precedenti. Anche questa tecnica è di difficile o addirittura impossibile realizzazione poiché il ritorno potrebbe causare perdita o inconsistenza di dati.
Riga 30:
Tutte le tecniche prevedono la costruzione di matrici che tengono traccia dell'utilizzo delle risorse (matrici di traiettoria di risorse) o si basano su algoritmi noti come l'algoritmo del banchiere.
 
* '''Starvation'''<br />Letteralmente inedia, è un problema in stretta relazione con lo stallo. Quando le politiche di assegnazione delle risorse condivise favoriscono un processo rispetto ad un altro, il processo a cui vengono assegnate in minor misura soffre di starvation. Esso è infatti bloccato e non può proseguire sebbene non si trovi in una condizione di stallo. Nei sistemi in cui si accede a risorse condivise è sempre necessario stabilire una politica per le priorità e l'ordine con cui esse vengono ripartite. Sebbene queste politiche possano risultare quanto più eque, esse possono portare a condizioni di starvation.
 
== Comunicazione interprocesso ==
Nell'ambito della programmazione concorrente la comunicazione interprocesso ('''IPC''' o '''InterProcess Communication''') è di fondamentale importanza per gestire correttamente possibili situazioni di accesso a risorse condivise. I sistemi concorrenti mettono a disposizione delle primitive di comunicazione che permettono di alternarsi (escludendosi a vicenda) nell'accesso ad una risorsa condivisa oltre a primitive di sincronizzazione che permettono di intervenire sulla sequenza secondo la quale avverranno determinati eventi. Ogni sistema concorrente implementa e mette a disposizione le proprie primitive, ma nonostante ciò i sistemi si rifanno ad una base teorica comune. Per questo è possibile creare una panoramica d'insieme.
 
Riga 54:
È evidente che tutte le primitive di comunicazione e sincronizzazione intraprocesso debbano rispettare questa condizione di atomicità.
 
== Problemi classici ==
Esiste una serie di problemi classici nella programmazione concorrente. Essi vengono utilizzati per dimostrare l'efficienza di determinate teorie od algoritmi e forniscono una base comune per potere effettuare dei paragoni.
Tra quelli più famosi si elencano:
Riga 71:
== Bibliografia ==
; Testi di approfondimento
* {{Cita libro
|autore = Paolo Ancilotti, Maurelio Boari
|titolo = Programmazione concorrente e distribuita
Riga 84:
* [[Pi calculus]]
 
== Collegamenti esterni ==
{{en}} [http://www.mines.edu/fs_home/tcamp/baci/ Simulatore]
 
Riga 98:
[[ms:Keserentakan (sains komputer)]]
[[pt:Concorrência (informática)]]
[[ro:Concurența datelorConcurență (Informaticăinformatică)]]
[[ru:Параллелизм (компьютерные науки)]]
[[sq:Njëkohësisht (shkenca kompjuterike)]]