2015-09-28 10 views
11

Nel file runtime/proc.go dello Go source code, ci sono molti commenti relativi alle funzioni di punto di sicurezza , che sembrano essere correlate a punti nel tempo in cui è sicuro raccogliere i dati inutili. Tuttavia, non sono riuscito a trovare alcuna definizione di queste funzioni.Quali sono le "funzioni punto sicuro" a cui si fa riferimento nel codice sorgente Go?

Cosa sono le funzioni di punto di sicurezza , a cosa servono e quali sono alcuni esempi di tali funzioni?

+5

Questi sono dettagli di implementazione del GC e del runtime, che non sono accessibili nella lingua stessa. Se stai chiedendo la nostra curiosità su come funziona questa specifica versione del runtime, questa è una cosa, ma non ha conseguenze per nessun codice scritto dall'utente. – JimB

+0

@JimB, Sto cercando di capire l'implementazione della libreria di threading in Go (ovvero i dettagli di come le goroutine sono implementate e pianificate) e questo sembra essere almeno tangenzialmente correlato al comportamento del GC e ai punti sicuri. Hai ragione, questo non ha nulla a che fare con l'uso della lingua. – merlin2011

+2

Non sono aggiornato sul runtime corrente, ma questo è strettamente legato al GC, [questo talk] (http://talks.golang.org/2015/go-gc.pdf) potrebbe interessare tu, con [video] (https://www.youtube.com/watch?v=aiv1JOfMjm0). – JimB

risposta

1

Ecco tutto ciò che potrei trovare su questo argomento.

Ho trovato qualche discussione sui punti di sicurezza GC di Go here.

Sembra che i punti di sicurezza (come usati nella realizzazione Go) sono effettivamente la stessa come la definizione tradizionale di un punto sicuro:

punti chiave in cui il GC in grado di monitorare ciò che tutte le variabili e registra attesa

Un altro utente sullo stesso filo menziona che il GC

piega dei punti prelazione nel controllo pila s durante la funzione prologs

e che la fonte di questa affermazione è la seguente: https://github.com/golang/go/issues/10958

Secondo this post sulla mailing list golang-dev, safepoints sono chiamati anche "siti di chiamata".

Per avere un'idea della natura dei punti di sicurezza di Go, penso che sia importante osservare l'evoluzione del suo GC. This post cita quanto segue:

Prima di Go 1.5, Go ha utilizzato un parallelo stop-il-mondo (STW) collettore.

Go 1.5 introduce un collettore simultaneo.

Un'altra risposta a questa domanda cita:

Come di Go 1.7, l'unica fonte di infinita e ri-scansione potenzialmente è impilare non banale stop-il-mondo (STW) tempo rimanente .

A partire da 1.8, sembra worst-case stop-the-world times have been improved.

Inoltre, here è l'implementazione corrente del garbage collector di Go. Se leggi i commenti, vedrai che si tratta di un raccoglitore di mark-sweep non generazionale. Potete leggere di più su questo qui: https://blog.plan99.net/modern-garbage-collection-911ef4f8bd8e#.udz1kjk3b

Infine, here è un vecchio post di Gil Tene sulla mailing list golang-dev che motiva l'uso di un garbage collector in movimento.Egli affermò (nel 2012) che Go stava usando un "conservatore, non trasferitore" e discusse le caratteristiche dei punti di sicurezza che avrebbero permesso un immondizia da lungo tempo.

Mentre il raccoglitore di rifiuti di Go è stato moving away from long pauses ed è ora un "concorrente, tricolore, raccoglitore di sweep del contrassegno", è ancora un GC non generazionale. Sembra che Go's GC stia sviluppando idee GC degli anni '70 piuttosto che moderni approcci aziendali.

Sembra che la nozione di Go di un safepoint sia più in linea con la nozione tradizionale di safepoint piuttosto che safepoint con qualità moderne che consentono la raccolta dei rifiuti generazionale.

Problemi correlati