مدیریت حافظه دوستانه

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


تکنیک مدیریت حافظهٔ رفاقتی یک الگوریتم برای مدیریت حافظه است که حافظه را به بخش‌هایی تقسیم می‌کند تا د خواست حافظه را تا آنجایی که ممکن است به طور مناسبی پاسخگو باشد. این سیستم حافظه را به دو نیم تقسیم می‌کند تا بهترین برازش را مطابق با دانلد کنوت انجام بدهد. سیستم رفاقتی در سال ۱۹۶۳ توسط هری مارکوویتز ابداع شده است، که در سال ۱۹۹۰ جایزه نوبل اقتصاد را دریافت کرده است و اولین بار توسط Kenneth C. Knowlton توصیف شده است (در سال ۱۹۶۵ منتشر شده است.) سیستم مدیریت حافظهٔ دوستانه نسبتاً برای پیاده‌سازی آسان است. این سیستم از محدودیت‌های بخش بندی کار آمد و بهم آمیختن (یکی شدن) بلاک‌های حافظه حمایت می‌کند.

سیستم حافظهٔ رفاقتی چگونه کار می‌کند[ویرایش]

فرم‌های گوناگونی از سیستم حافظه وجود دارد، اما رفاقتی دودویی که در آن هر بلاک به دو بلاک کوچکتر تقسیم می‌شود، ساده ترین و رایج ترین نوع آن هستند. هر بلاک حافظه در این سیستم یک مرتبه دارد. در جایی که مرتبهٔ آن در بازهٔ یک عدد صحیح از ۰تا محدودهٔ بالایی مشخص شده است. بلاک‌ها در هر مرتبه دارای اندازه‌های متناسب با ۲ به توان مرتبه هستند، که هر بلاک دقیقآ دو برابر اندازهٔ بلاک‌هایی است که در یک مرتبه در محدودهٔ پایین‌تر هستند. توان دو اندازهٔ بلاک‌ها محاسبات آدرس را ساده می‌سازد، به این دلیل که همهٔ رفیق‌ها در یک ردیف از محدودهٔ آدرس روی حافظه هستند که توان‌هایی از دو می‌باشند. زمانی که یک بلاک بزرگتر تقسیم بندی می‌شود، این بلاک به دو بلاک کوچکتر تقسیم می‌شود و هر کدام از بلاک‌های کوچکتر یک رفیق یکتا برای دیگری می‌شود. یک بلاک بخش بندی شده فقط با یک بلاک رفیق یکتای خودش می‌تواند ترکیب شود که به یک بلاک بزرگتر از آن (که از آن به دو نیم شده بودند) باز سازی شوند. در ابتدا، اندازهٔ کوچکترین بلاک ممکن تصمیم گیری می‌شوند (معین می‌شوند) کوچکترین بلاکی از حافظه که می‌تواند تخصیص داده شود. اگر هیچ محدودیت دیگر ی وجود نداشت ,(تخصیص‌های به اندازهٔ بیتی ممکن می‌باشند) ممکن است به ازای هر سیستم حافظه و سربارهای محاسباتی زیادی برای دنبال کردن تخصیص وعدم تخصیص بخش‌ها ی حافظه داشته باشیم، به هر حال در محدوده‌ها ی پایین‌تر که ممکن است قابل توصیف باشد، میانگین حافظهٔ به هدر رفته به ازای هر تخصیص (تخصیص‌هایی که برای هر اندازه وجود دارند را در گیر می‌کند، نه بلاک‌های متعدد کوچکتر را) به حداقل رسیده است. معمولآمحدودهٔ سطح پایین‌تر به اندازهٔ کافی کوچک هست که بتواند حافظهٔ تخصیص یافته به ازای هر تخصیص را به حد اقل برساند و همچنین به اندازهٔ کافی هم بزرگ هست که از سر بار بیش از اندازه جلوگیری کند. کوچکترین اندازهٔ بلاک به عنوان اندازهٔ بلاک در مرتبهٔ ۰در نظر گرفته می‌شود، بنابراین تمام مرتبه‌های در سطح بالاتر به صورت توان‌هایی از دو از اندازه‌های متعدد می‌باشند. برنامه نویس سپس روی نوشتن کد برای دستیابی به بالاترین مرتبهٔ ممکن که متناسب با فضای در دسترس از حافظهٔ باقی‌مانده می‌باشد، تصمیم گیری می‌کند. از انجایی که کل حافظهٔ در دسترس به سیستم کامپیوتری داده شده، ممکن است توانی از دو به ازای کوچکترین اندازه‌های بلاک نباشد، بزرگترین اندازهٔ بلاک ممکن است کل حافظهٔ سیستم را پوشش ندهد. به عنوان نمونه، اگر سیستم 2000kحافظهٔ فیزیکی داشته باشد و اندازهٔ بلاک مرتبه ی0,4kباشد، محدودهٔ بالایی مرتبهٔ ۸می‌شود. از آنجایی که یک بلاک مرتبهٔ ۸ (۲۵۶ تا بلاک مرتبه ی۰متناظر با 1024k)بزرگترین بلاک متناسب با حافظه خواهد بود. بنابراین این امکان پذیر است که یک حافظهٔ فیزیکی کامل را به یک بخش بزرگ واحد تخصیص دهیم. باقی ماندهٔ 967kاز حافظه ممکن است به بلاک‌های کوچکتر تخصیص داده شود.

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

شرح ذیل یک مثالی است در رابطه با اینکه وقتی یک برنامه‌ای در خواست حافظه می‌کند چه اتفاقی می‌افتد. بیایید در رابطه با این سیستم صحبت کنیم. اندازهٔ کوچکترین بلاک ممکن ۶۴ کیلو بایت هست، محدودهٔ بالایی برای مرتبهٔ ۴ هست، که بزرگترین تخصیص بلاک ممکن را نتیجه می‌دهد. در اندازه ی۲ به توان ۴ تا 64kبرابر با 1024kمی‌شود. در ذیل یک حالت ممکن از سیستم پس از در خواست‌های حافظهٔ گوناگون نمایش داده می‌شود:

Step 64K 64K 64K 64K 64K 64K 64K 64K 64K 64K 64K 64K 64K 64K 64K 64K
1 24
2.1 23 23
2.2 22 22 23
2.3 21 21 22 23
2.4 20 20 21 22 23
2.5 A: 20 20 21 22 23
3 A: 20 20 B: 21 22 23
4 A: 20 C: 20 B: 21 22 23
5.1 A: 20 C: 20 B: 21 21 21 23
5.2 A: 20 C: 20 B: 21 D: 21 21 23
6 A: 20 C: 20 21 D: 21 21 23
7.1 A: 20 C: 20 21 21 21 23
7.2 A: 20 C: 20 21 22 23
8 20 C: 20 21 22 23
9.1 20 20 21 22 23
9.2 21 21 22 23
9.3 22 22 23
9.4 23 23
9.5 24

این تخصیص می‌تواند به طریقهٔ زیر اتفاق بیفتد:

  1. موقعیت آغازین
  2. برنامهٔ Aحافظهٔ 34 kرا در خواست می‌کند (در مرتبهٔ 0)
    1. هیج بلاک مرتبهٔ ۰ ای در دسترس نیست، بنابراین بلاک مرتبهٔ ۴ دو نیم می شودو دو بلاک مرتبهٔ ۳ می‌سازد.
    2. هنوز بلاک مرتبه ی۰ در دسترس نیست، بنابراین اولین بلاک مرتبهٔ ۳ به دو نیم می‌شود و دو بلاک با مرتبهٔ ۲می‌سازد.
    3. هنوز بلاک مرتبه ی۰ در دسترس نیست، بنابراین اولین بلاک مرتبهٔ ۲به دو نیم می‌شود و دو بلاک با مرتبهٔ ۱ می‌سازد.
    4. هنوز بلاک مرتبه ی۰ در دسترس نیست، بنابراین اولین بلاک مرتبه ی۱ به دو نیم می‌شود و دو بلاک با مرتبهٔ ۰ می‌سازد.
    5. در حال حاضر بلاک مرتبه ی۰ در دسترس است پس بهAتخصیص می‌یابد.
  3. برنامه یBدر خواست حافظهٔ 66k را می‌کند (مرتبه ی۱),یک بلاک مرتبه ی۱ در دسترس است بنابراین به Bتخصیص می‌یابد.
  4. برنامهٔ Cدر خواست حافظهٔ 35kرامی کند (مرتبهٔ ۰),یک بلاک مرتبهٔ ۰ در دسترس است، بنابراین بهCتخصیص می‌یابد.
  5. برنامهٔ D,67kحافظه را در خواست می‌کند.(مرتبهٔ 1)
    1. هیچ بلاک مرتبهٔ ۱ ای در دسترس نیست بنابراین بلاک مرتبهٔ ۲ به دو نیم می‌شود و ۲ بلاک مرتبهٔ ۱ می‌سازد.
    2. در حال حاضر بلاک مرتبهٔ ۱ در دسترس است پس بهDتخصیص می‌یابد.
  6. برنامهٔ Bحافظه اش را آزاد می‌کند، یک بلاک مرتبهٔ ۱ آزاد می‌شود.
  7. برنامه یDحافظه اش را آزاد می‌کند.
    1. یک بلاک مرتبهٔ ۱ آزاد شده است.
    2. از آنجایی که بلاک رفیق بلاک تازه آزاد شده، آزاد است ۲ بلاک از مرتبهٔ ۱ به یک بلاک از مرتبه ی۲ ترکیب می‌شوند.
  8. برنامه یAحافظه اش را آزا د می‌کند، یک بلاک مرتبه ی۰ آزاد می‌شود.
  9. برنامهٔ Cحافظه اش را آزاد می‌کند.
    1. یک بلاک مرتبهٔ ۰ آزاد می‌شود.
    2. از آنجایی که بلاک رفیق بلاک تازه آزاد شده، آزاد است ۲ بلاک از مرتبه ی۰ به یک بلاک از مرتبه ی۱ ترکیب می‌شوند.
    3. از آنجایی که بلاک رفیق بلاک تازه آزاد شده، آزاد است ۲ بلاک از مرتبهٔ ۱ به یک بلاک از مرتبه ی۲ ترکیب می‌شوند.
    4. از آنجایی که بلاک رفیق بلاک تازه آزاد شده، آزاد است ۲ بلاک از مرتبهٔ ۲ به یک بلاک از مرتبه ی۳ترکیب می‌شوند.
    5. از آنجایی که بلاک رفیق بلاک تازه آزاد شده، آزاد است ۲ بلاک از مرتبهٔ ۳ به یک بلاک از مرتبه ی۴ ترکیب می‌شوند.

همانطوری که می‌بینید، در پی در خواست حافظه به مانند زیر چه اتفاقی می‌افتد.

  • اگر حافظه اختصاص داده شده باشد:
  1. دنبال بخش با اندازهٔ مناسب از حافظه (حداقل ۲ به توان kبلاک که بزرگتر یا مساوی با حافظهٔ در خواستی است.)می‌گردد.
    1. اگرپیدا شد، به برنامه تخصیص می‌یابد.
    2. اگر پیدا نشد، تلاش می‌کند تا بخش مناسبی از حافظه را بسازد. سیستم به صورت زیر تلاش می‌کند:
      1. بخش حافظهٔ آزاد بزرگتر از حافظهٔ در خواستی را به دو نیم می‌کند.
      2. اگر محدودهٔ پایین‌تر دستیابی شد، آنگاه مقدار حافظه را تخصیص می‌دهد.
      3. به گام اول بر می‌گردد.(به دنبال بخش حافظه‌ای با اندازهٔ مناسب می‌گردد.)
      4. این فرایند را تکرار می‌کند تا بخش حافظه‌ای مناسب را پیدا کند.
  • اگر حافظه آزاد شده باشد:
  1. بلاک حافظه را آزاد می‌کند.
  2. دنبال بلاک همسایه می‌گردد (که آیا آزاد هست یا نه)
  3. اگرآزاد است ۲ بلاک را به یک بلاک ترکیب می کندو به گام دوم برمیگردد و این فرایند را تکرا رمی کند تا محدودهٔ بالایی دستیابی شود.(همهٔ حافظه آزاد شود.)و یا با هیچ همسایه‌ای با بلاک آزاد برخورد نکند.

پیاده‌سازی و کارایی[ویرایش]

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

برای اینکه سیستم تخصیص رفاقتی کار کند، به یک برنامه‌ای که66kحافظه را در خواست کرده است ,128kاختصاص یافته است، که در نتیجه 62kحافظه به هدر رفته است. این مشکل می‌تواند با تخصیص قطعه (slab allocation)حل می‌شود. که به بالای درشت ترین اختصاص رفاقتی لایه بندی می‌شود تا تخصیص (fine –grain)بیشتری را فراهم کند.

یک نسخه از الگوریتم تخصیص حافظه با جزییات توسط Donald Knuthدر جلد ۱ از کتاب هنر برنامه نویسی کامپیوتر شرح داده شده است. در امتداد اختصاص‌های گوناگون دیگر برای مدیریت کردن حافظه‌های درون بلاکی، هستهٔ لینوکس همچنین برای سیستم رفاقتی به همراه اصلاحات بیشتری برای به حد اقل رساندن تکه‌تکه شدن خارجی، استفاده می‌شود. در میان دیگران و تکنیک‌های رفاقتی jemallocیک اختصاص دهندهٔ حافظهٔ مدرن است که به کار گرفته می‌شود.

جستارهای وابسته[ویرایش]

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

مشارکت‌کنندگان ویکی‌پدیا، «Buddy memory allocation»، ویکی‌پدیای انگلیسی، دانشنامهٔ آزاد (بازیابی در ۵ ژوئن ۲۰۱۳).