|
Appunti informatica |
|
Visite: 1552 | Gradito: | [ Picolo appunti ] |
Leggi anche appunti:Problemi di mutua esclusione nel modello a memoria comuneProblemi di mutua esclusione nel modello a memoria comune VI) Scrivere una I puntatoriI puntatori Una variabile è un'area di memoria alla quale è associato un nome I modelli di memoriaI modelli di memoria L'architettura hardware dei processori Intel 80x86, |
Problemi di cooperazione nel modello a memoria comune
II) Scrivere una applicazione concorrente che implementi il problema Produttore/Consumatore. In particolare, il programma crei due processi che agiscono, rispettivamente da produttore e consumatore, comunicando attraverso un unico buffer di memoria.
Descrizione: Il programma seguente implementa il problema dei Produttori/Consumatori nel caso particolare in cui ci sia un solo processo produttore ed un solo processo consumatore, ai quali si estendono i seguenti vincoli:
il consumo del buffer di memoria comune (allocato dal processo padre) da parte del processo consumatore non può avvenire se non dopo che il processo produttore vi abbia depositato un contenuto, e all'atto del consumo tale contenuto viene cancellato.
il processo produttore non può depositare nel buffer di memoria comune un nuovo contenuto se il precedente non è stato ancora consumato.
A garanzia della consistenza del contenuto del buffer condiviso, processo consumatore e processo produttore devono accedervi in mutua esclusione.
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
Programma II.C
#include <stdio.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include 'semafori.h'
#define DIM 1 //Dimensione dell'area di memoria condivisa
#define NUM_OPS 4 //Numero di produzioni/consumi
#define SPAZIO_DISPONIBILE 0 //Definizione di MACRO per l'accesso ai semafori
#define MESSAGGIO_DISPONIBILE 1
#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 main()
Ptr_Buf=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==(char*)-1)
//----- CREAZIONE SEMAFORI -----
key_t Key_Sem=IPC_PRIVATE; //Chiave del semaforo/i
int ID_Sem; //Identificatore del semaforo/i
ID_Sem=semget(Key_Sem, 2, IPC_CREAT|0664); //Viene allocato un gruppo di semafori di cardinalità 2,
//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)
INITIALIZE(SPAZIO_DISPONIBILE,1); //Setta SPAZIO_DISPONIBILE a 1
INITIALIZE(MESSAGGIO_DISPONIBILE,0); //Setta MESSAGGIO_DISPONIBILE a 0
//----- GENERAZIONE FIGLIO PRODUTTORE -----
pid=fork(); //Generazione del figlio Produttore
if (pid==-1) else if (!pid)
exit(0); //Il figlio Produttore termina correttamente
}
//----- GENERAZIONE FIGLIO CONSUMATORE -----
pid=fork();
if (pid==-1) else if (!pid)
exit(0); //Il figlio Consumatore termina correttamente
}
//----- SINCRONIZZAZIONE DEL PADRE CON I FIGLI -----
for(i=0; i<2; i++)
//----- RILASCIO MEMORIA CONDIVISA E SEMAFORO -----
shmctl(ID_Buf, IPC_RMID, 0);
semctl(ID_Sem, 0, IPC_RMID);
Appunti su: |
|