7

Sto cercando di progettare un linguaggio concorrente con supporto per processi leggeri ("fili verdi") nella vena di Erlang utilizzando LLVM come generatore di codice nativo. I processi leggeri sono allocati ai thread del sistema operativo nativo in modo M: N e dovrebbe essere possibile il furto del lavoro tra i thread (ad esempio, i processi dovrebbero essere rappresentati da una struttura dati che può essere passata tra i thread, se necessario). Un numero molto elevato di processi potrebbe esistere contemporaneamente, quindi i processi non dovrebbero occupare molta memoria e il cambio di contesto tra di essi dovrebbe essere il più veloce possibile. Inoltre, dovrebbe essere piuttosto semplice "mettere in pausa" un processo leggero durante gli switch di contesto o se si verifica la garbage collection. Comprendo che Erlang ha un back-end LLVM, ma posso trovare pochissima letteratura sulla sua implementazione; qualcuno può descrivermi come potrebbe essere possibile?LLVM fornisce servizi per l'implementazione di processi "fili verdi"/leggeri?

+0

Si potrebbe desiderare stack divisi. GCC li ha, quindi probabilmente anche LLVM –

risposta

0

Non ho esperienza specifica con LLVM o Erlang.

Ma ho implementato un tale sistema, in un linguaggio di programmazione chiamato PARLANSE. Sì, ottenere gli switch di contesto a buon mercato è difficile.

Maggiori dettagli a questo SO rispondono: https://stackoverflow.com/a/999610/120163

Cosa poca conoscenza che ho di LLVM suggerisce che potrebbe essere difficile. Quello che è necessario generare è il codice di cambio di contesto. Non sono sicuro che LLVM supporti direttamente lo . Certamente non è qualcosa di facile da fare quando si genera codice C puro , perché le primitive della lingua non consentono di ottenere lo stato macchina/filetto molto bene.

lui capovolgi qui è il Clang, nel tentativo di supportare le caratteristiche di C++ 14, deve sicuramente inciampare in "C++ native" thread. Ci deve essere il supporto per il cambio di contesto per abilitarlo, quindi forse qualcuno ha o ha già risolto il problema.

0

LLVM non è direttamente rilevante per l'implementazione di questo tipo di sistema. Ci sono molti frontend per le lingue con tali costrutti che si riducono all'IR di LLVM.

LLVM è solo una tecnologia di compilazione per generare codice nativo per un singolo thread di esecuzione. Implementare il cambio di contesto, impostare lo stack in modo appropriato (pile di cactus o altre tecniche) e altre preoccupazioni sono principalmente responsabilità del runtime e dell'ambiente.

Un'eccezione supporta la sintesi delle chiamate di runtime per far crescere lo stack quando necessario e che potenzialmente divide lo stack in regioni non contigue. Come indicato nei commenti, LLVM ha qualche supporto per questo, sebbene sia meno ben testato. Tuttavia, il tuo frontend può anche controllare l'utilizzo dello stack per evitare di aver bisogno di supporto in LLVM.