Recollida d'escombraries

De Viquipèdia
Dreceres ràpides: navegació, cerca

La recollida d'escombraries (de l'anglès, garbage collection ) és un mecanisme implícit de gestió de memòria implementat en alguns llenguatges de programació de tipus interpretat o semi-interpretat. Aquest concepte fou desenvolupat per John McCarthy a 1959 per evitar la gestió manual de memòria en el llenguatge Lisp.[1]

Context[modifica | modifica el codi]

Recollida d'escombraries: L'espai de memòria es va reservant i omplint amb diferents dades (acolorides), algunes d'elles es van alliberant, deixant buits (de color blanc) en l'espai de memòria. Quan ja no queda espai seguit disponible, o quan ho decideix la rutina de recollida d'escombraries, la memòria és compactada, posant al principi totes les dades que estan en ús, i consolidant tots els buits de memòria al final, quedant així un gran àrea continua de memòria disponible per a la futura creació d'objectes.

Qualsevol programa informàtic fa ús d'una certa quantitat de memòria de treball posada a la seva disposició pel sistema operatiu. Aquesta memòria ha de ser gestionada pel propi programa per:

  • Reservar espais de memòria per al seu ús.
  • Alliberar espais de memòria prèviament reservats.
  • Compactar espais de memòria lliures i consecutius entre si.
  • Portar compte de quins espais estan lliures i quines no.

Generalment, el programador disposa d'una biblioteca de codi que s'encarrega d'aquestes tasques. No obstant això, el propi programador és responsable d'utilitzar adequadament aquesta biblioteca.

Això té l'avantatge que es fa un ús eficient de la memòria, és a dir, els espais de memòria queden lliures quan ja no són necessaris. Tanmateix, aquest mecanisme explícit de gestió de memòria és propens a errors. Per exemple, un programador pot oblidar alliberar la memòria de manera que, tard o d'hora, no quedi memòria disponible, avortant l'execució del programa.

Com alternativa és necessària una gestió implícita de memòria, on el programador no és conscient de la reserva i alliberament de memòria. Això és obligat en alguns llenguatges de programació on no es maneja el concepte de memòria. Per exemple en llenguatges declaratius com Lisp o Prolog.

Funcionament[modifica | modifica el codi]

Quan un llenguatge disposa de recollida d'escombraries, el programador no ha d'invocar una subrutina per alliberar memòria. La reserva de memòria també és més o menys automàtica sense la intervenció del programador. Per exemple:

  • En els llenguatges orientats a objectes: es reserva memòria cada vegada que el programador crea un objecte, però aquest no ha de saber quanta memòria es reserva ni com es fa això.
  • En els llenguatges declaratius: cada vegada que es construeix una expressió es reserva memòria (d'una manera intel·ligent), però el programador no és conscient d'això.

Quan es compila el programa, automàticament s'inclou en aquest una subrutina corresponent a l' recol·lector d'escombraries . Aquesta subrutina també és invocada periòdicament sense la intervenció del programador.

El recol·lector d'escombraries és informat de totes les reserves de memòria que es produeixen en el programa. A més, el compilador col·labora perquè sigui possible dur un compte de totes les referències que hi ha a un determinat espai de memòria reservat.

Quan s'invoca el recol·lector d'escombraries, recorre la llista d'espais reservats observant el comptador de referències de cada espai. Si un comptador ha arribat a zero significa que aquest espai de memòria ja no s'usa i, per tant, pot ser alliberat.

Naturalment, aquest procés consumeix un cert temps en què no es fa res veritablement útil per al propòsit del programa. Per tant, no pot ser invocat amb massa freqüència.

En conseqüència, l'únic inconvenient a aquest mecanisme és determinar quan s'ha d'executar el recol·lector d'escombraries. Hi ha diversos algorismes per fer-ho, però el més eficient és el primer d'ells:

  • Esperar que no quedi memòria lliure, i llavors, executar el recol·lector d'escombraries.
  • Fixar un llindar d'ocupació de la memòria lliure i executar el recol·lector d'escombraries quan se superi aquest llindar.
  • Executar el recol·lector d'escombraries a intervals regulars (no sempre és possible).
  • Executar el recol·lector d'escombraries just abans de cada reserva de memòria.
  • Permetre al programador que invoqui explícitament al recol·lector d'escombraries quan vulgui.

Avantatges i desavantatges[modifica | modifica el codi]

Els avantatges i desavantatges d'aquest mecanisme de gestió de memòria són les oposades al mecanisme explícit:

  • El programador no pot cometre errors i queda alliberat de la tediosa tasca de gestionar la memòria.
  • La memòria roman retinguda durant més temps del estrictament necessari.
  • El recol·lector d'escombraries triga cert temps a fer la seva tasca i produeix pauses que poden fer la tècnica incompatible amb sistemes de temps real.

Implementació[modifica | modifica el codi]

Hi ha la possibilitat d'implementar la recollida d'escombraries com una biblioteca de codi més, però per norma general no és així. El mateix disseny de certs llenguatges de programació fa necessària l'existència del recol·lector d'escombraries. Per poder implementar aquests llenguatges es requereixen dues actuacions:

  • Que el compilador proporcioni la informació necessària per al recol·lector d'escombraries (el comptador de referències).
  • Que el entorn d'execució o màquina virtual implementi la subrutina del recol·lector d'escombraries.

Exemples de llenguatges amb Acces d'escombraries[modifica | modifica el codi]

Vegeu també[modifica | modifica el codi]

Nota[modifica | modifica el codi]

  1. Dennis Chester Smolarski. The essentials of data structures. Research & Education Assoc., March 1990, p. 161–. ISBN 9780878918379 [Consulta: 1 juliol 2011]. 

Enllaços externs[modifica | modifica el codi]