|
Appunti informatica |
|
Visite: 1429 | Gradito: | [ Picolo appunti ] |
Leggi anche appunti:I device driver e il cI Device Driver e il C Sin qui la teoria: in effetti di C si è parlato poco, Numeri a casoNumeri a caso La libreria C include alcune funzioni per la generazione di Disinstallare i tsrDisinstallare i TSR Sappiamo che, per un programma TSR, la capacità di disinstallarsi (liberando |
Problemi di mutua esclusione nel modello a memoria comune
V) Scrivere una applicazione concorrente che implementi il problema dei Lettori/Scrittori nella variante che prevede che essi accedano ad un pool di buffer di memoria condivisa, con attesa indefinita dei processi scrittori.
Descrizione: Il programma seguente implementa il problema dei Lettori/Scrittori (più di uno) nel caso in cui si assuma che i processi lettori abbiano la massima priorità e che i processi scrittori possano invece subire starvation. I vincoli possono essere così riassunti:
Il processo scrittore attivo opera ogni volta una "sovrascrittura" del contenuto del buffer.
Finchè è attivo un processo scrittore i processi lettori e gli altri processi scrittori devono attendere (a garanzia della consistenza del contenuto del buffer).
Finchè sono attivi uno o più processi lettori i processi scrittori devono attendere.
Finchè è attivo almeno un processo lettore tutti i processi lettori che sopraggiungono hanno diritto di prelazione rispetto ad eventuali processi scrittori già in attesa.
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
Lett_Scrit_StarvScr.H
#include <stdio.h>
#include"semafori.h"
typedef struct Buffer;
void Init_Buffer(Buffer*); //Inizializza il vettore
void Init_Semafori(int); //Inizializza i semafori
void Inizio_Lettura(Buffer*, int); //Acquisizione del buffer in lettura
char Lettura(Buffer*); //Lettura del buffer
void Fine_Lettura(Buffer*, int); //Rilascio del buffer dopo una lettura
void Inizio_Scrittura(int); //Acquisizione del buffer per la scrittura
void Scrittura(char, Buffer*); //Scrittura del buffer
void Fine_Scrittura(int); //Rilascio del buffer dopo una scrittura
Lett_Scrit_StarvScr.C
#include "Lett_Scrit_StarvScr.h"
#define MUTEX 0 //Definizione di MACRO per l'accesso ai semafori
#define SYNCH 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 Init_Buffer(Buffer* B)
void Init_Semafori(int ID_Sem)
void Inizio_Lettura(Buffer* B, int ID_Sem)
SIGNAL(MUTEX);
char Lettura(Buffer* B)
void Fine_Lettura(Buffer* B, int ID_Sem)
SIGNAL(MUTEX);
void Inizio_Scrittura(int ID_Sem)
void Scrittura(char value, Buffer* B)
void Fine_Scrittura(int ID_Sem)
Programma V.C
#include <stdio.h>
#include <sys/shm.h>
#include <sys/wait.h>
#include 'lett_scrit_starvscr.h'
#define DIM sizeof(Buffer) //Dimensione dell'area di memoria condivisa
#define NUM_LETT 5 //Numero di processi lettori
#define NUM_SCRIT 2 //Numero di processi scrittori
void main()
Ptr_Buf=(Buffer*)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==(Buffer*)-1)
Init_Buffer(Ptr_Buf); //Inizializzazione del Buffer
//----- 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)
Init_Semafori(ID_Sem); //Inizializzazione dei semafori
//----- GENERAZIONE FIGLI SCRITTORI -----
for(i=0; i<NUM_SCRIT; i++) else if (!pid)
Inizio_Scrittura(ID_Sem);
Scrittura(value, Ptr_Buf);
Fine_Scrittura(ID_Sem);
exit(0); //Il figlio Scrittore termina correttamente
}
} //End For NUM_SCRIT
//----- GENERAZIONE FIGLI LETTORI -----
for(i=0; i<NUM_LETT; i++) else if (!pid)
} //End For NUM_LETT
//----- SINCRONIZZAZIONE DEL PADRE CON I FIGLI -----
for(i=0; i<NUM_SCRIT+NUM_LETT; i++)
//----- RILASCIO MEMORIA CONDIVISA E SEMAFORO -----
shmctl(ID_Buf, IPC_RMID, 0);
semctl(ID_Sem, 0, IPC_RMID);
Appunti su: |
|