• Non ci sono risultati.

Programmazione  concorrente

N/A
N/A
Protected

Academic year: 2021

Condividi "Programmazione  concorrente"

Copied!
2
0
0

Testo completo

(1)

Programmazione  concorrente   AXO   Matteo  Guarnerio  

  1  

Programmazione  concorrente  

Riferimento  alla  slide:  AXO  -­‐  03  -­‐  Programmazione  concorrente.pdf    

Per  l’implementazione  delle  funzioni  utilizzate  si  fa  riferimento  alla  libreria:  

pthread.h    

Processi  e  thread  possono  usare  entrambi  sia  i  mutex  sia  i  semafori,  poiché   queste  variabili  sono  associate  a  degli  handle  di  sistema  operativo,  ed  ogni   processo  o  thread  ne  possiede  gli  indirizzi.  

Questa  è  la  ragione  per  cui  nelle  funzioni  riguardanti  mutex  e  semafori,  le   variabili  vengono  sempre  passate  per  indirizzo.  

Differenze  tra  processi  e  thread  

Processi:  

• La  porzione  di  dati  viene  copiata  da  padre  in  figlio.  

• Un  processo  è  indipendente  (può  crashare  uno  e  non  termina  l’altro)  

• Non  possono  scambiare  dati,  a  meno  che  non  si  sfruttino  pagine  di   memoria  condivise.  

 

Thread:  

• I  dati  sono  condivisi.  

• Non  sono  indipendenti  l’uno  dall’altro  (se  crasha  il  processo  che  li  ha   generati,  terminano  tutti).  

• Possono  scambiare  dati  tra  di  loro  (dati  condivisi).  

Sequenze  critiche  e  mutex  

Il  mutex  è  un  costrutto  specializzato  per  la  mutua  esclusione.  

E’  una  variabile  di  tipo:  pthread_mutex_t  

Per  utilizzarlo  è  necessario  inizializzarlo  con  la  funzione  apposita:  

pthread_mutex_init(&mutex)    

Le  funzioni  per  utilizzare  un  mutex  sono:  

Funzione   Azione  

pthread_mutex_lock(&mutex)   Acquisisce  un  lock  sul  mutex,  se   possibile.  

Altrimenti  si  mette  ad  attendere  che   venga  liberato  il  mutex.  

pthread_mutex_unlock(&mutex)   Sblocca  il  mutex.  

 

Se  più  thread  effettuano  un  lock  sullo  stesso  mutex,  viene  assegnato  al  primo   thread  arrivato,  tutti  gli  altri  si  metteranno  in  attesa  che  venga  liberato  il  mutex.  

Se  lo  stesso  thread  effettua  due  lock  sullo  stesso  mutex,  senza  prima  aver  fatto   un  unlock,  andrà  in  deadlock  e  quindi  in  sleep_on,  attendendo  che  lo  stesso   mutex  venga  rilasciato  da  lui  (programma  impallato).  

(2)

Programmazione  concorrente   AXO   Matteo  Guarnerio  

  2  

Sincronizzazione  e  semafori  

Il  semaforo  è  una  variabile  di  tipo:  sem_t  

Per  utilizzarlo  è  necessario  inizializzarlo  con  la  funzione  apposita:  

sem_init(&semaforo,  0,  valore)   dove  zero  è  lo  standard,  le  opzioni.  

 

Il  valore  al  quale  è  inizializzato  il  semaforo  indica  il  numero  di  thread  che   possono  accedere  alla  sezione  critica.  

 

Il  semaforo  assume  quindi  dei  valori,  che  indicano  il  numero  di  risorse   disponibili,  dai  quali  possiamo  capire  se  un  thread  può  proseguire   nell’elaborazione  o  si  deve  fermare:  

Valore  del  semaforo   Significato  

>  0   Ci  sono  risorse  disponibili.  

=  0   Non  ci  sono  risorse  disponibili.  

<  0   Non  ci  sono  risorse  disponibili.  

Indica  quanti  thread  sono  in  attesa  che   una  risorsa  si  liberi.  

 

Per  incrementare  e  decrementare  il  valore  di  un  semaforo  si  usano  le  seguenti   funzioni:  

Funzione   Azione  

sem_wait(&semaforo)   Decrementa  il  valore  del  semaforo  di  1   sem_post(&semaforo)   Incrementa  il  valore  del  semaforo  di  1    

Riferimenti

Documenti correlati

 Un programma thread safe protegge l’accesso alle strutture in stato inconsistente da parte di altri thread ad esempio (ma non necessariamente) costringendoli in attesa (passiva)

rilascia il mutex, il thread chiamante rimane in attesa passiva di una segnalazione sulla variabile condizione. nel momento di una segnalazione, la chiamata restituisce il

Esercizio: un processo padre crea un numero di processi figli specificato dall’utente. Ciascuno di questi effettua una pausa casuale

 Per condividere memoria tra più processi, solo uno deve allocarne un segmento, tutti gli altri devono agganciarsi al segmento..  consiste in un aggiornamento del mapping dei

 &lt; 0 il semaforo viene decrementato del valore assoluto di sem_op, il processo chiamante viene sospeso in attesa passiva che il. semaforo

•   Applicazioni strutturate come un insieme di processi (thread) per semplificare la loro programmazione. •   Sono caratterizzati dal fatto che esistono più processi che

 Un produttore sovrascrive un messaggio scritto prima che un consumatore sia riuscito a leggerlo.  Un messaggio viene letto dai consumatori più di

implementazione del concetto di monitor: un oggetto java è associato ad un mutex ricorsivo tramite il quale è possibile disciplinare gli accessi da parte di diversi thread allo