🧠 ایدهی اصلی:
برای اینکه Go بتواند خیلی سریع تشخیص دهد کجا فضای خالی کافی برای تخصیص وجود دارد**، از یک ساختار درختی چندسطحی استفاده میکند.
این ساختار درواقع یک **Radix Tree جهانی از *summaryها* است.
🏗 نحوهی کار:
* Level 4 (پایینترین سطح)
شامل بیتمپهای واقعی از صفحات (هر بیت = یک صفحه 8KB).
در تصویر با رنگ سبز نشان داده شده و مقدار
1011...0010 وضعیت صفحات را مشخص میکند (۰ = آزاد، ۱ = اشغال).* Level 3 و بالاتر:
هر سطح بالاتر از ترکیب دو یا چند خلاصهی سطح پایینتر تشکیل میشود.
هر جعبهی آبی، یک Summary است که نشان میدهد در زیرمجموعهی خود چند صفحه آزاد بهصورت پیوسته وجود دارد.
برای هر سطح، سه مقدار (
start, max, end) بر اساس ادغام سطوح پایینتر محاسبه میشوند (مثل مثال S1 و S2 که قبلاً دیدی).* Level 0 (بالای درخت):
این سطح تنها یک نود دارد که کل فضای مجازی تخصیصپذیر Go را پوشش میدهد.
این نود به allocator اجازه میدهد خیلی سریع بفهمد آیا در کل heap جایی وجود دارد که مثلاً 100 صفحهی خالی پشتسرهم داشته باشد یا نه.
⚙️ مزایا:
1. 🔍 جستجوی سریع:
ا Allocator دیگر لازم نیست کل heap را اسکن کند — فقط در درخت پایین میرود تا بخشهای مناسب را بیابد.
2. 🔄 بهروزرسانی بلادرنگ:
وقتی صفحهای تخصیص یا آزاد میشود، فقط summary همان بخش و مسیرش تا بالا بهروزرسانی میشود (O(log n) پیچیدگی).
3. 🧩 مقیاسپذیری بالا:
چون هر سطح میتواند بهصورت محلی بهروزرسانی شود، چندین goroutine میتوانند بهصورت همزمان در بخشهای مختلف heap کار کنند بدون قفلگذاری سراسری.
➖➖➖➖➖➖➖➖
👑 @gopher_academy