مسیر رتبه‌برترشدن در کنکور ارشد مهندسی کامپیوتر و IT
ثبت‌نام رایگان
مدت زمان باقیمانده :
ثانیه -
دقیقه -
ساعت -
روز -
کنکور کامپیوتر
0
ورود | ثبت نام
نظرات
اشتراک
بالا
علاقه‌مندی

اشتراک
 

درخت هیپ (heap) چیست؟ آموزش هیپ در ساختمان داده

این صفحه عالی به آموزش هیپ (heap) در ساختمان داده پرداخته و اعمالی که در هرم قابل انجام است و مزایا و معایب حافظه Heap و مثال کدنویسی از Heap را آورده

یکی از حافظهحافظه در کامپیوتر، همه چیز در مورد حافظه در معماری کامپیوترحافظه در کامپیوتر، همه چیز در مورد حافظه در معماری کامپیوتردر این مقاله به بررسی کامل حافظه در کامپیوتر، انواع حافظه در کامپیوتر، کش، روش‌های آدرس دهی کش، نگاشت آدرس و موارد دیگر می‌پردازیم‌هایی که در دنیای کامپیوترکامپیوتر چیست؟ ⚡️ کامپیوتر چیست به زبان سادهکامپیوتر چیست؟ ⚡️ کامپیوتر چیست به زبان سادهاین مقاله عالی توضیح داده که کامپیوتر چیست و چه کاربردی دارد و همه چیز درباره کامپیوتر از جمله فواید کامپیوتر و تعریف کامپیوتر و اجزای آن را بیان کرده است و برنامه نویسیبرنامه نویسی کامپیوتر چیست و چطور می توانید یک برنامه نویس موفق شوید؟برنامه نویسی کامپیوتر چیست و چطور می توانید یک برنامه نویس موفق شوید؟در عصر فعلی برنامه‌نویسی یکی از پرطرفدارترین شغل‌های دنیاست، دغدغه‌‌ای افرادی که می‌خواهند در مسیر برنامه‌نویس شدن قدم بردارند این است که نمی‌دانند از کجا باید شروع کنند، در این صفحه هر آن چه برای تبدیل شدن به یک برنامه نویس حرفه ای نیاز دارید در اختیارتان قرار گرفته است مورد استفاده قرار می‌گیرد، حافظه هیپ یا Heap است. حافظه هیپ یک حافظه پویا یا داینامیک (Dynamic) است که در واقع به جای حافظه پشتهساختمان داده پشته ⚡️ پشته چیست؟ کاربرد پشته در ساختمان دادهساختمان داده پشته ⚡️ پشته چیست؟ کاربرد پشته در ساختمان دادهاین مقاله عالی توضیح داده که پشته چیست و کاربرد پشته در ساختمان داده چیست، همچنین نحوه کارکرد پشته، پیاده سازی پشته و عملیات های پشته را معرفی کرده یا استک (Stack)، مورد استفاده قرار می‌گیرد. متغیر متغیر در برنامه نویسی چیست ⚡️انواع متغیر در برنامه نویسیمتغیر در برنامه نویسی چیست ⚡️انواع متغیر در برنامه نویسیاین صفحه عالی بررسی کرده متغیر در برنامه نویسی چیست و انواع متغیر در برنامه نویسی را معرفی و مراحل کار با متغیر، نحوه تعریف و قوانین نام‌گذاری متغیرها را گفته های محلی (Local Variables) معمولاً به صورت خودکار با فراخوانی تابع تخصیص داده می‌شوند و با پایان یافتن کار تابع از بین می‌روند اما در حافظه هیپ قضیه کاملاً متفاوت است. برای تخصیص حافظه هیپ، برنامه نویسان صراحتاً باید درخواست تخصیص حافظه دهند؛ به عنوان مثال در زبان‌هایی مانند جاواجاوا چیست؟ تعریف، معنی و ویژگی های جاوا (java) از 0تا100جاوا چیست؟ تعریف، معنی و ویژگی های جاوا (java) از 0تا100جاوا یک زبان برنامه نویسی همه منظوره، مبتنی بر کلاس و شی گرا است که برای داشتن وابستگی های پیاده سازی کمتر طراحی شده است، زبان برنامه نویسی جاوا شبیه ++C است یا سی پلاس پلاسبرنامه نویسی سی پلاس پلاس چیست؟ مزایای برنامه نویسی C++‎؟برنامه نویسی سی پلاس پلاس چیست؟ مزایای برنامه نویسی C++‎؟برنامه نویسی سی پلاس پلاس چیست و چه کاربردی دارد؟ این صفحه عالی به بررسی مزایای برنامه نویسی C++ پرداخته و نمونه هایی از کدهای زبان برنامه نویسی ++C را آورده، این کار به وسیله کلمه new انجام می‌شود.

به قسمت‌های حافظه هیپ که به شئ‌ها یا آبجکت‌ها تخصیص پیدا می‌کند، به اصطلاح بلاک (Block) گفته می‌شود. اندازه بلاک‌ها متفاوت است و معمولاً هنگام تخصیص حافظه به آبجکت‌ها، به صورت خودکار مشخص می‌شوند. بلاک‌های حافظه هیپ که به آبجکت‌ها تخصیص داده شده‌اند، به صورت دائمی (بر خلاف پشته) وجود دارند مگر این که اتفاقی برای آنها بیفتد و حذف شوند که به آن Deallocation نیز می‌گویند. در بعضی از زبان‌ها (مانند زبان Cزبان برنامه نویسی C – مزایا و کاربرد زبان C – فرق C و ++Cزبان برنامه نویسی C – مزایا و کاربرد زبان C – فرق C و ++Cاین مقاله عالی ابتدا توضیح می‌دهد که زبان برنامه نویسی c چیست، سپس به بررسی مزایا و معایب زبان C ، کاربردهای زبان سی ، و تفاوت بین C و ++C می‌پردازد و زبان C++‎برنامه نویسی سی پلاس پلاس چیست؟ مزایای برنامه نویسی C++‎؟برنامه نویسی سی پلاس پلاس چیست؟ مزایای برنامه نویسی C++‎؟برنامه نویسی سی پلاس پلاس چیست و چه کاربردی دارد؟ این صفحه عالی به بررسی مزایای برنامه نویسی C++ پرداخته و نمونه هایی از کدهای زبان برنامه نویسی ++C را آورده) یک آبجکت که درون حافظه هیپ قرار دارد، تنها زمانی از بین می‌رود که برنامه نویس به صراحت درخواست حذف یا همان عدم تخصیص آن را بدهد؛ بنابراین برنامه نویس کنترل بیشتری برروی حافظه دارد اما مسئولیتش نیز بیشتر است؛ چرا که باید با دقت تمام حافظه را مدیریت کند. اگر عدم تخصیص با دقت صورت نگیرد، هرچه بیشتر از برنامه استفاده شود، آبجکت‌های بیشتری ایجاد می‌شود بدون این که از بین بروند و در نتیجه مشکلی به وجود می‌آید با نام نشت حافظه یا Memory Leak که بسیاری از برنامه‌های ساخته شده با سی پلاس پلاس دارای این مشکل هستند.

حافظه هیپ چیست؟

در بعضی از زبان های برنامه نویسیزبان های برنامه نویسی چیست؟زبان های برنامه نویسی چیست؟این مقاله عالی توضیح داده که زبان های برنامه نویسی چیست؟ و انواع زبان های برنامه نویسی و بهترین زبان برنامه نویسی برای شروع و پردرآمدترین آنها را معرفی کرده، مدیریت حافظه هیپ به طور خودکار انجام می‌شود؛ به عنوان مثال، در زبان برنامه نویسی سی شارپسی شارپ چیست ⚡️سی شارپ به زبان سادهسی شارپ چیست ⚡️سی شارپ به زبان سادهاین صفحه عالی بررسی کرده که سی شارپ چیست و تاریخچه سی شارپ، محیط و ابزارهای سی شارپ، ویژگی های سی شارپ، مزایای سی شارپ و کاربرد و بازار کار سی شارپ را گفته یا زبان جاوا، سیستمی با نام زباله روب یا Garbage CollectionGarbage Collection(GC) چیست و چگونه کار میکند؟Garbage Collection(GC) چیست و چگونه کار میکند؟این مقاله عالی بررسی کرده که Garbage Collection(GC) چیست و چگونه کار میکند؟ و مزایای Garbage Collection و انواع روش های Garbage Collection را معرفی کرده وجود دارد که عملیات مربوط به تخصیص و عدم تخصیص حافظه هیپ به آبجکت‌ها را به صورت خودکار انجام می‌دهد. در این صورت، دیگر نگرانی ما بابت مشکلات حافظه‌ای تا حدود بسیار زیادی کم می‌شود، چرا که بیشتر تمرکزمان برروی کدنویسیکدنویسی چیست؟ – کد نویسی یعنی چهکدنویسی چیست؟ – کد نویسی یعنی چهاین مقاله عالی به بررسی این پرداخته که کد نویسی چیست و مفهوم کد نویسی را بررسی کرده، همچنین تفاوت کدنویسی و برنامه نویسی و کاربرد های کدنویسی را بررسی کرده است و Garbage Collection به صورت خودکار عملیات آزادسازی حافظه را انجام می‌دهد. لازم است گفته شود که در زبان Java این عملیات به وسیله‌ی JVM انجام می‌شود و در زبان #C به وسیله‌ی CLR

حذف آبجکت ها از حافظه هیپ

موارد مختلفی وجود دارد که باعث پاک شدن یا همان عدم تخصیص آبجکت از درون حافظه هیپ می‌شود. در اینجا به 3 مورد از متداول‌ترین علت‌های حذف آبجکت از درون هیپ را آورده‌ایم:

تخصیص حافظه در هیپ

همان‌طور که گفته شد، تخصیص حافظه در زبان‌هایی مانند جاوا، سی شارپ و سی پلاس پلاس به وسیله کلمه کلیدی new صورت می‌پذیرد؛ سپس تابع مربوط به تخصیص حافظه، بلاکی با اندازه درخواست شده (اندازه آبجکت) درون هیپ رزرو می‌کند و یک ارجاعی به آن درون حافظه محلی یا پشته می‌سازد. فرض کنید یک برنامه 3 درخواست تخصیص حافظه برای نگهداری 3 تصویر PNG درون هیپ ایجاد می‌کند، هرکدام از تصویرها فرضاً 1024 بایت فضا اشغال می‌کنند. بعد از تخصیص هر 3 تصویر PNG، حافظه شبیه به شکل زیر می‌شود.

تخصیص حافظه در هیپ

هر تخصیص، به صورت پیوسته درون حافظه هیپ به صورت بلاک قرار می‌گیرد و ارجاعی به آنها در متغیرهای محلی نیز ایجاد می‌شود. در اینجا Heap Manager می‌تواند تخصیص حافظه را در هر بلاکی که می‌خواهد ایجاد کند؛ تنها نباید با بقیه بلاک‌ها تداخل یا Overlap داشته باشد؛ به عنوان مثال، تخصیص حافظه در تصویر بالا به صورت از پایین به بالا بود که البته اجباری بر این حالت (در حافظه هیپ) نیست. در هر زمان از اجرای برنامه، بلاک‌هایی درون حافظه هیپ توسط متغیرهای محلی مورد ارجاع واقع شده‌اند که به آنها بلاک‌های در حال استفاده یا In Use می‌گویند. فضاهای دیگری نیز وجود دارد که با نام فضای خالی یا Free شناخته می‌شود که آماده تخصیص داده شدن به آبجکت‌های جدید هستند. در تصویر بالا حافظه خالی با مستطیل سبز رنگ مشخص شده است.

گرفتن حافظه یا Deallocation در هیپ

وقتی قسمتی از برنامه که بعضی از بلاک‌های حافظه منحصراً به آن اختصاص داده شده بود به پایان رسید، در بعضی از زبان‌ها به صراحت باید آن آبجکت‌ها را حذف یا Deallocate کرد. در زبان‌هایی مانند جاوا، این فضاها که ارجاعی به آنها وجود ندارد توسط Garbage Collection پاک یا Clean می‌شوند و آماده تخصیص به آبجکت‌های دیگر هستند. Garbage Collection به صورت ضمنی فضای حافظه Heap را خالی از بلاک‌های بلااستفاده می‌کند. در تصویر زیر مشاهده می‌کنید که با حذف متغیر محلی دوم، بلوک مربوط به تصویر PNG دوم نیز به حالت Free درآمده است:

عدم تخصیص حافظه در هیپ

مزایا و معایب حافظه Heap

حافظه هیپ دارای یک‌سری مزایا و معایب (نسبت به پشته) دارد که در این قسمت به مهم‌ترین آنها می‌پردازیم:

مزایای حافظه هیپ

معایب حافظه هیپ

مقایسه حافظه هیپ و پشته

حافظه های هیپ و پشته دو مکانیزم برای تخصیص حافظه هستند که در برنامه نویسی مورد استفاده قرار می‌گیرند. هرکدام از آنها برای کار خاصی مورد استفاده قرار می‌گیرند و دارای مزایا و معایب مربوط به خود هستند. در این قسمت به تفاوت های حافظه هیپ و پشته می‌پردازیم.

اهداف

تخصیص و عدم تخصیص

طول عمر

دسترسی به داده ها

قطعه قطعه شدن (Fragmentation)

در جدول زیر، مقایسه بین پشته و هیپ آمده است:

معیارها حافظه پشته حافظه هیپ
اهداف ذخیره‌ی اطلاعات توابع و متغیرهای محلی تخصیص حافظه به صورت پویا برای آبجکت‌ها
تخصیص و عدم تخصیص سریع و کارآمد کندتر از پشته
طول عمر محدود به بلاک‌های کد بدون محدودیت
دسترسی به داده‌ها به طور معمول سریع کندتر از پشته
قطعه قطعه شدن ندارد دارد

یک مثال کدنویسی از Heap

در کد زیر که یک مثال از حافظه Heap در جاوا است، کلاسی با نام Person ایجاد شده که دارای دو متغیر name و age است؛ سپس در کلاس HeapExample یک آبجکت از این متغیر به همراه یک آرایه ایجاد شده است که هردو درون حافظه هیپ قرار می‌گیرند. جزئیات مربوط به هر خط کد نیز به صورت کامنت (Comment) بالای خطوط نوشته شده است:

class Person {
    private String name;
    private int age;
 
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
}
public class HeapExample {
    public static void main(String[] args) {
        // تخصیص یک آرایه با اندازه 5 در حافظه هیپ
        int[] numbers = new int[5];
 
        for (int i = 0; i < 5; i++) {
            numbers[i] = i + 1; // ذخیره مقادیر 1 تا 5 درون خانه های آرایه   
        }

        // ایجاد یک آبجکت درون حافظه هیپ
        Person person = new Person("John", 30);

        // تغییر متغیر مربوط به آبجکت سن   
        person.setAge(31);

        // دسترسی به مقادیر ذخیره شده در آرایه واقع در هیپ
        for (int i = 0; i < 5; i++) {
            System.out.println("Number at index " + i + ": " + numbers[i]);
        }

        // دسترسی به مشخصه های آبجکت ایجاد شده از داخل هیپ
        System.out.println("Person: " + person.getName() + ", Age: " + person.getAge());
    }
}

جمع‌بندی

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

حافظه هیپ (Heap) چیست؟

حافظه هیپ یک حافظه پویا یا داینامیک (Dynamic) است که در واقع به جای حافظه پشته یا استک (Stack) برای ذخیره داده‌های برنامه نویسی مورد استفاده قرار می‌گیرد.

مدیریت حافظه هیپ بر عهده کیست؟

بستگی دارد، در زبان‌هایی مانند C و ++C، برنامه نویس به طور مستقیم به مدیریت حافظه هیپ می‌پردازد؛ اما در زبان‌هایی مانند C# ،Java و Python، سیستمی با نام Garbage Collection به طور خودکار این حافظه را مدیریت می‌کند.

چه نوع داده هایی در پشته ذخیره می‌شوند؟

به طور کلی در اکثر زبان‌های برنامه نویسی، آبجکت‌هایی که به وسیله‌ی کلمه کلیدی new ایجاد می‌شوند و داده‌هایی مانند آرایه‌ها درون حافظه هیپ ذخیره می‌شوند.

امتیازدهی5 1 1 1 1 1 1 1 1 1 15.00 امتیاز (3 رای)
اشتراک
بارگذاری نظرات
تلگرام اینستاگرام