vuoi
o PayPal
tutte le volte che vuoi
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