PDA

View Full Version : [C] Lista linkata su shared memory multi-processo


fabiostyle91
03-05-2012, 16:17
Ciao a tutti.
Ho un problema per quanto riguarda la creazione di una e piu' liste linkate su shared memory; e devo utilizzare il multiprocesso System V (niente thread!)
All'inizio avevo pensato: " E che ci vuole, il processo padre crea una lista nella sua area heap, i cui nodi contengono gli indirizzi delle shm. Quindi i processi figli possono semplicemente fare pop e push sulla lista con le usuali malloc e free". TUTTO SBAGLIATO!

I processi figli hanno tutti una copia della memoria del processo padre, e quindi lavorano tutti su liste diverse! Infatti ogni volta per ogni processo sembra che la lista non sia mai stata toccata :p

Quindi in tutto questo...come posso creare una lista "linkata" in memoria condivisa, dato che non hanno senso malloc/free?

Io avevo pensato (male) di sostituire a malloc shmget e a free shmctl(remove), ma purtroppo solo il processo padre puo' creare le shm per i processi figli e NON viceversa.

lorenzo001
03-05-2012, 16:24
Ciao a tutti.
... ma purtroppo solo il processo padre puo' creare le shm per i processi figli e NON viceversa.

Spiega meglio questa parte ...

fabiostyle91
03-05-2012, 16:34
allora, se il processo padre originario fa shmget-shmatt, tutti i processi figli generati da una o piu' fork possono accedere in maniera condivisa a questa memoria. Pero' se un processo figlio creato dalla fork fa a sua volta una shmget-shmatt, il processo padre e tutti i processi "fratelli" (generati dalla precedente fork del padre) non possono accedere a questa nuova memoria condivisa, ma solo eventuali nuovi processi figli creato da quest'ultimo processo stesso.
In definitiva, i processi figli possono accedere alla memoria condivisa creata dal padre, ma il processo padre (e i suoi fratelli a maggior ragione) non possono accedere alla memoria condivisa creata da un suo figlio.

Adesso chi ha idee al mio problema?

GByTe87
03-05-2012, 16:50
Potresti usare mmap() per condividere un'area di memoria accessibile in lettura e scrittura a tutti i processi.

Edit: ma credo che cozzi con la tua necessità di usare System V. :muro:

fabiostyle91
03-05-2012, 17:25
Edit: ma credo che cozzi con la tua necessità di usare System V. :muro:

Esattamente.... solo multiprocesso (System V), non multithread (POSIX)

pabloski
04-05-2012, 12:18
Non è molto complicato in effetti.

Tieni presente che la memoria condivisa non appartiene esclusivamente a nessun processo. E' memoria di cui il sistema operativo tiene traccia e può essere mappata nello spazio d'indirizzamento di qualsiasi processo avendo a disposizione il relativo id che la identifica.

Quindi il tuo problema si riduce ad usare un qualche metodo ( pipe ad esempio ) per comunicare gli id delle sezioni di memoria condivisa istanziate dai figli, al padre e ai fratelli.

Oppure potresti, sempre tramite pipe ad esempio, demandare l'allocazione della memoria condivisa al solo padre, il quale poi trasmetterà ( sempre tramite pipe o altri meccanismi ipc ) a tutti i figli l'id della sezione di memoria condivisa appena allocata.

lorenzo001
04-05-2012, 12:49
allora, se il processo padre originario fa shmget-shmatt, tutti i processi figli generati ...

Perché non possono ? Si tratta solo di comunicare gli id delle sezioni usate.