2015-12-24 8 views
9

Stavo riecheggiando il tutorial su Javascript di Mozilla e passo attraverso questa informazione.Perché sapere se è necessario un pezzo di memoria è indecidibile?

linguaggi avanzati incorporano un software chiamato "garbage collector", il cui compito è quello di monitorare l'allocazione di memoria e utilizzare per trovare quando un pezzo di memoria allocata senza più in qual caso , lo libererà automaticamente. Questo processo è un'approssimazione poiché il problema generale di sapere se è necessario un pezzo della memoria è indecidibile (non può essere risolto da un algoritmo).

mi è familiare con il concetto di indecidibilità e garbage collector, ma io non riesco a capire perché questo è un problema indecidibile?

+0

Dimmi come puoi sapere quando un pezzo di memoria viene riferito per ultimo? –

risposta

6

Tutti i garbage collector Ho familiarità con il lavoro raccogliendo memoria a cui non è più possibile accedere, ad es. tutte le variabili (la chiusura transitiva di) che puntavano ad essa sono andate oltre lo scopo. Ma questa è una sotto-approssimazione dell'insieme di spazi di memoria che possono essere raccolti, perché in qualsiasi punto una posizione di memoria può ancora avere una variabile che punta ad essa in ambito, eppure non sarà mai più accessibile.

Trovare il preciso insieme di spazi di memoria che possono essere raccolti è banalmente riducibile ad alcun problema indecisi - per esempio, trovare l'insieme di spazi di memoria che possono essere ritirati presso il punto A nel seguente programma:

x = allocate() 
// Point A 
if (result of some known-to-be-undecidable problem is true): 
    print(x) 

E quindi trovare quel set è indecidibile in sé.

+0

Non è banale che possa essere riducibile a qualsiasi problema indeciso –

+2

@NursultanZarlyk chiamiamo la soluzione del problema testato dall'istruzione if come 'P', e chiamiamo la decisione del raccoglitore se la memoria puntata da' x' può essere raccolto al punto A come 'C'. 'P =>! C' altrimenti il ​​nostro collezionista potrebbe raccogliere la memoria dal vivo, e'! P => C' poiché il nostro ipotetico raccoglitore non si sovrappone. Ciò significa che una soluzione per 'P' è anche una soluzione per' C', quindi è una riduzione. Cosa mi manca qui? – Oak

+0

La teoria del calcolo è sempre stata una magia per me. Grazie per la risposta profonda. –

7

Quindi è possibile modificare qualsiasi programma per allocare spazio nello heap e accedervi solo se il programma originale termina. Un garbage collector ottimale raccoglie quindi la memoria solo se il programma non termina.

Possiamo decidere se un programma terminerà o no?

Problemi correlati