بازیافت حافظه

از ویکی‌پدیا، دانشنامهٔ آزاد
پرش به: ناوبری، جستجو

در علوم رایانه بازیافت حافظه یا زباله‌روبی (به انگلیسی: Garbage collection) نوعی مدیریت حافظهٔ خودکار است. این حالت خاصی از مدیریت منابع است و منبع محدودی که مدیریت می‌شود، حافظه است. زباله‌روبی تلاشی برای بازیافت قطعات کوچک حافظه و ادغام آنها است که این حافظه‌ها قبلاْ توسط اشیاء به کار گرفته شد‌‌ه‌‌‌‌اند، ولی دیگر مورد نیاز برنامه نیستند. تکنیک بازیافت حافظه توسط جان مک‌کارتی در حدود سال ۱۹۵۹ برای حل مشکلات لیسپ اختراع شده‌است.

بازیافت حافظه معمولاْ به عنوان جنبۀ مخالف مدیریت دستی حافظه بیان می‌شود که در آن آزادسازی هر شی از حافظه به صورت دستی انجام و توسط برنامه‌نویس مشخص می‌شود. مانند سایر تکنیک‌های مدیریت حافظه، بازیافت حافظه میزان قابل توجهی از زمان کل اجرای یک برنامه را شامل می‌شود، در نتیجه می‌تواند تاثیر قابل توجهی روی کارایی برنامه داشته باشد. با استفاده از یک پیاده‌سازی مناسب، حافظۀ کافی و با توجه به کاربرد، بازیافت حافظه می‌تواند سریع‌تر از مدیریت دستی حافظه باشد. درحالی که مدیریت دستی حافظه در گذشته با استفاده از الگوریتم‌های غیر بهینۀ پاک سازی حافظه، یک راه حل بوده است.
همچنین منابع خاص دیگری به غیر از حافظه مانند سوکت‌های شبکه، پایگاه‌های داده و فایل‌ها به طور معمول با تکنیک زباله‌روبی مدیریت نمی‌شوند. روش‌هایی که برای مدیریت چنین منابعی استفاده می‌شود، به خصوص مخرب‌ها، ممکن است برای مدیریت حافظه کافی باشند و نیازی به استفاده از روش زباله روبی نباشد.[۱]

اصول بازیافت حافظه[ویرایش]

اصول ابتدایی زباله‌روبی حاکی از این است که در یک برنامه، اشیایی را که در آینده قابل دسترسی نیستند، پیدا کرده و حافظۀ تخصیص داده شده به آن‌ها را آزاد کنیم. بسیاری از زبان‌های برنامه نویسی به روش زباله‌روبی نیاز دارند، چه به عنوان بخشی از خصوصیات زبان برنامه نویسی( مانند جاوا، سی شارپ، گو، دی و بسیاری از زبان‌های اسکریپت‌نویسی) و چه به صورت موثر برای پیاده‌سازی‌های عملی مانند زبان صوری حساب لاندا. به چنین زبان‌هایی، زبان‌های زباله‌روبی می‌گویند. سایر زبان‌ها به گونه‌ای طراحی شده‌اند که مدیریت حافظۀ آن‌ها به صورت دستی انجام می‌شود، اما پیاده‌سازی زباله‌روبی هم دارند مانند C و ++C.
برخی از زبان‌ها مانند Ada، Modula-3 و C++/CLI هر دو قابلیت آزاد‌سازی دستی حافظه و زباله‌روبی را دارند و از دو هیپ جداگانه برای نگهداری اشیائی که با زباله‌روب حذف می‌شوند و اشیائی که به صورت دستی آزاد می‌شوند؛ استفاده می‌کنند.[۲]

مزایا[ویرایش]

بازیافت حافظه باعث می‌شود تا برنامه‌نویس دخالتی در مدیریت حافظه نداشته باشد، در نتیجه مشکلات برنامه نویسی زیر دیگر رخ نخواهند داد:

  • مشکل پوینتر سرگردان: این مشکل هنگامی رخ می‌دهد که بخشی از حافظه آزاد شده باشد اما همچنان اشاره‌گری به آن شئ در حال اشاره کردن باشد.
  • مشکل آزادسازی دوبارۀ حافظه: هنگامی که برنامه سعی می‌کند تا بخشی از حافظه، که قبلا پاک شده و یا شی جدیدی به آن اختصاص داده شده است را دوباره پاک کند، ایجاد می‌شود.
  • انواع مخصوصی از نشت حافظه: هنگامی که برنامه قادر نیست حافظه‌ای از اشیائی را که دیگر دردسترس نیستند، آزاد کند و درنتیجه فرسودگی حافظه رخ می‌دهد.
  • پیاده‌سازی کارآمد ساختمان داده‌های پایدار

استراتژی‌ها[ویرایش]

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

قابلیت استفاده[ویرایش]

به طور کلی بیشتر زبان‌های برنامه نویسی سطح بالا بازیافت حافظه را به عنوان ویژگی استاندارد دارا هستند. در برخی دیگر از زبان‌ها نیز می‌توان با استفاده از کتابخانه‌ها این ویژگی را اضافه کرد. مانند Boehm garbage collector در زبان‌های C و ++C. بیشتر زبان‌های برنامه‌نویسی تابعی مثل ML و Haskell و APL دارای ساختار زباله‌روب هستند. همچنین لیسپ نیز به عنوان اولین زبان برنامه‌نویسی تابعی و نیز اولین زبان با قابلیت بازیافت حافظه قابل توجه است. زبان‌های برنامه‌نویسی شئ‌گرا نیز معمولاً از زباله‌روب یکپارچه استفاده می‌کنند. هرچند ساختار آن برای Delphi و ++C متفاوت است.
محیط محدود
بازیافت حافظه به ندرت در سیستم‌های زمان واقعی استفاده می‌شود، زیرا نیاز شدید به کنترل برای استفاده از منابع محدود وجود دارد. با این حال زباله ‌روب‌های سازگار با این محدودیت محیط نیز گسترش یافته‌اند. NET Micro Framework. در ماکروسافت و Java Platform, Micro Edition سکوهای نرم‌افزاری زمان واقعی هستند که زباله‌روب دارند.
زباله‌روب دات‌ نت، تخصیص حافظه را مدیریت کرده و وظیفۀ آزاد‌سازی حافظه برای برنامه‌ها را بر عهده دارد. هنگامی که شئ جدیدی ساخته می‌شود، زبان مشترک زمان اجرا، حافظه‌ای از هیپ مدیریت به آن اختصاص می‌دهد و تا زمانی که فضای خالی و دردسترس وجود داشته باشد، این روند ادامه می‌یابد. اما به دلیل اینکه حافظه محدود است، زباله‌روب باید مجموعه اعمالی به منظور آزادسازی حافظه انجام دهد.این زباله‌‌روب بر اساس تخصیص حافظه‌ها، بهترین زمان را برای آزادسازی حافظه محاسبه می‌کند. هنگامی که این زباله‌روب مجموعه‌ای از اعمال را اجرا می‌کند، اشیائی که دیگر توسط برنامه‌ها استفاده نمی‌شوند را پیدا و بررسی کرده و اعمال لازم برای بازیابی حافظه را انجام می‌دهد.[۳]

منابع[ویرایش]

  1. https://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
  2. http://www.oracle.com/webfolder/technetwork/tutorials/obe/java/gc01/index.html
  3. https://msdn.microsoft.com/en-us/library/0xy59wtx(v=vs.110).aspx