Memoria condivisa - Sistemi Operativi

di il
6 risposte

Memoria condivisa - Sistemi Operativi

Salve a tutti,

il mio dubbio è il seguente: se io ho una shared memory condivisa tra due processi (un produttore e un consumatore ad esempio) fatta così:

struct shared_data{
float vettore [5];
int numero;
}

poi quando devo utilizzarla avrò nel main le variabili locali:

1) void *shmP = (void *)0;
2) struct shared_data *p;
eccetera...

Dopo aver creato la memoria condivisa con shmget, aver usato la shmat, scriverò

3) p = (struct shared_data *)shmP

e poi continuo con il mio codice.

Ecco, se invece di condividere l'intera struttura, volessi condividere tra i processi solo il vettore di float, come dovrei scrivere 1), 2) e 3) ?

GRAZIE!!!

6 Risposte

  • Re: Memoria condivisa - Sistemi Operativi

    Non esagerare!

    La condivisione della memoria tra i processi e' basata su multipli di BLOCCHI di memoria. Che cosa ci fa ogni processo e' una questione del processo, NON del sistema operativo. Per Linux, il blocco dovrebbe essere di 1MB.

    Nessuno ti impedisce di condividere un blocco di memoria che contiene solo il vettore.
  • Re: Memoria condivisa - Sistemi Operativi

    migliorabile ha scritto:


    Non esagerare!

    La condivisione della memoria tra i processi e' basata su multipli di BLOCCHI di memoria. Che cosa ci fa ogni processo e' una questione del processo, NON del sistema operativo. Per Linux, il blocco dovrebbe essere di 1MB.

    Nessuno ti impedisce di condividere un blocco di memoria che contiene solo il vettore.
    Ti ringrazio, e come si fa a condividere un blocco di memoria che contiene solo il vettore?
  • Re: Memoria condivisa - Sistemi Operativi

    Ma devi condividere il vettore di una variabile strutturata o tutti i vettori di un vettore di strutture?
  • Re: Memoria condivisa - Sistemi Operativi

    oregon ha scritto:


    Ma devi condividere il vettore di una variabile strutturata o tutti i vettori di un vettore di strutture?
    No io ho un vettore di float (che dichiaro ad esempio float vettore[DIM]); su questo vettore il produttore deve inserire gli elementi, il consumatore deve leggerli e stampare a video la somma.
    Il mio dubbio è appunto come condividere il vettore tra produttore e consumatore tramite la memoria condivisa
  • Re: Memoria condivisa - Sistemi Operativi

    Quindi ...

    double *p;

    p = (double *)shmP;
  • Re: Memoria condivisa - Sistemi Operativi

    oregon ha scritto:


    Quindi ...

    double *p;

    p = (double *)shmP;
    int main(void) { 
    	int running = 1;
    	void * ShmP = (void *)0; 
    	float *p; 
    	int ShmID;
    	int WriteID, ReadID;
    
    	WriteID = semget(SEM_KEY_WRITE, 1, 0666 | IPC_CREAT);
    	
    	ReadID = semget(SEM_KEY_READ, 1, 0666 | IPC_CREAT);
    	
    	ShmID = shmget(SHM_KEY, sizeof(struct SharedData), 0666 | IPC_CREAT); 
    	
    	ShmP = shmat(ShmID, (void *)0, 0); 
    	
    	p = (float *)ShmP;
    	printf("Memoria agganciata all'indirizzo %X\n", p);
    
    	while(running) {
    		if (SEM_P(WriteID)==-1) exit(EXIT_FAILURE);
    		
    		printf ("Inserisci i 5 elementi del vettore\n");
    		for (i=0; i<5; i++){
    			printf("Inserisci elemento");
    			scanf("%f", &vettore[i]);
    		}
    		if (SEM_V(ReadID)==-1) exit(EXIT_FAILURE);
    	}
    
    	if (shmdt(ShmP) == -1) { 
    		fprintf(stderr, "shmdt failed\n"); 
    		exit(EXIT_FAILURE);
    	}
    
    	exit(EXIT_SUCCESS);
    }

    Il produttore dovrebbe scrivere gli elementi del vettore condiviso all'interno della shared memory.
    É corretto?
Devi accedere o registrarti per scrivere nel forum
6 risposte