منو
 صفحه های تصادفی
مهارت های تنیس
خج
تیره بهمنیان
علل رایج تخریب سدهای خاکی
علف هفت بند «داروئی»
رشته الکترونیک هواپیما
تنظیم فعالیت ژنها بوسیله هورمونها
رهایی از اضطراب روز قیامت با ولایت امام علی علیه السلام
سایر اماکن اسلام آباد
تابع معکوس
 کاربر Online
350 کاربر online
تاریخچه ی: زباله روبی خودکار

||V{maketoc}||
^@#16:
!زباله روبی خودکار

{*در عملیات ((محاسباتی))، __زباله روبی__ بخشی از سیستم مدیریت حافظه است که حافظه استفاده شده توسط اشیائی را که از این پس به آنها ارجاع داده نمی شود بازیابی نموده، جهت استفاده مجدد آماده می کند. ومعمولاً با عنوان GC ارجا داده می شود. بخشی از سیستم که این عمل را انجام می دهد __زباله روب__ نام دارد.

زباله روب معمولاً به طور داخلی در خود زبان تعبیه شده و بخشی از سیستم زمان اجرای آن به حساب می آید. زباله روبی توسط ((جان مک کارتی)) و به عنوان بخشی از اولین سیستم زبان ((Lisp)) ابداع گردید. زمانی که شخصی راجع به یک زبان زباله روب شده بحث می کند، می توان پی برد که زیاله روبی یکی از خصایص این زبان است زبان های رسمی وجود دارند که در هر پیاده سازی عملی خود به زوباله روب نیاز دارند ولی از آنجایی که این زبانها به عنوان زبان های ((برنامه نویسی عملی)) استفاده نمی شوند نیازی به زباله روب نیست. از این جمله می توان به ((زبان جبری لامدا)) اشاره نمود.

اساس نحوه کار کرد یک سیستم زباله روب به شرح زیر است:
1- تشخیص آن دسته از اشیاء داده ای که از مرحله ای به بعد ارجاع داده نمی شوند.
2- آزاد سازی فضای استفاده شده توسط آنها.

از آنجایی که تشخیص دقیق آخرین زمانی که یک شیء در برنامه استفاده شده غیر ممکن است، سیستم زباله روب از تخمین هایی استفاده می کند که توسط آنها قادر به تشخیص این که آیا اشیاء در آینده ارجاع داده خواهد شد یا خمیر می باشد. برای مثال اگر در یک سیستمی هیچ ((ارجاع)) به یک شیء خواص دیده نشود، این شیء جزو زباله مخسوب می شود.

این روش، استانداردی است که توسط بسیاری از زباله روبهای مدرن استفاده می شود. در ادامه زباله روبهای ردیاب را بررسی خواهیم کرد.

در عین این که زباله روبی به مدیریت حافظه کمک شایانی می کند، زبان را از لحاظ ((امنیت داده ای)) نیز قوی می کند چرا که از بسیاری خطاهایی زمان اجرا ممانعت می کندو برای مثال از خطاهای اشاره گرهای سرگردان ممانعت می کند. این خطای اشاره گر سرگردان زمانی رخ می دهد که مکان اشاره شده آزاد شده ولی اشاره گر همچنان به آن مکان اشاره می کند.*}
---
!زباله روبهای ردیاب

{*این نوع زباله روبها، عادی ترین و رایج ترین انواع زباله روبها را تشکیل می دهند. این نوع از زباله روبها بر یافتن اشیاء قابل دسترس متمرکز می شوند، این اشیاء، اشیائی هستند که در آینده به آنها ارجاع شد. و سپس بقیه ی اشیاء باقی مانده ی بدون ارجاع را از بین می برند.

!قابلیت دسترسی به یک شیء
به طور رسمی، اشیاء می توانند تنها از دو طریق مورد دسترس قرار گیرند.

1- همواره مجموعه ی متمایزی از اشیاء با عنوان ریشه قابل دسترسی محسوب می شوند. در یک سیستم عادی، این اشیاء عبارتند از: رجیستری های ماشین، پشته، اشاره گر دستورالعملی، و متغیرهای سراسری. به عبارت دیگر تمام چیزهایی که مستقیماًقابل دسترسی هستند به این دسته تعلق دارند.
2- هر چیزی که از طریق یک شیء قابل دسترسی با خصوصیات فوق ارجاع داده شود، خود نیز قابل دسترسی است.

به طور غیر رسمی یک شیء قابل دسترسی،نوعی است که برنامه با آغاز از یک شیء و دنبال کردن زنجیری از مرجع ها بتواند به آن دست یابد. *}
---
!الگوریتم اساسی

{*زباله روبهای ردیاب دوایر زباله روبی ایجاد می کنند. یک دور زمانی آغاز می شود که زباله روب به نحوی مطله می شود که باید حافظه آزاد شود که معمولاً این اطلاع رسانی زمانی رخ می دهد که سیستم با کمبود ((حافظه)) مواجه می شود. یک دور از مراحل زیر تشکیل شده است:
1- ایجاد مجموعه های ابتدایی سفید، خاکستری، سیاه: از این مجموعه ها برای کنترل روند توسعه در دور استفاده خواهد شد. در ابتدای ایجاد، مجموعه ی سیاه خالی است و مجموعه ی خاکستری شامل اشیاء ریشه و نیز برخی اشیاء که بسته به الگوریتم به کار رفته انتخاب می شوند بوده و مجموعه ی سفید شامل تمام چیزهای دیگر است.در هر لحظه ی زمانی دلخواه از اجرای الگوریتم یک شیء خاص تنها به یکی از این سه مجموعه تعلق خواهد داشت. می توان مجموعه ی سفید را خارج کرده و مجموعه کوچک تر خواهد شد.
2- (این مرحله تا زمان خالی شدن مجموعه ی خاکستری تکرار خواهد شد.) 1 شیء را از مجموعه ی خاکستری انتخاب کرده. تمام اشیاء در مجموعه ی سفید را که ازشیء انتخاب شده خاکستری قابل دسترسی هستند به مجموعه ی خاکستری منتقل نموده و شیء انتخاب شده ی اولی از مجموعه ی خاکستر به مجموعه ی سیاه منتقل می شود.
3- زمانی که هیچ شئی در مجموعه ی خاکستری وجود ندارد. می توان نتیجه گرفت که اشیاء باقی مانده در مجموعه ی سفید غیر قابل دسترسی هستند و لذا فضای اشغال شده توسط آنها آزاد می شود.

این مجموعه ی سه رنگی ثابت خصوصیت مهمی برای اشیاء و رنگ آنها محسوب می شود. که به زبان ساده عبارت است از:

هیچ شیء سیاهی مستقیماً به اشیاء سفید اشاره نمی کند.

توجه کنیم که در الگوریتم فوق بخش بخش اولیه ی هیچ شیئی سیاهی ندارد. همین طور زمانی که یک شیء سیاه می شود هر شیء که از طریق این شیء ارجاع می شد خاکستری می شود. زمانی که مرحله ی آخر الگوریتم اجرا می شود هیچ کدام از اشیاء مجموعه ی سیاه به مجموعه ی سفید اشاره نمی کنند. و نیز در این مرحله هیچ شیء خاکستری موجود نیست. بنا براین اشیاء سفید باقی مانده از طریق اشیاء ریشه قابل دسترس نیستند و لذا سیستم بخش نمایی کننده را فراخوانی کرده و حافظه ی اشغال شده توسط این اشیاء سفید آزاد می شود.

برخی از نسخه های الگوریتم، قانون سه رنگی فوق را با حفظ خصوصیات اصلی به نحوی متفاوت اجرا می کنند.*}
---
!نسخه های مختلف الگوریتم های اصلی

{*الگوریتم اصلی چندین نسخه دارد:
· بحثی تحت عنوان اینکه آیا زباله روب اشیاء را از حافظه پاک می کنند یا خیر ( یعنی آیا آدرس تغییر می کند) مطرح می شود که در نتیجه آن GC از نوع متحرک و غیرمتحرک مطرح می شود.
· برخی زباله روبها می توانند به درستی و کاملاً دقیق تمام اشاره گرها در یک شیء را تشخیص دهند، این زباله روبها، زباله روبهای دقیق نام دارند. در مقابل زباله روبهای مراقب و یا بخشی مراقب قرار دارند. زباله روبهای مراقب بایستی فرض کنند هر الگوی بیتی در حافظه نوعی اشاره گر است. اگر و فقط اگر به یک شیء تخصیص یافته اشاره کند. بنابراین ممکن است زباله روبهای مراقب به خاطر وجود الگوهای بیتی اشاره گرنما که در در حقیقت به هیچ شیء اشاره نمی کنند مرتکب خطا شوند. البته میزان این خطا در عمل بسیار کم است.
· بحث دیگری که مطرح می شود این است که آیا زباله روبها می توانند به طور موازی با دیگر برنامه ها اجرا شوند یا خیر . باید گفت زباله روبهای ابتدایی در حین اجرای یک دور بقیه ی سیستم را کاملاً متوقف می کنند که این انواع را انواع غیر افزایشی نامند. اما در مقابل انواع افزایشی قرار دارند که متناوباً و هم زمان با دیگر عملیات سیستم به فعالیت می پردازند. برخی از این زباله روبهای افزایشی کاملاً موازی با دیگر اعمال می شوند که معمولاً در سیستم های چند پردازنده ای قابل اجرا می باشد. اما به دلیل مشکلات مربوط به حافظه ی موقت در عمل مشکلاتی ایجاد می شود.*}
---
!علامت گذاری و رفت و برگشت

{*زباله روبهای ردیاب را می توان با توجه به این که سه مجموعه ی (سیاه ،سفید و خاکستری) به چه نحوی اجرا می شوند به دسته های مختلفی رده بندی نمود. یک زباله روب ((علامت گذاری- روبنده)) همراه با یک شیء 1 یا 2 بیت جهت مشخص نمودن رنگ سفید و سیاه فراهم می کند. مجموعه ی خاکستری به عنوان 1 لیست جدا ویا توسط یک بیت دیگر مشخص می شود. یک ((زباله روب کپی بردار)) یک زباله روب متحرک است که انواع ساده آن تمام اشیاء قابل دسترسی در حافظه را به یک بخش مشخص منتقل کرده و از حافظه باقیمانده مجدداً بهره برداری می کند. سود و فایده زباله روب کپی بردار خاصیت ((پراکندگی | تکه تکه ای)) بودن آن است.*}
---
!زباله روب در حال تولید

{*باید همواره زمان دقیق برای انجام یک دور مشخص شده و تعیین گردد چه اشیائی باید در مجموعه ی خاکستری قرار گیرند. یک زباله روب ساده، همواره اشیاء ریشه را در مجموعه ی خاکستری قرار خواهد داد. و تمام چیزهای دیگر را در مجموعه ی سفید. اگر کمی توجه کنیم خواهیم دید، اشیائی که در سیستم زمان اجرا اخیراً ایجاد شده اند، همان هایی هستند که به زودی غیر قابل دسترسی خواهند بود. یک ((زباله روب در حال تولید)) اشیاء را به نسلهایی تقسیم می کند و عموماً زیر مجموعه هایی از این نسلها را در مجموعه ی سفید قرار می دهد. در این حالت مجموعه ی خاکستری شامل مابقی اشیاء است. که این موضوع منجر به ایجاد دوره های سریع تر می شود.*}
#@
@#16:
---
!مضرات زباله روب های رد یاب

{*مشکلات اولیه زباله روب های رد یاب در چگونگی فراخوانی آنها است. یک دوره روبنده در هر زمانی ممکن است آغاز به کار کندو احتمالاً جهت کامل شدن زمان زیادی را صرف کند. هر چند این موضوع در بسیاری موارد قابل قبول است اما در کاربردهایی همچون برنامه های بلادرنگ که زمان مسئله مهمی است ایجاد مشکل می کند. ((زباله روب افزایشی)) امکان مقابله با این مشکل را فراهم می کند.

دیگر مشکل اصلی از این قرار است که مقادیری بسیار زیادی زباله مخصوصاً در زباله های برنامه نویسی ((تابعی)) پیش از آنکه زباله روب زمانی برای جمع بندی آنها داشته باشد ایجاد می گردد. که این منجر به کاهش کار آیی در تخصیص حافظه و طولانی تر شدن مدت زمان اجرای یک دوره می شود. در این حالت اصطلاح پیامواره به کار می رود.

جهت مشاهده پیامواره نبودن زباله روبهای ردیاب می توان به مثال زیر توجه کرد:
a : = 1
repeat forever
a : = a * 2
repeat a times
x : = new object
x : = o
در حالتی که زباله روب به صورت ذاتی در زبان گنجانده شده باشد، در هر بار اجرای حلقه فوق حافظه بیشتری تخصیص داده می شود تا زمانی که کل حافظه مصرف شود که باعث فراخوانی بالاجبار زباله روب می شود.

در نهایت مشکل اساسی که تمام زباله روبهای فعلی دارندتصور غلط در مصرف بودن حافظه تا زمان در دسترس بودن آن است. در بسیاری از سیستم ها، مراجع با اینکه استفاده نمی شوند، اما همچنان برای مدت طولانی حفظ می شوند. به همین علت تلاش گسترده ای در حال انجام است تا راههای بهتری جهت جمع آوری اشیاء به درستس تمیز داد. در سیستم های با زباله روب استاندارد، می توان عمل آزاد سازی حافظه را از طریق نابود کردن اشاره گرها توسط برنامه نویس، سرعت بخشد. که این موضوع به نوبه خود، بخشی از موضوع مدیریت حافظه را بر عهده برنامه نویس می گذارد.

به عنوان مثالی ساده، تابع شروع را در نظر بگیرید که آرگومانهای خط فرمان به آن ارسال شده باشند، عموماً برنامه ای که از این آرگومان استفاده می کنندابتدا آنها را تجزیه کرده و فرمان مربوطه را انجام خواهد داد.بدون اینکه با آرگومانها دوباره تماس داشته باشد. اما این آرگومانها همچنان در حافظه قرار دارندچرا که مرجع آنها در انتهای پشته قراردارند. با اینکه این اشیاء فضای زیادی اشغال نمی کنند، اماموقعیت های مشابه و تکرار آنها به دفعات زیاد، در کل حافظه ی زیادی به خود آنها اختصاص می دهد.
تمام این مسئله برای زباله روبها وبرای مدیریت حافظه به صورت غیر ضمنی اللخصوص در سیستمها با محدودیت زمانی مطرح می شوند. باید توجه کنیم که دیگر زباله روبها فاقد برخی از این مشکلات به استثنای مشکل آخر هستند. با این حال هر یک مشکلات خاص خود را دارند. لذا در استفاده از یک زباله روب باید به تمام موارد توجه کافی داشت.*}
---
!شمارش مرجع

{*شمارش مرجع نوعی زباله روبی که در آن هر شیء تعداداشیائی که به آن ارجاع داده اند را با خود به همراه دارد و شیئ زمانی آزاد می شود که این تعداد به صفر برسد. برای ساختارهای داده ای که ادوار مرجعی ندارند همچون درخت های دودویی ترجیح داده می شودتا از دیگر انواع زباله روبها استفاده نمود. همچنین در ساختارهای ادواری نیز برخی اوقات به دلایل صرفه جویی در زمان استفاده از یک شمارنده مرجع می تواند بهبود قابل ملاحظه ای را منجرب شود. مهمترین زیان این نوع زباله روب در مقابل زباله روب ردیاب فضا زمان مصرفی برای این شمارنده است. می تواند((شمارش مرجع)) را برای اطلاعات بیشتر بازدید کنید.*}
---
!زبانهایی که پیاده سازی های استاندارد آنها از زباله روبها خودکار استفاده می کند

*((Basic))
*((C#))
* ((OCaml)) و ((Caml))
*((D))
*((Dylan))
*((Eaffel))
*((Haskell))
*((ICI))
*((جاوا))
*((جاوا اسکریپت))
*((Lisp))
*((Lua))
*((مرکیوری))
*((مادیولا 3)) (یکی از اساسی ترین تفاوتهای مادیولای 3 با مادیولای 2 در استفاده از زباله روب است)
*((ML))
*((ابران))
*((پرل))
*((پیکو))
*((پایتون))
*((Q))
*((رابی))
*((اسکما))
*((اسمال تاک))
*((اسنوبل))
*((Tcl))
*((Visual Basic.NET))
---
!پیوند های خارجی

*[http://www.hpl.hp.com/personal/Hans_Boehm/gc/ ]
*[http://www.hpl.hp.com/personal/Hans_Boehm/gc/ ]
#@^

تاریخ شماره نسخه کاربر توضیح اقدام
 شنبه 15 مهر 1385 [10:38 ]   5   زینب معزی      جاری 
 شنبه 15 مهر 1385 [10:31 ]   4   زینب معزی      v  c  d  s 
 شنبه 15 مهر 1385 [10:31 ]   3   زینب معزی      v  c  d  s 
 سه شنبه 28 شهریور 1385 [11:59 ]   2   زینب معزی      v  c  d  s 
 شنبه 30 آبان 1383 [10:53 ]   1   حمید حسن نیا      v  c  d  s 


ارسال توضیح جدید
الزامی
big grin confused جالب cry eek evil فریاد اخم خبر lol عصبانی mr green خنثی سوال razz redface rolleyes غمگین smile surprised twisted چشمک arrow



از پیوند [http://www.foo.com] یا [http://www.foo.com|شرح] برای پیوندها.
برچسب های HTML در داخل توضیحات مجاز نیستند و تمام نوشته ها ی بین علامت های > و < حذف خواهند شد..