Anteprima
Vedrai una selezione di 5 pagine su 20
Sistemi operativi - Problema dei produttori e dei consumatori Pag. 1 Sistemi operativi - Problema dei produttori e dei consumatori Pag. 2
Anteprima di 5 pagg. su 20.
Scarica il documento per vederlo tutto.
Sistemi operativi - Problema dei produttori e dei consumatori Pag. 6
Anteprima di 5 pagg. su 20.
Scarica il documento per vederlo tutto.
Sistemi operativi - Problema dei produttori e dei consumatori Pag. 11
Anteprima di 5 pagg. su 20.
Scarica il documento per vederlo tutto.
Sistemi operativi - Problema dei produttori e dei consumatori Pag. 16
1 su 20
D/illustrazione/soddisfatti o rimborsati
Disdici quando
vuoi
Acquista con carta
o PayPal
Scarica i documenti
tutte le volte che vuoi
Estratto del documento

Una seconda soluzione

• Due vettori:

  • buffer [N], che contiene i valori
  • stato [N], nel quale ogni cella può contenere tre possibili valori:
    • PIENO, se la cella corrispondente nel buffer contiene un valore prodotto;
    • VUOTO, se la cella corrispondente non contiene un valore consumabile;
    • IN_USO, se la cella corrispondente è oggetto di un processo produttore o consumatore attualmente attivo.

Una seconda soluzione

  • Scomposizione del problema in 6 funzioni:
    • Richiesta, Produzione e Rilascio per i produttori;
    • Richiesta, Consumo e Rilascio per i consumatori.
  • Ipotesi semplificativa:
    • ogni consumatore è disposto a leggere un qualsiasi messaggio, tra quelli presenti nel buffer.

Strutture dati

# define VUOTO 0
# define PIENO 1
# define IN_USO 2
semaforo messaggio_disponibile=0;
semaforo spazio_disponibile=N;
semaforo mutex_prod=1;
semaforo mutex_cons=1;
messaggio buffer[N];
int stato[N];
/* buffer e stato sono in memoria condivisa */
typedef

char messaggio 9Produttoreint Richiesta_Produttore() {int indice;wait(spazio_disponibile);wait(mutex_prod);indice=0;while (stato[indice]!=VUOTO)indice++;stato[indice]=IN_USO;signal(mutex_prod);return indice; }void Produzione (int indice,messaggio valore){ buffer[indice]=valore;}void Rilascio_Produttore (intindice) {stato[indice]=PIENO;signal (messaggio_disponibile);} 10Consumatoreint Richiesta_Consumatore() {int indice;wait(messaggio_disponibile);wait(mutex_cons);indice=0;while (stato[indice]!=PIENO)indice++;stato[indice]=IN_USO;signal(mutex_cons);return indice; }messaggio Consumo (int indice){ return buffer[indice];}void Rilascio (int indice) {stato[indice]=VUOTO;signal (spazio_disponibile); } 11Commenti• Con questa soluzione puòesistere un parzialeparallelismo tra i produttori:possono coesistere unproduttore che richiede unarisorsa e altri che produconoo rilasciano risorse• Lo stesso vale in manieraanaloga per i consumatori 12Implementazione:Costanti e

#include <stdio.h> #include <sys/types.h> #include <sys/wait.h> #include <sys/ipc.h> #include <sys/shm.h> #include <sys/sem.h> typedef char messaggio; #define VUOTO 0 #define PIENO 1 #define IN_USO 2 #define PROD 0 #define CONS 1 void wait_sem(int id_sem, int num_sem); void signal_sem(int id_sem, int num_sem); int Richiesta_produttore(void); void Produzione(int indice, messaggio valore); void Rilascio_produttore(int indice); int Richiesta_consumatore(void); messaggio Consumo(int indice); void Rilascio_consumatore(int indice); 13Inizializzazionesemafori e memoriacondivisamain()… dichiarazione variabili … id_buffer = shmget(chiave, N * sizeof(char),IPC_CREAT | 0644); buffer = shmat(id_buffer, 0, 0); id_stato = shmget(chiave, N * sizeof(shortint), IPC_CREAT | 0644); stato = shmat(id_stato, 0, 0); sem = semget(IPC_PRIVATE, 2, IPC_CREAT |0644); semctl(sem, PROD, SETVAL, N); semctl(sem, CONS, SETVAL, 0); mutex = semget(IPC_PRIVATE, 2, IPC_CREAT |0644); semctl(mutex,
PROD, SETVAL, 1);
semctl(mutex, CONS, SETVAL, 1);
…
14Primitivesemaforiche
void wait_sem(int id_sem, int num_sem){
    struct sembuf v_op;
    v_op.sem_num = num_sem;
    v_op.sem_op = -1;
    v_op.sem_flg = SEM_UNDO;
    semop(id_sem, &v_op, 1);
}
void signal_sem(int id_sem, int num_sem){
    struct sembuf v_op;
    v_op.sem_num = num_sem;
    v_op.sem_op = 1;
    v_op.sem_flg = SEM_UNDO;
    semop(id_sem, &v_op, 1);
}
15Funzioni per ilProduttore
int Richiesta_produttore(void){
    int indice;
    wait_sem(sem, PROD);
    wait_sem(mutex, PROD);
    indice = 0;
    while (stato[indice] != VUOTO)
        indice++;
    stato[indice] = IN_USO;
    signal_sem(mutex, PROD);
    return indice;
}
void Produzione(int indice, messaggiovalore){
    buffer[indice] = valore;
}
void Rilascio_produttore(int indice){
    stato[indice] = PIENO;
    signal_sem(sem, CONS);
}
16Funzioni per ilconsumatore
int Richiesta_consumatore(void){
    int indice;
    wait_sem(sem, CONS);
    wait_sem(mutex, CONS);
    indice = 0;
    while (stato[indice] != PIENO)
        indice++;
    stato[indice] = IN_USO;
    signal_sem(mutex, CONS);
    return

indice;


messaggio Consumo(int indice){
    return buffer[indice];
}


void Rilascio_consumatore(int indice){
    stato[indice] = VUOTO;
    signal_sem(sem, PROD);
}


17

Dettagli
Publisher
A.A. 2012-2013
20 pagine
2 download
SSD Ingegneria industriale e dell'informazione ING-INF/05 Sistemi di elaborazione delle informazioni

I contenuti di questa pagina costituiscono rielaborazioni personali del Publisher Menzo di informazioni apprese con la frequenza delle lezioni di Sistemi operativi e studio autonomo di eventuali libri di riferimento in preparazione dell'esame finale o della tesi. Non devono intendersi come materiale ufficiale dell'università Università degli studi di Napoli Federico II o del prof Cotroneo Domenico.