اطلاعیه

Collapse
No announcement yet.

فرق بین حافظه stack و heap توی میکروکنترلرا چیه ؟

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

    فرق بین حافظه stack و heap توی میکروکنترلرا چیه ؟

    سلام.
    فرق بین حافظه stack و heap توی میکروکنترلرا چیه ؟
    کمتر یا بیشتر بودنشون نسبت به هم چه مزایا و معایبی برای کد داره ؟
    بر چه اساسی میزان مناسب برای این دو تا انتخاب کنیم ؟
    مرسی.
    ---------
    .
    .
    ...........

    #2
    پاسخ : فرق بین حافظه stack و heap توی میکروکنترلرا چیه ؟

    نوشته اصلی توسط ajapyy
    سلام.
    فرق بین حافظه stack و heap توی میکروکنترلرا چیه ؟
    کمتر یا بیشتر بودنشون نسبت به هم چه مزایا و معایبی برای کد داره ؟
    بر چه اساسی میزان مناسب برای این دو تا انتخاب کنیم ؟
    مرسی.
    سلام

    برای پاسخ دادن به سوالتون اول باید تعریف درستی از هر دو تا رو داشته باشیم.
    اول از همه به سراغ stack میریم.
    stack یک بخش خاصی از حافظه هست که برای ذخیره متغییر های محلی هر تابع(از جمله تابع main) و محل برگشت از تابع استفاده میشه. معمولا طراحی stack به صورت First In Last Out هست یا همون FILO. خوبی stack این هست که توسط CPU مدیریت میشه و کاربر نیاز نداره که به صورت دستی حافظه رو Allocate کنه و بعد از پایان استفاده اون رو deallocate کنه. در CPU مکانیزمی وجود داره که به صورت اتوماتیک متغییر های محلی آدرس دهی میشن و درنهایت هم deallocate میشن. از اونجا که این کار توسط CPU انجام میشه خیلی سرعت بالایی داره و تقریبا هیچ گونه Memory Leakage رخ نمیده (به این معنا که حافظه ایی به اشتباه پر فرض بشه). همونطور که گفتم خوبی استفاده از stack این هست که حافظه برای شما به صورت اتوماتیک مدیریت میشه. نکته مهم در فهم کار stack دانستن این نکته هست که وقتی از یک تابع خارج میشویم تمام متغییر های محلی این تابع از داخل stack خارج میشن یا همون pop میشن و کلا از بین میروند. نکته مهم دیگه این هست که حافظه stack محدود هست. این در مقایسه با حافظه heap هست. به صورت کلی stack:

    1- حافظه stack به صورت اتوماتیک با توجه به سایز متغیر های محلی pop , یا push میشه.
    ۲- هیچ نیازی به مدیریت حافظه از طرف کاربر نیست و متغییر ها به صورت اتوماتیک allocate و deallocate میشن.
    ۳- stack داری محدودیت اندازه هست.
    ۴- متغییر های توابع که داخل stack ذخیره شدن تا وقتی که cpu داخل اون تابع هست قابل دسترسی هستند و وقتی که cpu از اون تابع بیرون میره تمام متغییر های اون تابع پاک میشن
    این هم یک مثال از استفاده از حافظه stack:
    [code=c]
    #include <stdio.h>

    double multiplyByTwo (double input) {
    double twice = input * 2.0;
    return twice;
    }

    int main (int argc, char *argv[])
    {
    int age = 30;
    double salary = 12345.67;
    double myList[3] = {1.2, 2.3, 3.4};

    printf("double your salary is %.3f\n", multiplyByTwo(salary));

    return 0;
    }
    [/code]

    حالا حافظه heap چی هست؟؟؟
    حافظه heap قسمتی از حافظه هست که به صورت اتوماتیک مدیریت نمیشه بنابراین کاربر باید بعد از اختصاص دادن حافظه heap به یک متغییر حواسش باشه که اون متغییر رو از حافظه پاک کنه. اگر این اتفاق به هر دلیلی نیفته میگن memory leakage اتفاق افتاده و به این معنا هست که ما یک قسمت از حافظه رو از دست دادیم چون cpu فکر میکنه متغییر داخل اون قسمت وجود داده و نمیتونه جای اون متغییر چیزه دیگه ایی بگذاره. اختصاص دادن حافظه heap به متغییر توسط دستور alloc() انجام میشه که یک تابع داخلی C هست. وظیفه پاک کردن متغییر از حافظه heap به عهده کاربر هست و باید اون متغییر رو با دستور free() از حافظه پاک کنه. برخلاف stack حافظه heap ظرفیت بیشتری داره و همچنین محدودیت روی ساز متغییر ها هم وجود نداره. از اونجا که مدیریت heap توسط کاربر انجام میشه سرعت کار کردن باهاش کمتر از stack خواهد بود. از ظرف دیگه متغییر های ذخیره شده در heap به صورت global هستند و همه توابع میتونن به اون متغییر ها دسترسی داشته باشند. به طور خلاصه, در حافظه heap:

    ۱- متغییر ها به صورت global قابل دسترسی هستند.
    ۲- میشه سرعت دسترسی کمتر از stack خواهد بود.
    ۳- احتمال memory leakage وجود داره.
    ۴- متغییر ها به صورت داینامیک هستند و میتونن با استفاده از دستور realloc() تغییر سایز بدهند.

    حالا همون کد بالا با استفاده از heap:
    [code=c]
    #include <stdio.h>
    #include <stdlib.h>

    double *multiplyByTwo (double *input) {
    double *twice = malloc(sizeof(double));
    *twice = *input * 2.0;
    return twice;
    }

    int main (int argc, char *argv[])
    {
    int *age = malloc(sizeof(int));
    *age = 30;
    double *salary = malloc(sizeof(double));
    *salary = 12345.67;
    double *myList = malloc(3 * sizeof(double));
    myList[0] = 1.2;
    myList[1] = 2.3;
    myList[2] = 3.4;

    double *twiceSalary = multiplyByTwo(salary);

    printf("double your salary is %.3f\n", *twiceSalary);

    free(age);
    free(salary);
    free(myList);
    free(twiceSalary);

    return 0;
    }
    [/code]

    حالا این سوال پیش میاد که کی از heap استفاده کنیم و کی از stack؟؟؟

    اگر قرار هست به مقدار بزرگی از دیتا برای مدت زمان زیاد دسترسی داشته باشید, باید از heap استفاده کنید. اگر قرار هست که متغییر ها رو به صورت محلی در توابع استفاده کنید باید از stack استفاده کنید.

    دیدگاه


      #3
      پاسخ : فرق بین حافظه stack و heap توی میکروکنترلرا چیه ؟

      ممنون از توضیحتون.
      من کدی نوشته بودم و حافظه heap براش نزاشته بودم. داخل کد چند تا تابع بود که هر کدوم متغیرهای محلی برای خودشون داشتند. حافظه stack اما تعریف شده بود. اتفاقی که می افتاد این بود که تا یک جای برنامه درست اجرا می شد اما بقیه دیگه اجرا نمی شد.
      مثلا تو یکی از توابع دو تا حلقه for داشتم. وقتی یکی رو حذف می کردم اون یکی کار می کرد و بقیه توابع که فراخونی کرده بودم اجرا می شدند اما اگر یکی از for ها رو پاک نمی کردم و هر دو باقی می موندند دیگه بقیه توابع اجرا نمی شدند مثل این می موند که داخل یک حلقه وایل گیر کرده باشه، اومدم و حافظه heap رو زیاد کردم و برنامه درست اجرا شد.
      ---------
      .
      .
      ...........

      دیدگاه


        #4
        پاسخ : فرق بین حافظه stack و heap توی میکروکنترلرا چیه ؟

        نوشته اصلی توسط ajapyy
        ممنون از توضیحتون.
        من کدی نوشته بودم و حافظه heap براش نزاشته بودم. داخل کد چند تا تابع بود که هر کدوم متغیرهای محلی برای خودشون داشتند. حافظه stack اما تعریف شده بود. اتفاقی که می افتاد این بود که تا یک جای برنامه درست اجرا می شد اما بقیه دیگه اجرا نمی شد.
        مثلا تو یکی از توابع دو تا حلقه for داشتم. وقتی یکی رو حذف می کردم اون یکی کار می کرد و بقیه توابع که فراخونی کرده بودم اجرا می شدند اما اگر یکی از for ها رو پاک نمی کردم و هر دو باقی می موندند دیگه بقیه توابع اجرا نمی شدند مثل این می موند که داخل یک حلقه وایل گیر کرده باشه، اومدم و حافظه heap رو زیاد کردم و برنامه درست اجرا شد.
        خب سوالی که ایجاد میشه اینه که ، شما هیچ متغیری از نوع heap تعریف نکرده بودین که بخاد از این نوع حافظه استفاده کنه و با کمبود حافظه روبرو بشه !!! بنظرتون واقعا مشکل از حافظه heap میتونسته باشه ؟؟
        اینکه شما میگین با زیاد کردن حافظه heap مشکل رفع شده یکم عجیبه. در codevision اگه دقت کنین ، بصورت پیش فرض میزان فضایی که به این نوع از حافظه در نظر گرفته شده ، 0 هستش .
        اون چیزی که بنظرم میرسه اینه که نمیتونه مشکل از حافظه heap بوده باشه .
        اگه دوستان چیزی بنظرشون میرسه ، قرار بدن .
        یاعلی مدد
        در کشور هاي غربي انتقال تجربيات و دانش به افراد مبتدي يک پيشرفت محسوب شده و به آن مديريت دانش مي گويند. ولي متاسفانه اين فرهنگ هنوز در کشور ايران رايج نشده است !!!

        دیدگاه


          #5
          پاسخ : فرق بین حافظه stack و heap توی میکروکنترلرا چیه ؟

          من متغیرهامو رو عادی تعریف کرده بودم. یعنی یک سری محلی و یک سری سراسری. در تعریفشون هم اصطلاح مربوط به malloc رو هم به کار نبرده بودم.
          توی کیل داشتم برنامه می نوشتم و برای آرم. میگم من تغییری توی کد ندادم و فقط حافظه heap رو از تنظیمات زیاد کردم که برنامه درست شد.
          ---------
          .
          .
          ...........

          دیدگاه

          لطفا صبر کنید...
          X