Senrubigo (en komputado)

En komputado senrubigo estas agado por aŭtomate (per fona tasko) kolekti kaj redisponigi ne plu uzatajn pecojn da ĉefmemoro (la «makulaturon»).

La procezo kiu faras tion, kaj ĝia programo (aŭ la koncerna parto de rultempa sistemo de programaro) estas senrubigilo.

Plenumo de programado konsistas interalie el kreado de multaj datumblokoj, ĉiu el kiuj okupas parton en la memoro, kiu iam devas esti liberigata por reuzo.

Programlingvo ĝenerale havas konstruilon kiu kreas novan objekton, ekz‑e tiel:
 Konto k = new Konto();
kaj ekokupas memoron. La posta malokupo povas okazi per la eksplicita voko de detruilo — kiel en la programlingvo C++, per
 delete k;
aŭ ĉe eliro el bloko, aŭ povas okazi fone, per kolektado de rubo (makulaturo) en aparta interna tasko, kiel en Lispo aŭ Ĝavo.

La eksplicita liberigo estis longe favorata, kiel la plej rapida kaj tuja. Tamen ĝi riskas fragmentiĝon de la memoro (en la tuta memoro estiĝadas truoj de libera memoro, tro malgrandaj por reuzi) kaj cima programado (ne liberigante objektojn).

dekstra|eta|Senrubigo kaj kompaktigo de memoro
Por ripari troan fragmentiĝon oni bezonas kompaktigi la memoron.

La aŭtomata senrubigilo sekurigis ekzemple Ĝavon (Java), sed komence zorgis pri maloftaj, sed tiuokaze rimarkeblaj paŭzoj kiam la tuta memoro estis senrubigata. Per Java SE 6 jam preskaŭ realtempaj postuloj rilate al la senrubigo eblas, kaj jam antaŭ tio ekzistis realtempaj Java rultempmaŝinoj de aliaj partioj.

Ĉi-tempe la rapideco de Java kun senrubigo povas esti pli alta ol C++ kun eksplicita liberigo. La kialo estas ke la memoradministrado en C++ (kreado, forigado) ankaŭ kostas tempon, precipe se oni samtempe volas preventi tro grandan fragmentiĝon de memoro.

Oni konkludu ke inter ambaŭ sistemoj de kreado kaj liberigo de memoro ne ekzistas vera gajnanto. La teorie pli bonaj funkciaj lingvoj jam ĉiam aplikis senrubigilon, ĉar la datumoj estas kreitaj kiel rezulto de funkcivokoj, kaj ne ekzistas variabloj kiel adreso de iu memorbloko.

Kategorio:Memoradministrado