|
Appunti informatica |
|
Visite: 1385 | Gradito: | [ Picolo appunti ] |
Leggi anche appunti:Catturare il contenuto del videoCatturare il contenuto del video In questo esempio presentiamo un programma TSR Due file sono il medesimo file?Due file sono il medesimo file? La domanda è formulata in modo fuorviante. Il L'i/o e la gestione dei fileL'I/O e la gestione dei file Per Input/Output (I/O) si intende l'insieme delle |
Problemi di cooperazione nel modello a memoria comune
IV) Scrivere una applicazione concorrente che implementi il problema Produttore/Consumatore nella variante che prevede più produttori e consumatori e l'impiego di un pool di buffer di memoria.
Descrizione: Il programma seguente implementa il problema dei Produttori/Consumatori (più di uno) nel caso in cui essi si contendano un pool di buffer organizzato come semplice vettore, posto che ad essi si applichino i seguenti vincoli:
il consumo di un singolo buffer di memoria comune (l'insieme del pool è allocato dal processo padre) da parte di un processo consumatore non può avvenire se non dopo che almeno un processo produttore vi abbia depositato un contenuto, e all'atto del consumo tale contenuto viene cancellato.
un processo produttore non può depositare in un buffer di memoria comune un nuovo contenuto se non è disponibile alcun buffer libero.
A garanzia della consistenza del contenuto del buffer condiviso, processi consumatori e processi produttori, globalmente, devono accedere al singolo buffer in mutua esclusione, tuttavia l'accesso al pool di buffer nella sua totalità avviene comunque in concorrenza.
Semafori.H (L'implementazione è quella indicata per il programma I)
#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/sem.h>
void Init_Sem(int, int); //Inizializza Semaforo
void Wait_Sem(int, int); //Wait su Semaforo
void Signal_Sem(int, int); //Signal su Semaforo
int Awaiting_Sem(int, int); //Restituisce il numero di processi in attesa su Semaforo
Prod_Cons_Vector.H
#include <stdio.h>
#include "semafori.h"
#define DIM_VECTOR 4 //Cardinalità del vettore
#define VUOTO 0 //Stati del singolo buffer del vettore
#define IN_USO 1
#define PIENO 2
typedef struct Vector;
void Init_Vector(Vector*); //Inizializza il vettore
void Init_Semafori_Vector(int); //Inizializza i semafori
int Richiesta_Produzione_Vector(Vector*, int); //Richiesta di un buffer libero per la produzione
void Produzione_Vector(int, char, Vector*); //Produzione di un carattere nel vettore
void Rilascio_Produzione_Vector(int, Vector*, int); //Rilascio di un buffer pieno
int Richiesta_Consumo_Vector(Vector*, int); //Richiesta di un buffer pieno per il consumo
char Consumo_Vector(int, Vector*); //Consumo di un carattere dal vettore
void Rilascio_Consumo_Vector(int, Vector*, int); //Rilascio di un buffer vuoto
Prod_Cons_Vector.C
#include "prod_cons_vector.h"
#define SPAZIO_DISPONIBILE 0 //Definizione di MACRO per l'accesso ai semafori
#define MESSAGGIO_DISPONIBILE 1
#define MUTEX_PROD 2
#define MUTEX_CONS 3
#define INITIALIZE(S,V) Init_Sem(ID_Sem,S,V)
#define WAIT(S) Wait_Sem(ID_Sem,S)
#define SIGNAL(S) Signal_Sem(ID_Sem,S)
void Init_Vector(Vector* V)
void Init_Semafori_Vector(int ID_Sem)
int Richiesta_Produzione_Vector(Vector* V, int ID_Sem)
V->stato[i]=IN_USO;
SIGNAL(MUTEX_PROD);
printf('Buffer %d in uson', i);
return i;
void Produzione_Vector(int i, char value, Vector* V)
void Rilascio_Produzione_Vector(int i, Vector* V, int ID_Sem)
int Richiesta_Consumo_Vector(Vector* V, int ID_Sem)
V->stato[i]=IN_USO;
SIGNAL(MUTEX_CONS);
printf('Buffer %d in uson', i);
return i;
char Consumo_Vector(int i, Vector* V)
void Rilascio_Consumo_Vector(int i, Vector* V, int ID_Sem)
Programma IV.C
#include <stdio.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include 'prod_cons_vector.h'
#define DIM sizeof(Vector) //Dimensione dell'area di memoria condivisa
#define NUM_PROD 3 //Numero di processi produttori
#define NUM_PRODUZ 5 //Numero di produzioni per ogni processo produttore
#define NUM_CONS 5 //Numero di processi consumatori
#define NUM_CONSUM 3 //Numero di consumi per ogni processo consumatore
void main()
Ptr_Buf=(Vector*)shmat(ID_Buf, 0, 0); //Il segmento allocato viene annesso al segmento dati
//del processo al primo indirizzo disponibile così come
//specificato dal sistema
if (Ptr_Buf==(Vector*)-1)
Init_Vector(Ptr_Buf); //Inizializzazione del Vettore
//----- CREAZIONE SEMAFORI -----
key_t Key_Sem=IPC_PRIVATE; //Chiave del semaforo/i
int ID_Sem; //Identificatore del semaforo/i
ID_Sem=semget(Key_Sem, 4, IPC_CREAT|0664); //Viene allocato un gruppo di semafori di cardinalità 4,
//viene associato al gruppo un ID e viene creata una
//struttura dati ausiliaria che consenta di gestirlo
//RW per User, RW per Gruppo, R only per Others
if (ID_Sem==-1)
Init_Semafori_Vector(ID_Sem); //Inizializzazione dei semafori
//----- GENERAZIONE FIGLI PRODUTTORI -----
for(i=0; i<NUM_PROD; i++) else if (!pid)
exit(0); //Il figlio Produttore termina correttamente
}
} //End For NUM_PROD
//----- GENERAZIONE FIGLI CONSUMATORI -----
for(i=0; i<NUM_CONS; i++) else if (!pid)
exit(0); //Il figlio Consumatore termina correttamente
}
} //End For NUM_CONS
//----- SINCRONIZZAZIONE DEL PADRE CON I FIGLI -----
for(i=0; i<NUM_PROD+NUM_CONS; i++)
//----- RILASCIO MEMORIA CONDIVISA E SEMAFORO -----
shmctl(ID_Buf, IPC_RMID, 0);
semctl(ID_Sem, 0, IPC_RMID);
Appunti su: |
|