تکنیک مدیریت حافظهٔ رفاقتی یک الگوریتم برای مدیریت حافظه است که حافظه را به بخشهایی تقسیم میکند تا درخواست حافظه را تا آنجایی که ممکن است به طور مناسبی پاسخگو باشد. این سیستم حافظه را به دو نیم تقسیم میکند تا بهترین پردازش را مطابق با دانلد کنوت انجام بدهد. سیستم رفاقتی در سال ۱۹۶۳ توسط هری مارکوویتز ابداع شده است، که در سال ۱۹۹۰ جایزه نوبل اقتصاد را دریافت کرده است و اولین بار توسط Kenneth C. Knowlton توصیف شده است .سیستم مدیریت حافظهٔ دوستانه نسبتاً برای پیادهسازی آسان است. این سیستم از محدودیتهای بخش بندی کار آمد و بهم آمیختن (یکی شدن) بلاکهای حافظه حمایت میکند.
سیستم حافظهٔ رفاقتی چگونه کار میکند؟
فرمهای گوناگونی از سیستم حافظه وجود دارد، اما رفاقتی دودویی که در آن هر بلاک به دو بلاک کوچکتر تقسیم میشود، ساده ترین و رایج ترین نوع آن هستند. هر بلاک حافظه در این سیستم یک مرتبه دارد. در جایی که مرتبهٔ آن در بازهٔ یک عدد صحیح از ۰تا محدودهٔ بالایی مشخص شده است. بلاکها در هر مرتبه دارای اندازههای متناسب با ۲ به توان مرتبه هستند، که هر بلاک دقیقآ دو برابر اندازهٔ بلاکهایی است که در یک مرتبه در محدودهٔ پایینتر هستند. توان دو اندازهٔ بلاکها محاسبات آدرس را ساده میسازد، به این دلیل که همهٔ رفیقها در یک ردیف از محدودهٔ آدرس روی حافظه هستند که توانهایی از دو میباشند. زمانی که یک بلاک بزرگتر تقسیم بندی میشود، این بلاک به دو بلاک کوچکتر تقسیم میشود و هر کدام از بلاکهای کوچکتر یک رفیق یکتا برای دیگری میشود. یک بلاک بخش بندی شده فقط با یک بلاک رفیق یکتای خودش میتواند ترکیب شود که به یک بلاک بزرگتر از آن (که از آن به دو نیم شده بودند) باز سازی شوند. در ابتدا، اندازهٔ کوچکترین بلاک ممکن تصمیم گیری میشوند (معین میشوند) کوچکترین بلاکی از حافظه که میتواند تخصیص داده شود. اگر هیچ محدودیت دیگر ی وجود نداشت ,(تخصیصهای به اندازهٔ بیتی ممکن میباشند) ممکن است به ازای هر سیستم حافظه و سربارهای محاسباتی زیادی برای دنبال کردن تخصیص وعدم تخصیص بخشها ی حافظه داشته باشیم، به هر حال در محدودهها ی پایینتر که ممکن است قابل توصیف باشد، میانگین حافظهٔ به هدر رفته به ازای هر تخصیص (تخصیصهایی که برای هر اندازه وجود دارند را در گیر میکند، نه بلاکهای متعدد کوچکتر را) به حداقل رسیده است. معمولآمحدودهٔ سطح پایینتر به اندازهٔ کافی کوچک هست که بتواند حافظهٔ تخصیص یافته به ازای هر تخصیص را به حد اقل برساند و همچنین به اندازهٔ کافی هم بزرگ هست که از سر بار بیش از اندازه جلوگیری کند. کوچکترین اندازهٔ بلاک به عنوان اندازهٔ بلاک در مرتبهٔ ۰در نظر گرفته میشود، بنابراین تمام مرتبههای در سطح بالاتر به صورت توانهایی از دو از اندازههای متعدد میباشند. برنامه نویس سپس روی نوشتن کد برای دستیابی به بالاترین مرتبهٔ ممکن که متناسب با فضای در دسترس از حافظهٔ باقی مانده میباشد، تصمیم گیری میکند. از انجایی که کل حافظهٔ در دسترس به سیستم کامپیوتری داده شده، ممکن است توانی از دو به ازای کوچکترین اندازههای بلاک نباشد، بزرگترین اندازهٔ بلاک ممکن است کل حافظهٔ سیستم را پوشش ندهد. به عنوان نمونه، اگر سیستم ۲۰۰۰k حافظهٔ فیزیکی داشته باشد و اندازهٔ بلاک مرتبه ی۰,۴kباشد، محدودهٔ بالایی مرتبهٔ ۸میشود. از آنجایی که یک بلاک مرتبهٔ ۸ (۲۵۶ تا بلاک مرتبه ی۰متناظر با ۱۰۲۴k)بزرگترین بلاک متناسب با حافظه خواهد بود. بنابراین این امکان پذیر است که یک حافظهٔ فیزیکی کامل را به یک بخش بزرگ واحد تخصیص دهیم. باقی ماندهٔ ۹۶۷kاز حافظه ممکن است به بلاکهای کوچکتر تخصیص داده شود.
در مقایسه با تکنیکها ی ساده تر مانند تخصیص حافظهٔ پویا، تخصیص حافظهای رفیق، مقدار کمی تکه تکه شدن خارجی دارد و با سربار کمی به حافظه اجازهٔ فشرده سازی میدهد. متد رفیق برای آزاد سازی حافظه (که با بیشترین تعداد فشرده سازی مورد نیاز برابر با لگاریتم ۲ (بالاترین مرتبه) است)سریع است. معمولآسیستم حفاظتی رفیق با استفاده از درخت دودویی برای نمایش بلاکهای حافظهٔ دو نیم شدهٔ استفاده شده ویا نمایش بلاکهای حافظهٔ دو نیم شدهٔ استفاده نشده، پیادهسازی میشود. رفیق هر بلاک میتواند با آدرس بلاک انحصاری و اندازهٔ بلاک پیدا شود. مشکل تکه تکه شدن داخلی وجود دارد. حافظه به هدر میرود به خاطر اینکه حافظهٔ در خواست شده یک مقدار کمی از اندازهٔ کوچکترین بلاک کمتر است، اما خیلی کوچکتر از بلاک بزرگ است.
برای اینکه سیستم تخصیص رفاقتی کار کند، به یک برنامهای که۶۶k حافظه را در خواست کرده است ,۱۲۸k اختصاص یافته است، که در نتیجه ۶۲k حافظه به هدر رفته است. این مشکل میتواند با تخصیص قطعه (slab allocation)حل میشود. که به بالای درشت ترین اختصاص رفاقتی لایه بندی میشود تا تخصیص (fine –grain)بیشتری را فراهم کند.
برای کسب اطلاعات بیشتر میتوانید به لینک زیر مراجعه کنید:
http://en.wikipedia.org/wiki/Buddy_memory_allocation