Tudd Intuíció, előadás, memória kezelése
szemétgyűjtő
A leggyakoribb és teljesen kielégítő megoldás csak az automatikus szemétgyűjtő, vagy egyszerűen csak szemétgyűjtés.
Szemétgyűjtő mechanizmus
A szemétgyűjtő (garbage collector) - függvénye a végrehajtó rendszer (runtime rendszer) programozási nyelv. A szemétgyűjtő a kimutatást és ártalmatlanítására elérhetetlen objektumokat anélkül, hogy kezelje az alkalmazást, bár az alkalmazás rendelkezésére áll különböző eszközök ellenőrzési munka kollektor.
A részletes vizsgálata az összes problémát szemétgyűjtő egy külön könyvet. (A végén az előadás, hogy a bibliográfia ebben a kérdésben.) Nézzük az általános elveket és a felmerülő problémák, a hangsúly a tulajdonságok, amelyek fontosak a szoftverfejlesztők.
egy szemétgyűjtő követelmények
A szemétgyűjtő kell kétségtelenül helyes, hogy megfeleljen két követelménynek:
Tulajdonságait szemétgyűjtő
Jóság. minden egyes összegyűjtött objektumot elérhetetlen.
Teljesség. Minden elérhetetlen tárgy kell gyűjteni.
Minőség - abszolút követelmény: jobb nem gyűjt szemetet dobja a kívánt objektumot. Meg kell teljes bizalommal, hogy a memória kezelése lehet bízni vakon. Sőt, meg kell elfelejteni, hogy szinte minden, ügyelve arra, hogy valaki valahogy így rendezettebbé a programban, valamint valaki valahogy elveszi a szemetet az irodában, ha nem, de nem tiszta, miközben a könyveket, számítógép és a családi fotók az asztalra.
Teljesség kívánatos - anélkül, hogy akkor is befut a probléma, hogy a szemétgyűjtő kell döntenie, hogy a memória kárba haszontalan tárgyak. De nem lehet a kereslet tökéletesség: kollektor lehet hasznos, ha összegyűjti a nagy törmeléket, néha kihagyom egy vagy két tárgyat.
Ez a megfigyelés szorul. A gyakorlatban minden üzletszerűen kollektor teljesnek kell lennie. Teljesség a gyakorlatban is szükség van, mivel a minőség, de kevésbé szigorú parafrazálva definíciója: „minden elérhetetlen objektumot kell végül össze.” Tegyük fel, hogy tudjuk, hogy az összeszerelési folyamat hatékonyabbá, köszönhetően egy olyan algoritmus, amely összegyűjti minden elérhetetlen cél, de késhet hivatkozva néhány közülük: egy ilyen rendszer elfogadható lenne a legtöbb esetben. Ezt az elképzelést vitatták további algoritmus „generációs szemétgyűjtés”, amely hatékony legyen, a legtöbb pásztázza a memóriaterület, amely elérhetetlen tárgy nagyobb valószínűséggel, és kevésbé valószínű, hogy figyelni, hogy más területeken memóriát.
Egy ilyen kompromisszum a szemétgyűjtő kell adnia nemcsak a bináris kritériumok a teljesség és a minőség, de a feltétel az úgynevezett időszerűsége (időszerűség). Értéke az időintervallum attól a pillanattól kezdve, amikor az objektum lesz elérhetetlen, amíg a rendelkezésére, és fontos, mint az átlagos idő értéke és felső határa.
Meghatározása a minőség rávilágít kapcsolatos nehézségek szemétgyűjtő valamilyen programozási nyelv, és a szerepük a nyelv és annak végrehajtását. Miért, például szemétgyűjtő általában nem alkalmazható a C ++? Általában idézett összefüggő okok miatt a tenyészet: a világ minden fejlesztő kell vigyázni, hogy a „játékok” (a Stephenson); ő egyszerűen nem bízik az automatikus kezelésére szolgáló mechanizmust indított. De, ha ez volt az igazi ok, nem utólagos igazolása, C ++ környezetben is legalább ajánlat szemétgyűjtő Hogyan lehet csatlakozni egy lehetőség, de a legtöbb implementáció nem.
Az igazi probléma abban rejlik, a szerkezet a nyelv, de nem fordítóprogram technológia vagy kulturális hagyományok. C ++, C követi, lazán gépelt; ez biztosítja a képességét, hogy a típusa egy tárgy, amelyen keresztül az egyik típusú idézhető mint a lényege a különböző típusú. építés:
A probléma megoldására különböző módszereket javasoltak. Széles felhasználási kaptak, mert a korlátozásokat. A Java nyelv lehet tekinteni, mint egy család C ++ nyelven, amely bevezette jelentős korlátozásokat a rendszer típusától, amíg eltávolítását többszörös öröklés és egyetemessé tenni végre lehetővé szemétgyűjtő program a világon, amely a C.
Ha gondosan megtervezett típusú rendszer, természetesen lehetséges, hogy összekapcsolják a többszörös öröklődés és egyetemessé biztonsági típusok és támogatás hatékony szemétgyűjtő.
Alapján szemétgyűjtő
Tekintsd meg az szemétgyűjtő.
Ahogyan az a referencia számlálás, létesítmények közé tartozik egy további mező, amely itt megjelölni. De a szükséges memória ezen a területen jelentéktelen - csak egy kicsit minden objektum. Mint látni fogjuk, ha tanulmányozza a dinamikus kötés képességeit OO végrehajtása megköveteli, hogy az objektum egy kiegészítő belső információk (pl típus). Ez az információ jellemzően egy vagy két szó minden objektum. Bit védjegyek része lehet a hivatalos szó, és nem fog több memóriát.
Építsen egy „mindent vagy semmit”
Amikor arra van szükség, hogy aktiválja a szemétgyűjtő?
Klasszikus szemetesek aktiválódnak a kereslet és a munka befejezését. Más szóval, a szemétgyűjtő nem működik, ez még mindig a memória a kérelmet. Amint ez nem elég, az alkalmazás elindul egy teljes szemétgyűjtő ciklus - egy fázis védjegy és a következő fázisban a takarítás.
Ez a technika lehet leírni, mint „mindent vagy semmit”. Előnye, hogy nem okoz túlterhelést, amíg elég memória. Amikor a program túlmutat a hozzáférhető forrásokat, a büntetés az úgynevezett szemétgyűjtő.
Egy ilyen rendszer lehet még elfogadható kötegelt alkalmazások. De itt nagy sebességgel a virtuális memória a valós túlterhelés okozhat komoly veszteséget a teljesítmény, ha a rendszer létrehoz egy nagy számú objektum, csak egy kis része, amely minden pillanatban elérhető.
A szemétgyűjtés egy „mindent vagy semmit” nem fog működni az interaktív rendszerek, vagy valós idejű rendszerek. Mi képviseli a rakétatámadás figyelmeztető rendszer, amely egy 50 ms-os intervallum, hogy válaszoljon a rakéta indítása. Tegyük fel, hogy a program tökéletesen működött, amíg a rendszer túllépett a határain a memóriát, de sajnos ez az esemény zajlott idején a rakéta indítása, amikor ahelyett, hogy a rendszer kezdte meg működését, kényelmes szemétgyűjtő.
Ezekben az esetekben a probléma nem a globális hatása időveszteséggel járó szemétgyűjtés: egy bizonyos termelékenység kiesése lehet elég megengedett a fejlesztők és a felhasználók számára, mivel a fizetés a megbízhatóság és kényelmet nyújt az automatikus szemétgyűjtés. De átmeneti veszteségeket egyenletesen kell elosztani. Elfogadhatatlan kiszámíthatatlan permetezésre aktivitását a szemétgyűjtő. Jobb teknős, mint nyúl, időről időre előzetes értesítés nélkül alszik egy fél órát. Referencia számolás, ha nem az ő végzetes hibája, amely kielégíti a szlogen: „jobb, ha megy lassan, de állandó sebességgel, a gyorsabb, de a váratlan és kiszámíthatatlan leáll.”
Természetesen ideiglenes elvesztése ne csak az állandó, hanem kicsi. Ha a kérelem nem szemétgyűjtés - nyúl, senki sem vállalja, hogy cserélje ki egy teknős. Jó szemétgyűjtő kell adnia a késedelem nem több, mint 5-15%. Bár egyesek azt mondják, hogy ez elfogadhatatlan, és tudom, hogy jó néhány alkalmazás, hogy szükség alacsonyabb költségek mellett. Azt is figyelembe kell venni, hogy a kézi ártalmatlanítás szükséges hiányában szemétgyűjtő, és nem szerzés körül nélkül költségeit. Annak ellenére, hogy az összes költséget, szemétgyűjtő van szükség.
A vita során kiderült, két további problémát hatékonyságának szemétgyűjtő: Global teljesítmény (teljes teljesítmény) és a start-stop üzemmódban (incrementality).
Advanced (Speciális) megközelítése szemétgyűjtő
Egy jó kollektor kell biztosítania a jó teljesítmény, dolgozik, mint egy állandó, és a start-stop üzemmódban van, egyre elfogadható interaktív alkalmazások, vagy akár valós idejű rendszerek.
Ezért az első követelmény - engedélyezni kell a fejlesztők számára, hogy kezelje indítási és leállítási ciklusokat kollektor. Különösen a könyvtár által kínált eljárások:
Hívásakor először megáll a kerékpározás szemétgyűjtő további értesítésig; második - kollektor tartalmaz visszaállítják a normális üzemi állapot; Harmadszor -, hogy a gyűjtő azonnal egy teljes működési ciklus alatt. Tegyük fel, hogy a rendszer egy kritikus időben a teljesítmény rész, ami nem kell semmilyen kiszámíthatatlan időbeli késések. Ebben az esetben a fejlesztő okozhat collection_off elején ebben a szakaszban, és collection_on a végén; bármely más ponton, ahol az alkalmazás üresjáratban (például során a bemeneti vagy kimeneti), akkor fuss collect_now.
Gyakorlati végrehajtása a generációs szemétgyűjtés számos változatban. Különösen tárgyak általában osztva nem csak a fiatal és az öreg, de nagyobb számú generációk különböző stratégiák építeni a szemetet a különböző generációk.
Algoritmusok párhuzamos szemétgyűjtő
A teljes megoldást a problémára a munka start-stop üzemmódban válassza a szemétgyűjtő nagyon vonzó egyetlen végrehajtási szál természetesen támogatást nyújtott többfeladatos operációs rendszer. Ez a technika ismert például a szemétgyűjtő "röptében" (on-the fly), vagy párhuzamos.
Során szemétgyűjtő menet végrehajtása objektum-orientált rendszer két külön áramban (gyakran megfelelő két különböző operációs rendszer folyamat): alkalmazás és a kollektor. Ha az alkalmazás memóriát tárgyak segítségével meghatározott irányelvek; Csak kollektor felszabadítja a memóriát visszaigénylő műveleteket.
Collector folyamatosan fut, ismétlődő szakasz védjegy és a pálya tisztító fázis észlelésére és eltávolítására elérhetetlen tárgyakat.
Külön áramot nem feltétlenül különálló folyamat. Ezek lehetnek, annak érdekében, hogy elkerüljék a további költségek közötti váltás folyamatok vagy szálak, korutinokat lapos. (Több coroutine lesz szó 12. fejezetében során „alapjai objektum-orientált tervezés,” úgy „párhuzamosság”)
Még így is, a szemétgyűjtő röptében a gyakorlatban nem kielégítő az általános termelékenységet. Ez azért is sajnálatos, mert a módszer elég jó, különösen, ha a használata Dijkstra algoritmus (lásd. Bibliográfiai hivatkozás).
Ez a gondolat változást igényel a domináns hardver architektúra és valószínűleg nem valószínű, hogy talál egy gyorsabb alkalmazására. Remélem, hogy a válasz a kérdésre, néha kérték -
„Milyen hardver legalkalmasabb tárgy technológia?” -
Az első elem a listán a kívánságait lesz a rendelkezésre álló egy külön processzor szemétgyűjtő.