Domanda

Dopo aver letto sui processi Lighweight di Erlang ero praticamente sicuro che fossero "fili verdi". Fino a quando ho letto che ci sono differenze tra fili verdi e dei processi di Erlang. Ma io non capisco.

Quali sono le reali differenze?

È stato utile?

Soluzione

fili verdi possono condividere memoria dati direttamente tra loro (anche se la sincronizzazione è necessario naturalmente).

Erlang non fa uso di "fili verdi", ma piuttosto qualcosa di più vicino ai "trattamenti Green": i processi non condividono memoria dati direttamente, ma lo fanno in modo da "copiando" (vale a dire avere copie indipendenti di dati di origine)

Altri suggerimenti

Si tratta di una semplificazione che va troppo per dire che i processi di Erlang non possono condividere direttamente la memoria di dati, e che hanno solo copiare i valori tra loro. Che è più di una descrizione di come potrebbe essere attuato, e come si può far finta che sia implementata. Almeno per tutti gli scopi, tranne i problemi di prestazioni.

Erlang impone alcune restrizioni semantiche su cosa si può fare come programmatore. Ad esempio, i valori sono immutabili, il che significa che non è possibile modificare loro dopo che sono costruiti. Uno allora si rendono conto che sarebbe perfettamente bene per più processi di Erlang di accedere allo stesso valore in memoria, dal momento che nessuno dei può cambiare comunque. E le serrature non sono necessari, allora.

situazioni degni di nota quando questo è fatto in Erlang / OTP è:

  • I grandi binari (più di 64 byte) sono di riferimento contato in una speciale heap binario, e riferimenti in questo mucchio è passato quando la messaggistica.
  • I valori letterali vengono posti in un'apposita area di memoria, tutti i processi ad essi si riferiscono ai valori nella stessa area di memoria (ma non appena il valore viene inviato in un messaggio un duplicato è presentata nel processo di ricezione).
  • Ogni nodo come una tabella di atomo globale, e atom valori sono molto riferimenti in questa tabella, questo rende uguaglianza atomo test molto efficiente (confrontare puntatore invece di stringa).
  • L'impostazione erl -hybrid sperimentale che unisce process-cumuli e compartecipazione cumuli avendo processi copiano valori dal processo mucchio nel mucchio condivisa prima volta usato in un messaggio. Ho trovato questo thread su cumuli ibride , che spiega anche alcuni problemi con il concetto.

Un altro trucco che si può fare è quello di mutare in realtà i valori, ma fare in modo che non sia visibile. Questo per spiegare ulteriormente che i valori immutabili è una restrizione semantica.

Questi sono alcuni esempi in cui OTP / Erlang sarà effettivamente mutare valori:

  • "recenti" (R12) ottimizzazioni nella gestione della sintassi binaria consentono di aggiungere alla fine dei binari e in realtà non costruire un nuovo binario completo con la nuova coda aggiunto.
  • È stato detto che, tuple nuova costruzione con un set_element immediata può essere, o essere stato una volta, tradotto dal compilatore per cambiare effettivamente l'elemento sul posto per la tupla.

Queste ottimizzazioni andare sotto la teoria che "Se un albero cade nella foresta e nessuno è lì a sentirlo, fa davvero fare un suono?" . Cioè, i riferimenti non devono essere sfuggiti all'oggetto che deve essere mutato. Perché allora si può osservare che esso è cambiato.

E questo è proprio ciò che la semantica Erlang è di circa, le cose non dovrebbero cambiare come un effetto collaterale di quello che qualche altro processo sta facendo. Noi chiameremmo che stato condiviso , e non c'è piaciuto affatto.

Un'altra semplificazione che va troppo lontano per dire che Erlang non ha effetti collaterali. Ma questo è un altro problema, se è mai chiesto.

Quando le persone oggetto a chiamare i processi di Erlang "fili verdi", non si oppongono alla parte "verde", che si oppongono alla parte "discussioni".

La differenza tra thread e processi è sostanzialmente, che le discussioni hanno solo il proprio puntatore all'istruzione, ma condividono tutto il resto (in particolare dello stato, memoria, spazio di indirizzamento). Processi OTOH sono completamente isolati e condividere nulla.

I processi di Erlang condividono nulla, quindi, sono veri processi. Tuttavia, di solito sono attuate in modo "verde". Quindi, tecnicamente, sono "processi verdi".

Io di solito li chiamo "fili verdi" quando voglio sottolineare il peso leggero applicazione , e li chiamo "processi" quando voglio sottolineare la shared-nothing semantica . In questo modo non devo spiegare cosa intendo per "processi verdi".

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