Domanda

Quando si utilizza mmap() per la memoria condivisa (da Linux o altri UNIX-like sistemi) è possibile (e portatile) per uso fcntl() (o funzioni flock() o lockf()) per l'accesso di coordinate per la mappatura?

Risposte a questa SO domanda sembra suggerire che dovrebbe funzionare.

L'idea che ho in mente sarebbe quello di avere la memoria condivisa strutturato con una mappa del processo / pagina per ridurre al minimo la contesa di bloccaggio. I processi potrebbero ogni opera con le loro pagine simultaneamente, e una serratura avrebbe bisogno solo di essere acquisita durante l'aggiornamento delle mappature di processo / pagina. (Leggi l'accesso dalle pagine senza proprietario comporterebbe il controllo di un numero di serie, la copia dei dati desiderati, quindi convalidare che il numero di serie di quel blocco non era cambiato).

Concettualmente ogni processo la condivisione di questo mapping dei file sarebbe eseguire la mmap(), trovare un blocco libero in esso, acquisire un blocco per l'area di processo / pagina, aggiornamento che con il proprio incarico, rilasciare il blocco e poi andare allegramente con il suo lavoro. Qualsiasi processo potrebbe cercare mappature stantii (usando kill() con zero come il segnale) e ripulire la mappatura tabella dei processi / pagina.

(In ruvida, termini generici, sto giocando con un motore di produttore / consumatore di elaborazione con memoria condivisa da Python su Linux, mi piacerebbe la soluzione per essere portabile su BSD e ad altri linguaggi di programmazione --- così a lungo come il mmap() supporto e le interfacce necessarie per fcntl(), flock() o lockf(). mi piacerebbe anche essere interessati a pseudo-codice che mostra come si potrebbe misurare la contesa dei blocchi e rilevare eventuali errori di sincronizzazione. sono consapevole del fatto che la threading e multiprocessore con i rispettivi oggetti Queue() sono il modo più semplice per implementare un modello pitone produttore / consumatore elaborazione).

È stato utile?

Soluzione

Sono sicuro che le serrature forniranno mutua esclusione, ma non so se gli daranno una barriera di memoria. Sembra che il salto nel kernel (che fcntl, gregge, e lockf farà) è probabile che a fare qualcosa che le forze fuori di memoria di ordine di lettura e scrittura a commettere, ma dubito si otterrà un garanzia dura. Penso che questo sia una di quelle cose in cui probabilmente funziona, e la sperimentazione mostrerò che funziona, ma non si sa che funziona sempre a meno che non si trova un riferimento a dire tanto.

Ho fatto qualcosa di simile a questo da C, ma ho usato spinlocks atomiche nella memoria condivisa in sé. E 'usato per essere che si doveva fare un po' di linea di montaggio, ma gcc ora ha alcune operazioni intrinseche che è possibile utilizzare:

http://gcc.gnu.org/onlinedocs/gcc/Atomic- Builtins.html

Se siete disposti a scrivere una semplice estensione Python, si potrebbe avvolgere __sync_lock_test_and_set (...) e __sync_lock_release (...) per fare quello che ti serve. Questi dovrebbero essere abbastanza portatile.

Credo che ci sia un modo per mettere i mutex pthread nella memoria condivisa anche, ma non ho alcuna esperienza con questo. Anche in questo caso, ci si deve scrivere una semplice estensione C per ottenere l'accesso a quella da Python.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top