2013-08-27 7 views
5

Ci sono molte informazioni su come usare la casella di posta di erlang, ma raramente trovare una carta o un documento descrivono in che modo la casella di posta di accesso reale viene inserita internamente all'interno della VM.Come i processi di Erlang accedono contemporaneamente alla cassetta postale

A mio parere, Erlang VM deve eseguire un'azione di blocco o CAS per proteggere l'integrità dei messaggi. C'è un modo sofisticato di metodo dietro la cortina di erlang

+3

Ti rendi conto che esiste una sola casella di posta per processo di Erlang, ciò riduce notevolmente la necessità di blocchi globali. – rvirding

risposta

6

Per casella di posta, suppongo si intenda la casella di posta di processo, in cui sono inseriti i messaggi. Domanda divertente!

C'è qualche conversazione here circa le caratteristiche di bloccaggio della coda dei messaggi processo di Erlang:

Solo una curiosità: attualmente v'è una sorta di serrature in invio del messaggio. ho nessuno ha cercato di implementare un elenco collegato senza blocchi: http://www.amd64.org/fileadmin/user_upload/pub/epham08-asf-eval.pdf

O sto solo guardando posto sbagliato e erts_smp_proc_lock è già usando qualcosa di simile?

La coda di messaggi ha già questo, una specie di. Il processo che possiede la casella di messaggio ha una "scatola interna" che ha un blocco e una "scatola esterna " alla quale competono tutti i mittenti. Quindi la contesa del blocco si trova sulla coda della coda sulla "scatola esterna" quando un sacco di processi invia a quel processo. Il proprietario della casella di posta non è interessato però.

Si potrebbe trovare la lettura dell'implementazione del BEAM process illustrativo.

Risposta breve: sì, il blocco viene eseguito nella coda messaggi, ma è complicato e ottimizzato per ridurre la contesa tra i thread dello scheduler.

+1

IIRC hanno aggiunto un messaggio alla casella di posta fino a due scritture. Mi chiedo se hanno ancora bisogno di serrature effettive. – rvirding

3

Esistono diversi blocchi che gestiscono la struttura del processo. Il più importante per quanto riguarda l'invio di messaggi è il blocco MSGQ e il blocco MAIN. Il blocco MAIN è quello che blocca i campi della struttura mentre è operativo: uno dei campi è la coda in uscita. Il blocco MSGQ copre l'elenco collegato dei messaggi in arrivo.

Quindi, per inviare un messaggio, è necessario acquisire i destinatari del blocco MSGQ e copiare il messaggio dalla nostra coda (protetta da MAIN) alla coda dei messaggi in arrivo dell'altro processo.

Mente come async è questa operazione di invio. I processi non si bloccano a vicenda! (il più delle volte;)

Problemi correlati