Boehm axlat yig'uvchi - Boehm garbage collector

Boehm-Demers – Weiser axlat yig'uvchisi
Ombor Buni Vikidatada tahrirlash
YozilganC va C ++
Turiaxlat yig'uvchi
Litsenziyao'xshash X11 (bepul dasturiy ta'minot )
Veb-saytwww.hboehm.info/ gc/

The Boehm-Demers – Vayzer axlat yig'uvchisi, ko'pincha oddiygina sifatida tanilgan Boehm GC, a konservativ axlat yig'uvchi uchun C va C ++[1] Hans Boem, Alan Demers va Mark Vayzer.[2][3]

Boehm GC bu bepul dasturiy ta'minot ostida taqsimlangan ruxsat etilgan bepul dasturiy ta'minot litsenziyasi ga o'xshash X11 litsenziyasi.

Dizayn

Xans Boem kollektorning ishlashini quyidagicha tavsiflaydi:

Kollektor mark-sweep algoritmidan foydalanadi. Bu kerakli darajada virtual xotirani qo'llab-quvvatlaydigan operatsion tizimlar ostida bosqichma-bosqich va avlodlar to'plamini ta'minlaydi. (Hozirda bu turli xil cheklovlarga ega SunOS [45], IRIX, OSF / 1, Linux va Windows-ni o'z ichiga oladi.) Ob'ekt to'planganda yakuniy kodni chaqirishga imkon beradi. Ko'rsatkichlarni topish uchun tipdagi ma'lumotlardan foydalanish mumkin, agar bunday ma'lumotlar taqdim etilsa, lekin odatda bunday ma'lumotsiz foydalaniladi.

Boehm GC ham ishga tushishi mumkin qochqinlarni aniqlash rejimi[4] unda xotirani boshqarish hanuzgacha qo'lda amalga oshiriladi, ammo Boehm GC uning to'g'ri bajarilganligini tekshirishi mumkin. Shu tarzda dasturchi xotira sızıntılarını va er-xotin taqsimotlarni topishi mumkin.

Boehm GC shuningdek a bilan tarqatiladi C simli ishlov berish kordonlar deb nomlangan kutubxona. Bu shunga o'xshash arqonlar C ++ da (daraxtlar doimiy kichik massivlar), lekin to'g'ri taqsimlash uchun mos yozuvlarni hisoblash o'rniga, bo'sh narsalarga axlat yig'ishga ishonadi. Kordonlar juda katta hajmdagi matnlarni boshqarish, ularni o'rtada o'zgartirishlar, tilimlash, birlashtirish va o'zgarishlarning tarixini saqlashda yaxshi (bekor qilish / funksiyani qayta bajarish).

Ishlash

Axlat yig'uvchi ko'pgina o'zgartirilmagan C dasturlari bilan ishlaydi, shunchaki almashtirish bilan malloc () bilan GC_MALLOC () qo'ng'iroqlar, almashtirish realloc () bilan GC_REALLOC () qo'ng'iroqlarni olib tashlash ozod() qo'ng'iroqlar.[1] Quyidagi kod qismida an'anaviy o'rniga Boehmdan qanday foydalanish mumkinligi ko'rsatilgan malloc va C da bepul.[5]

# shu jumladan <assert.h># shu jumladan <stdio.h># shu jumladan <gc.h>int asosiy(bekor){    int men;    konst hajmi = 10000000;    GC_INIT();    uchun (men = 0; men < hajmi; ++men)    {        int **p = GC_MALLOC(o'lchamlari *p);        int *q = GC_MALLOC_ATOMIC(o'lchamlari *q);        tasdiqlash(*p == 0);        *p = GC_REALLOC(q, 2 * o'lchamlari *p);        agar (men == hajmi-1)            printf("Uyning kattaligi =% zu n", GC_get_heap_size());    }    qaytish 0;}

To'liqlik uchun, boehm orqali aniq kelishuvni qo'llab-quvvatlaydi GC_FREE ().[6] Barcha almashtirishni oldindan protsessor makroslari yordamida amalga oshirish mumkin.

Foydalanish va portlar

Boehm GC C yoki C ++ da amalga oshiriladigan ko'plab loyihalar tomonidan qo'llaniladi Inkscape, shuningdek, boshqa bir qator tillar uchun ish vaqti muhiti bilan, shu jumladan Kristal, Java uchun GNU kompilyatori ish vaqti muhiti Portable.NET loyiha, O'rnatiladigan oddiy Lisp, GNU Guile, Mono amalga oshirish Microsoft .NET platforma (shuningdek, 2.8 versiyadan beri aniq kompakt GC dan foydalaniladi), GNUstep ixtiyoriy ravishda va libgc-d[7] (uchun libgc uchun majburiy D dasturlash tili, asosan ishlatilgan MCh ). Bu ko'pchilikni qo'llab-quvvatlaydi operatsion tizimlar, shu jumladan ko'p Unix variantlar (masalan macOS ) va Microsoft Windows va bir qator rivojlangan funktsiyalarni, jumladan, qo'shimcha yig'ish, parallel yig'ish va boshqalarni taqdim etadi yakunlovchi semantik.

Adabiyotlar

  1. ^ a b Koranne, Sandeep (2011), Ochiq manbali vositalar bo'yicha qo'llanma, Springer, 151-154 betlar, ISBN  1441977198.
  2. ^ Xans Boem, C va C ++ uchun axlat yig'uvchi
  3. ^ Endryu V. Appel (1998), C da zamonaviy kompilyatorni amalga oshirish - "Boehm konservativ axlat yig'uvchisi "
  4. ^ Axlat yig'uvchidan qochqinlarni aniqlash vositasi sifatida foydalanish
  5. ^ Axlat yig'uvchidan foydalanish: oddiy misol
  6. ^ "Axlat yig'uvchi interfeys". www.hboehm.info.
  7. ^ libgc-d

Tashqi havolalar