تفاوت حافظه هیپ Heap و استک Stack و مدیریت این‌ حافظه‌ها توسط گولنگ Golang

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

هدف ما این هستش که سیستم فروشگاه ساز پیشرفته رو با گولنگ پیاده سازی کنیم و در نهایت روی کوبرنتیز دیپلوی اجرا کنیم یعنی ۰ تا ۱۰۰ یه پروژه گولنگی . به زودی ویدیوی این آموزش ها در وبسایت uncodev منتشر خواهند شد.

حافظه Stack برای ذخیره‌سازی داده‌ها و اطلاعات مربوط به توابع و فرآیندهای فعلی برنامه در زمان اجرا استفاده میشه. حافظه Stack به صورت سطوحی کوچک‌تر در مقایسه با حافظه Heap عمل میکنه و برای مدیریت داده‌ها به ترتیب Last In, First Out (LIFO) استفاده میشه. آخرین داده‌هایی که وارد Stack میشن، در ابتدا باید خارج بشن.


تفاوت‌های حافظه Heap و Stack

مدیریت حافظه:

حافظه Heap به صورت دستی مدیریت میشه. برنامه‌نویس باید خودش تصمیم بگیرد که کدام بخش‌های حافظه Heap برای ذخیره داده‌ها تخصیص پیدا کنه و کی باید آزاد بشن (البته گفتم که تو یه زبان مثل گولنگ خودکار انجام میشه و ما نباید کاری کنیم ).

حافظه Stack به صورت خودکار مدیریت میشه. سیستم به ترتیب LIFO (Last In, First Out) داده‌ها را مدیریت میکنه. زمانی که تابع فراخوانی میشه، اطلاعات مربوط به اون تابع به حافظه Stack اضافه میشه و با پایان تابع، این اطلاعات حذف نمیشن.

سرعت دسترسی:

دسترسی به حافظه Heap ممکن است کمی کندتر باشه. به خاطر اینکه مکانیزم‌هایی برای جستجوی داده‌ها در حافظه Heap وجود داره.

دسترسی به حافظه Stack به طور معمول سریع‌تر هستش. چون داده‌ها به ترتیب LIFO مدیریت میشن و از طریق آدرس‌های ثابت قابل دسترسی خواهند بود.

حجم حافظه:

· حافظه Heap معمولاً بزرگتر از حافظه Stack هستش. اینم به این دلیله که داده‌ها به صورت دینامیک در حافظه Heap ایجاد می‌شوند و اندازه آن‌ها در زمان اجرا مشخص می‌شود.

· حافظه Stack معمولاً کوچک‌تر است و محدود به تعداد توابع و فرآیندهای فعلی برنامست.

زمان زنده بودن داده‌ها:

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

داده‌های ذخیره‌شده در حافظه Stack به صورت خودکار با اتمام تابع یا فرآیند مرتبط آزاد می‌شوند.


نوع داده‌ها:

معمولاً برای ذخیره‌سازی شیء‌ها و داده‌هایی که در زمان اجرا ایجاد میشن ( مانند آرایه‌ها و لیست‌ها با اندازه متغیر ) از حافظه Heap استفاده میشه.

معمولاً برای ذخیره‌سازی متغیرهای محلی توابع و اطلاعات مربوط به تابع‌ها (مانند آدرس‌های بازگشتی و اطلاعات بازگشتی) از حافظه Stack استفاده می‌شود.


کانال تگلرام

https://t.me/uncodev


و امااا مثال‌هایی در مورد گولنگ

حافظه Stack در Golang:

در Go، تابع‌ها با دستور return نتیجه رو برمیگردونن. برای هر تابعی که فراخوانی میشه، یک "stack frame" جدید در حافظه Stack ایجاد میشه. این فریم شامل متغیرهای محلی تابع، آدرس بازگشتی، و سایر اطلاعات مرتبط با تابع هستش. با اتمام تابع، فریم مربوط به آن از حافظه Stack حذف میشه. تخصیص و آزاد‌سازی حافظه در اینجا به صورت خودکار انجام می‌شود.


حافظه Heap در Golang :

در Golang، مدیریت حافظه Heap با ترکیبی از توابعی مانند new() و make() انجام میشه.

تابع new : این تابع برای ایجاد یک متغیر از نوع اشاره‌گر به نوع مورد نظر و تخصیص حافظه Heap به آن استفاده میشه. مثلاً var x *int = new(int) یک اشاره‌گر به یک متغیر int را ایجاد میکنه که در حافظه Heap تخصیص یافته است.

تابع make : این تابع برای ایجاد و تخصیص حافظه به ساختارهای خاصی مانند slices، maps وchannels استفاده میشه. مانند var s []int = make([]int, 10) که یک slice از اعداد int با طول 10 ایجاد میکنه.

گوروتین‌ها و چنل ها از کدوم حافظه استفاده میکنن؟

هر Goroutine مستقیماً در حافظه Stack تعبیه شده و به طور خودکار مدیریت میشه. این Stack‌ها توسط زبان Go به صورت خودکار مدیریت میشن .

داده‌هایی که بین Goroutine‌ها با استفاده از Channels انتقال پیدا میکنن، در حافظه Heap قرار دارند. این باعث می‌شود تا از یک مکان مشترک برای انتقال داده‌ها استفاده شود که بین تمام نخ‌ها به اشتراک گذاشته می‌شود.

توی مقالات بعدی در رابطه با زباله جمع کن گولنگ بیشتر توضیح میدم.

کانال تگلرام

https://t.me/uncodev