|
Appunti informatica |
|
Visite: 1261 | Gradito: | [ Picolo appunti ] |
Leggi anche appunti:La gestione degli erroriLa gestione degli errori Le librerie della maggior parte dei compilatori implementano La command lineLa command line Si intende, per command line, la riga di testo digitata al prompt Impiego di fileImpiego di file XIII) Si realizzino due processi che interagiscono |
Problemi di mutua esclusione nel modello a memoria comune
I) Scrivere una applicazione concorrente che generi due processi figlio che competano per l'uso di un buffer di memoria (un processo figlio si comporti da lettore e l'altro da scrittore).
Descrizione: Il programma seguente implementa il problema dei Lettori/Scrittori nel caso particolare in cui ci sia un solo processo lettore ed un solo processo scrittore, ai quali si estendono i seguenti vincoli:
la lettura del buffer di memoria comune (allocato dal processo padre) da parte del processo lettore non può avvenire se non dopo la scrittura da parte del processo scrittore, e chiaramente il processo lettore non ha facoltà di modificare il contenuto del buffer.
il processo scrittore opera ogni volta una "sovrascrittura" del contenuto del buffer.
A garanzia della consistenza del contenuto del buffer condiviso, processo lettore e processo scrittore devono accedervi in mutua esclusione.
Semafori.H
#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
Semafori.C
#include 'semafori.h'
struct sembuf Sem_Buf; //sembuf è un tipo predefinito contenente perlomeno i seguenti campi
//short sem_num; Numero del semaforo
//short sem_op; Valore da sommare algebricamente al semaforo
//short sem_flg; Flag dell'operazione
union semun Sem_Union; //semun è una unione predefinita contenente i seguenti elementi
//int val;
//struct semid_ds* buf;
//unshort_t* array;
//----- Nelle funzioni seguenti ID identifica il gruppo di semafori, N il singolo semaforo nel gruppo -----
void Init_Sem(int ID, int N, int Val)
void Wait_Sem(int ID, int N)
void Signal_Sem(int ID, int N)
int Awaiting_Sem(int ID, int N)
Programma I.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 letture/scritture
#define MUTEX 0 //Definizione di MACRO per l'accesso al semaforo
#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 SEMAFORO -----
key_t Key_Sem=IPC_PRIVATE; //Chiave del semaforo/i
int ID_Sem; //Identificatore del semaforo/i
ID_Sem=semget(Key_Sem, 1, IPC_CREAT|0664); //Viene allocato un gruppo di semafori di cardinalità 1,
//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(MUTEX,1); //Setta MUTEX a 1
//----- GENERAZIONE FIGLIO SCRITTORE -----
pid=fork(); //Generazione del figlio Scrittore
if (pid==-1) else if (!pid)
exit(0); //Il figlio Scrittore termina correttamente
}
//----- GENERAZIONE FIGLIO LETTORE -----
pid=fork();
if (pid==-1) else if (!pid)
exit(0); //Il figlio Lettore 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: |
|