Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Vai al contenuto

Mutex: differenze tra le versioni

Da Wikipedia, l'enciclopedia libera.
Contenuto cancellato Contenuto aggiunto
FrescoBot (discussione | contributi)
m Bot: piping superfluo nei wikilink
m fix wl
 
(47 versioni intermedie di 38 utenti non mostrate)
Riga 1: Riga 1:
{{nota disambigua|l'omonimo concetto in biologia|Mutua esclusione (biologia)|Mutua esclusione}}
In [[informatica]] il termine '''mutex''' (contrazione dell'[[Lingua inglese|inglese]] '''''mut'''ual '''ex'''clusion'', '''mutua esclusione''') indica un procedimento di [[Sincronizzazione (informatica)|sincronizzazione]] fra [[Processo (informatica)|processi]] o [[thread]] concorrenti, con il quale si impedisce che più task paralleli accedano contemporaneamente ai [[dati]] in [[Memoria (informatica)|memoria]] o ad altre risorse soggette a [[race condition]] (o ''corsa critica''). Questo concetto riveste importanza fondamentale nella [[programmazione]] parallela e soprattutto per i [[Sistema (informatica)|sistemi]] di [[Transazione (database)|transazione]].
{{F|informatica|novembre 2024}}


In [[informatica]] un '''mutex''' (contrazione dell'[[Lingua inglese|inglese]] '''''mut'''ual '''ex'''clusion'', {{lett|mutua esclusione}}) è un [[oggetto (informatica)|oggetto virtuale]] utilizzato per implementare l'omonimo meccanismo di [[sincronizzazione dei processi|sincronizzatione tra processi]] che [[concorrenza (informatica)|concorrono]] per l'utilizzo di una [[risorsa di sistema|risorsa]] condivisa.
== Condizioni ==
Affinché sia possibile la mutua esclusione occorrono 4 condizioni:
# un solo processo o thread accede alla regione critica;
# nessuna assunzione sulla velocità dei processi;
# nessun processo fuori dalla sezione critica può impedire ad un altro di entrare;
# accesso alla sezione critica consentito in un tempo definito.


Questo concetto riveste importanza fondamentale nella [[Calcolo parallelo|programmazione parallela]] e soprattutto nei [[Online transaction processing|sistemi transazionali]].
== Tecnica ==

Per realizzare l'esclusione reciproca si assegna ad un [[Oggetto (informatica)|oggetto]] o porzione di [[Programma (informatica)|programma]] ([[sezione critica]]) un elemento che va sempre controllato prima che un processo o thread possa eseguire istruzioni sull'oggetto stesso. Se un processo o thread sta già accedendo all'oggetto, tutti i successivi devono aspettare che il primo finisca.
== Descrizione ==
Gli oggetti mutex utilizzati per coordinare processi diversi devono essere di per sé accessibili a tutti i processi coinvolti, il che implica necessariamente l'uso di memoria condivisa, oppure gestita direttamente dal [[sistema operativo]].
Per realizzare l'esclusione mutua si assegna a un [[Oggetto (informatica)|oggetto]] o porzione di [[Programma (informatica)|programma]] ([[sezione critica]]) un elemento che va sempre controllato prima che un altro processo o thread possa eseguire istruzioni sull'oggetto stesso. Se un processo o thread sta già accedendo all'oggetto, tutti gli altri devono aspettare che il primo finisca. Gli oggetti mutex utilizzati per coordinare processi diversi devono essere di per sé accessibili a tutti i processi coinvolti, il che implica necessariamente l'uso di memoria condivisa, oppure gestita direttamente dal [[sistema operativo]].

Per realizzare ciò, la procedura di utilizzo di una [[risorsa critica]] deve essere strutturata nelle seguenti fasi:

# Richiesta
# Sezione Critica
# Rilascio

All'avvio, mediante la fase di richiesta, il [[processo (informatica)|processo]] verifica se un altro processo sta utilizzando la [[sezione critica]]. Al termine, mediante la fase di rilascio, il processo segnala che la risorsa critica utilizzata è libera e dunque utilizzabile da un altro processo.

Affinché sia possibile la mutua esclusione occorrono sei condizioni:
# un solo [[Processo (informatica)|Processo]] o [[Thread (informatica)|Thread]] accede alla sezione critica;
# nessun processo può bloccarsi in sezione critica;
# non ci sono [[deadlock|deadlock (stallo)]] e [[starvation]];
# non viene fatta nessuna assunzione sulla velocità dei processi;
# nessun processo fuori dalla sezione critica può impedire a un altro di entrare;
# l'accesso alla sezione critica è consentito in un tempo definito.


== Implementazioni ==
== Implementazioni ==
L'[[implementare|implementazione]] più comune dei mutex fa uso di [[Monitor (sincronizzazione)|monitor]], ma lo stesso risultato si può ottenere anche per mezzo di semplici [[lock]] o [[Semaforo (informatica)|semafori]]. È spesso possibile migliorare la tecnica di accesso con l'ausilio di lock read/write che consentono un numero illimitato di accessi in lettura ma uno solo in scrittura. Questa tecnica è impiegata soprattutto per regolare l'accesso ai [[file]] e alle [[Database|banche dati]].
L'[[implementare|implementazione]] più comune dei mutex fa uso di [[Monitor (sincronizzazione)|monitor]], ma lo stesso risultato si può ottenere anche per mezzo di semplici [[lock]] o [[Semaforo (informatica)|semafori]]; un mutex può essere visto come caso particolare di semaforo inizializzato a uno. Spesso è possibile migliorare la tecnica di accesso con l'ausilio di lock read/write che consentono un numero illimitato di accessi in lettura e uno solo in scrittura. Questa tecnica è impiegata soprattutto per regolare l'accesso ai [[file]] e alle [[Database|banche dati]].


Per implementare un mutex in maniera efficiente è necessario che il sistema operativo offra uno [[scheduler]] adatto. Senza questa predisposizione, ed in particolare su molti [[Sistema operativo real-time|sistemi operativi real-time]], bisogna ricorrere a [[spinlock]] che però riducono l'efficienza del [[multitasking]] poiché utilizzano il [[processore]] durante le attese.
Per implementare un mutex in maniera efficiente è necessario che il sistema operativo offra uno [[scheduler]] adatto. Senza questa predisposizione, e in particolare su molti [[Sistema operativo real-time|sistemi operativi real-time]], bisogna ricorrere a [[spinlock]] che purtroppo riducono l'efficienza del [[multitasking]] poiché utilizzano il [[processore]] durante le attese.


== Supporto ==
=== Supporto ===
Alcuni [[linguaggi di programmazione]] offrono la tecnica mutex come parte del linguaggio stesso, in particolare [[Ada (lnguaggio)|Ada]], [[Java (linguaggio)|Java]] e i [[Microsoft .NET#Linguaggi_di_programmazione_.NET|linguaggi di programmazione .NET]]. Per quasi tutti gli altri linguaggi esistono [[Libreria software|librerie]] che implementano il sistema mutex. Questo può essere integrato come parte dell'[[Application programming interface|API]] o dell'[[Ambiente (programmazione)|ambiente]] [[runtime]].
Alcuni [[linguaggi di programmazione]] offrono la tecnica mutex come parte del linguaggio stesso, in particolare [[Rust (linguaggio di programmazione)|Rust]], [[Ada (linguaggio)|Ada]], [[Java (linguaggio di programmazione)|Java]] e i [[Microsoft .NET#Linguaggi di programmazione .NET|linguaggi di programmazione .NET]]. Per quasi tutti gli altri linguaggi esistono [[Libreria software|librerie]] che implementano il sistema mutex. Questo può essere integrato come parte dell'[[Application programming interface|API]] o dell'[[Ambiente (programmazione)|ambiente]] [[runtime]].


== Problematiche ==
== Problemi ==
L'esclusione reciproca comporta il rischio di [[deadlock]], situazione in cui più task si bloccano vicendevolmente e nessuno può più proseguire ([[starvation]]). Il [[problema dei filosofi a cena]] è un esempio di questa circostanza. Esistono [[Algoritmo|algoritmi]] speciali per raggirare questo inconveniente ([[algoritmo di Peterson]], [[algoritmo di Dekker]]) che si può facilmente evitare ponendo cura alla programmazione.
L'esclusione reciproca comporta il rischio di [[deadlock]], situazione in cui più task si bloccano vicendevolmente e nessuno può più proseguire ([[starvation]]). Il [[problema dei filosofi a cena]] è un esempio di questa circostanza. Esistono [[Algoritmo|algoritmi]] speciali per aggirare questo inconveniente ([[algoritmo di Peterson]], [[algoritmo di Dekker]]) che si può facilmente evitare ponendo cura alla programmazione.


== Voci correlate ==
== Voci correlate ==

* [[Controllo della concorrenza]]
* [[Controllo della concorrenza]]
* [[Algoritmo del biglietto]]
* [[Algoritmo del biglietto]]
* [[:Categoria:Algoritmi di mutua esclusione]]


== Collegamenti esterni ==
== Collegamenti esterni ==
* {{FOLDOC|mutual exclusion|mutual exclusion}}
* [https://web.archive.org/web/20050818030945/http://www.disi.unige.it/person/GianuzziV/SysOp/lucidi/13_mutua.html Mutua Esclusione Distribuita] ([[Sito web|sito]] dell'[[Università degli Studi di Genova|università di Genova]])


{{Controllo di autorità}}
* [http://www.disi.unige.it/person/GianuzziV/SysOp/lucidi/13_mutua.html Mutua Esclusione Distribuita] ([[Sito web|sito]] dell'[[Università degli Studi di Genova|università di Genova]])
{{Portale|informatica}}

[[Categoria: Controllo della concorrenza]]


[[Categoria:Controllo della concorrenza]]
[[de:Mutex]]
[[en:Mutual exclusion]]
[[es:Exclusión mutua (informática)]]
[[fr:Exclusion mutuelle]]
[[ja:排他制御]]
[[ko:상호 배제]]
[[pl:Mutex]]
[[pt:Exclusão mútua]]
[[ru:Мьютекс]]
[[uk:М'ютекс]]

Versione attuale delle 19:00, 19 nov 2024

Disambiguazione – "Mutua esclusione" rimanda qui. Se stai cercando l'omonimo concetto in biologia, vedi Mutua esclusione (biologia).

In informatica un mutex (contrazione dell'inglese mutual exclusion, lett. "mutua esclusione") è un oggetto virtuale utilizzato per implementare l'omonimo meccanismo di sincronizzatione tra processi che concorrono per l'utilizzo di una risorsa condivisa.

Questo concetto riveste importanza fondamentale nella programmazione parallela e soprattutto nei sistemi transazionali.

Per realizzare l'esclusione mutua si assegna a un oggetto o porzione di programma (sezione critica) un elemento che va sempre controllato prima che un altro processo o thread possa eseguire istruzioni sull'oggetto stesso. Se un processo o thread sta già accedendo all'oggetto, tutti gli altri devono aspettare che il primo finisca. Gli oggetti mutex utilizzati per coordinare processi diversi devono essere di per sé accessibili a tutti i processi coinvolti, il che implica necessariamente l'uso di memoria condivisa, oppure gestita direttamente dal sistema operativo.

Per realizzare ciò, la procedura di utilizzo di una risorsa critica deve essere strutturata nelle seguenti fasi:

  1. Richiesta
  2. Sezione Critica
  3. Rilascio

All'avvio, mediante la fase di richiesta, il processo verifica se un altro processo sta utilizzando la sezione critica. Al termine, mediante la fase di rilascio, il processo segnala che la risorsa critica utilizzata è libera e dunque utilizzabile da un altro processo.

Affinché sia possibile la mutua esclusione occorrono sei condizioni:

  1. un solo Processo o Thread accede alla sezione critica;
  2. nessun processo può bloccarsi in sezione critica;
  3. non ci sono deadlock (stallo) e starvation;
  4. non viene fatta nessuna assunzione sulla velocità dei processi;
  5. nessun processo fuori dalla sezione critica può impedire a un altro di entrare;
  6. l'accesso alla sezione critica è consentito in un tempo definito.

Implementazioni

[modifica | modifica wikitesto]

L'implementazione più comune dei mutex fa uso di monitor, ma lo stesso risultato si può ottenere anche per mezzo di semplici lock o semafori; un mutex può essere visto come caso particolare di semaforo inizializzato a uno. Spesso è possibile migliorare la tecnica di accesso con l'ausilio di lock read/write che consentono un numero illimitato di accessi in lettura e uno solo in scrittura. Questa tecnica è impiegata soprattutto per regolare l'accesso ai file e alle banche dati.

Per implementare un mutex in maniera efficiente è necessario che il sistema operativo offra uno scheduler adatto. Senza questa predisposizione, e in particolare su molti sistemi operativi real-time, bisogna ricorrere a spinlock che purtroppo riducono l'efficienza del multitasking poiché utilizzano il processore durante le attese.

Alcuni linguaggi di programmazione offrono la tecnica mutex come parte del linguaggio stesso, in particolare Rust, Ada, Java e i linguaggi di programmazione .NET. Per quasi tutti gli altri linguaggi esistono librerie che implementano il sistema mutex. Questo può essere integrato come parte dell'API o dell'ambiente runtime.

L'esclusione reciproca comporta il rischio di deadlock, situazione in cui più task si bloccano vicendevolmente e nessuno può più proseguire (starvation). Il problema dei filosofi a cena è un esempio di questa circostanza. Esistono algoritmi speciali per aggirare questo inconveniente (algoritmo di Peterson, algoritmo di Dekker) che si può facilmente evitare ponendo cura alla programmazione.

Voci correlate

[modifica | modifica wikitesto]

Collegamenti esterni

[modifica | modifica wikitesto]
Controllo di autoritàBNF (FRcb18083402f (data)
  Portale Informatica: accedi alle voci di Wikipedia che trattano di informatica