اطلاعیه

Collapse
No announcement yet.

بحث در مورد Heap &Stack

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

    بحث در مورد Heap &Stack

    سلام.
    چطور میشه که مقدار Heap size و stack size رو توی یه برنامه فهمید؟
    چند وقت پیش یه برنامه از اینترنت گرفته بودم که یه تابع خیلی جالب داشت.این تابع اسم یه تابع رو به عنوان آرگومان میگرفت و مقدار استکی که اون تابع نیاز داره رو برمیگردوند.البته فکر میکنم که اینجوری باشه چون فقط هدر فایلش قابل خوندن بود و فایل اصلی به صورت کتابخونه بود.
    حالا کسی میدونه که چطوری میشه این کار رو کرد؟
    خلاصه هرکی هر چی در مورد Heap وStack داره بگه. پیشاپیش از همتون تشکر میکنم.
    [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

    #2
    پاسخ : بحث در مورد Heap &Stack

    اگر منظور نوشتن همچون تابعی باشه که میشه. فقط کافیه کد تولید شده اون تابع رو مرور کرد و به هر دستوری رسید ببینه اگر دستور push هست یکی به میزان stack مصرفی اضافه کنه و pop یکی کم کنه. بعد مقدار ماکزیمم این عدد در طول بررسی میشه حجم ماکزیمم stack مورد نیاز. اما این روش کوره و خیلی چیزا رو نمیبینه. مثلا اگر روتین خوش رو صدا بزنه کار مشکل میشه. ضمنا یک برنامه بایستی بتونه call-tree رو هم دربیاره تا بتونه یک تخمین بهتری از حجم stack مورد نیاز برنامه دربیاره.

    ولی معمولا ما به این سطح نمیرسیم. چون حافظه از دو جهت مورد دسترسی قرار میگیره از یک طرف برای داده های برنامه و stack و از طرف دیگه برای heap. اگر حجم این دو تا بیشتر از حجم sram بشه خوب برنامه قاطی میکنه. یا اینکه ممکنه signal پیش بیاد.

    دیدگاه


      #3
      پاسخ : بحث در مورد Heap &Stack

      ممنون آقا رضا از جوابتون.
      خوب heap چطوری محاسبه میشه؟
      اینکه تعداد Push ها و pop ها رو بشمریم که راه خیلی سختیه.من میخوام بدونم برنامه ای که نوشتم به چقدر استک نیاز داره تا تنظیمش کنم یا در موارد حرفه ای تر برای کار با برنامه های مولتی تسکینگ ازش استفاده کنم.یعنی وقتی که موقع تعویض تسک میخوام مقدار Stack رو توی یه آرایه ذخیره کنم.بدونم این آرایه چه قدر مقدار باید داشته باشه.
      تو چند تا برنامه ای که دیدم توی یه ساختار یه آرایه ی مثلا 64 تایی با بقیه رجیستر هایی که نیاز داریم تعریف کرده بود .بعد برای هر تسک یه متغیر از نوع این ساختار تعریف میکرد و توی اون استک رو ذخیره میکرد . اشکال این نوع نوشتن اینه که بدون توجه به نوع تسک 64 بایت از رم رو الکی اشغال میکنه حالا کاری نداره این تسک به 1 بایت نیاز داره یا 64 بایت.
      اگه بشه یجوری مقدار دقیقی که هر تسک نیاز داره رو محاسبه کنیم کلی در حجم رم صرفه جویی میشه.
      [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

      دیدگاه


        #4
        پاسخ : بحث در مورد Heap &Stack

        اگه مشکل بایت بایت رم دستگاهتونه که از من میشنوین یک میکروی بزرگتر انتخاب کنین یا حافظه جنبی اضافه کنین. و گرنه بذارین هر وقت به این مشکل برخوردین با ذکر مثال حلش کنین. چون این موارد بستگی خیلی زیادی به فرم برنامه نوشتن و کامپایلر مورد استفاده تون هم داره. چون وقتی میکروتون 4 کیلو رم داشته باشه حالا شما از 100 بایت کمتر یا بیشترش استفاده کنی یا نکنی مهم نیست.

        دیدگاه


          #5
          پاسخ : بحث در مورد Heap &Stack

          راستش در حال حاضر مشکل کمبود رم ندارم ولی میخوام قاعده و روش کار رو بدونم تا بعدا که به یه میکرو بزرگتر و تسک های سنگین تر رسیدم بدونم که قضیه چطوریه. الان اگه 10 تا تسک هم تعریف کنم که هرکدوم هم [glow=red,2,300]128[/glow] بایت برای استک داشته باشند کلا میشه1.5 کیلو بایت!!! که مشکلی فعلا ایجاد نمیکنه.
          کامپایلر من هم فعلا winavr هست.
          حالا سوالی که من دارم اینه که چطوری میتونم مقدار رمی که برای ذخیره ی استک هر تسک مورد نیاز هست رو تعیین کنم؟ (برای مثال در بالا 128 که نوشتم).قبلا وقتی یدونه برنامه بود تجربی مقدار رو حساب میکردم یعنی با سعی و خطا میشد فهمید.
          سوال دومم اینه که برای اینکه CPU بتونه به محل ذخیره هر تسک دسترسی پیدا کنه و اونو ادامه بده فقط باید SREG و SP و ریجستر های Working رو داشته باشه؟ ریجستر دیگه ای برای این کار لازم نیست؟
          [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

          دیدگاه


            #6
            پاسخ : بحث در مورد Heap &Stack

            رجیستر که نه. ولی هر تسک یک سری اطلاعات دیگه ای هم غیر از محتوای رجیستر ها و استک احتیاج داره که بسته به پیاده سازی سیستم عاملش فرق میکنه.
            ضمنا بستگی به نحوه تولید کد حجم استک مورد نیاز هم فرق میکنه. یک کامپایلر کل آرگومانها رو از طریق استک به تابع میفرسته اون یکی تا تعدادی رو داخل رجیستر و بقیه رو توی استک. یکی در یک تابع از رجیستر ها استفاده میکنه اون یکی همون کد رو جوری تولید میکنه که فقط با استک کار میکنه. پارامتر ها زیاده. بهتره که به اینا فکر نکنی و گرنه میشه گفت شاید اون موقع که شما خواستی فلان کار رو بکنی میکرو با حجم رم بالا گیرت نیاد. اونوقت چی؟ و از این اونوقت چی ها اینقده قطار بشه که نتونی به یک کار ساده هم برسی. از من میشنوی به کارهات برس و عمرت رو تلف نکن و با مشکلات موقعی دست و پنجه نرم کن که موقعش باشه.

            دیدگاه


              #7
              پاسخ : بحث در مورد Heap &Stack

              خوب پس میشه گفت برای اینکه بدونی چه چیزهایی رو باید ذخیره کنی تا CPU بدونه که هر تسک رو تا کجا پیش برده باید به عملکرد کامپایلر توجه کنی. این بحث که WinAvr چطور آرگومان ها رو به تابع انتقال میده رو به وقتش تو تاپیک خودش مطرح میکنم تا مطالب پراکنده نشه.
              شما اطلاعاتی در مورد Heap هم دارید؟ مثل استک جزیی نمیخوام فقط کلیتش رو میخوام بدونم. :agree:
              [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

              دیدگاه


                #8
                پاسخ : بحث در مورد Heap &Stack

                نه فقط کامپایلر بلکه خود سورسهای مربوط به سیستم عامل. من حرفم اینه بهترین راه برای نوشتن کد در اینگونه مواقع بی خیالیه. کدات رو بنویس اگر به مشکلی برخوردی بیا با هم دونه به دونه تحلیل میکنیم. خیلی وقتها تحلیل برای موردی که معلوم نیست چیه یک عمل غیر ممکنه.

                راجع به heap هم مادامی که با توابعی مثل malloc و realloc و free یا new و delete کار نمیکنی با heap درگیری نداری. اما به محض اینکه با یکی از اینا مستقیم یا غیر مستقیم کار کنی (که در کار با میکرو به ندرت پیش میاد) تازه با heap درگیر میشی. یک کلوم heap تفاوت میزان کل حافظه موجود با میزان حافظه مصرف شده برای stack و data های برنامه ات هست. اگر میکرو ات جوری بود که حافظه اش بین چند برنامه مورد استفاده مشترک بود حساسیتت راجع به heap منطقی "بنظر میرسید" اما جنابعالی چه یک تسک داشته باشی چه چند تا heap استفاده نشده ات رو که نمیتونی به یک میکروی دیگه انتقال بدی. پس این رو هم مفهومش رو بدون ولی بی خیالش شو. خیلی از این تئوری ها در عمل بدرد محیطهایی مثل windows و linux میخوره. نه یک محیط بسته مثل میکروکنترلر.

                دیدگاه


                  #9
                  پاسخ : بحث در مورد Heap &Stack

                  منم به این روش بیخیالی اعتقاد دارم خیلی وقتها جواب داده
                  من با همین سبک برنامه رو مینویسم . اگه جایی از برنامه مشکل داشت با هم بررسی میکنیم.
                  بازم ممنون بابت کمکتون. @};-
                  [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                  دیدگاه


                    #10
                    پاسخ : بحث در مورد Heap &Stack

                    البته بنظر میرسه بحث رو تموم کردین ولی یک سری به تئوری های مربوط به ماشین وضعیت بزنین. خیلی جاها میشه با استفاده از این تکنیک از حالت multi-tasking یا استفاده از یک تسک اضافه پرهیز کرد.

                    دیدگاه


                      #11
                      پاسخ : بحث در مورد Heap &Stack

                      راستش این بحث که تمومی نداره واسه همین من فعلا گفتم یه مقدار رو برنامه کار کنم .شاید موقع کار , با سعی و خطا قلق کار دستم اومد.
                      اگه شما رفرنس یا کتابی در این مورد میشناسید که فکر میکنید به درد من میخوره لطفا معرفی کنید.به نظر من این قسمت از برنامه یکی از جالبترین قسمت های برنامه هست
                      [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                      دیدگاه


                        #12
                        پاسخ : بحث در مورد Heap &Stack

                        اینا خیلی بیشتر حسیه و تجربی. کتاب خاصی نمیشه معرفی کرد. همه کتابی هم بدرد میخوره. اما ذکر مطالبش بیش از اون که بدرد بخور باشه وقت گیره و لزومی هم نداره. بهترین کار همون فرم الابختکی خودمونه. اگر مورد نقضی پیدا شد مطرح کنین تا بشه با هم روش کار کنیم.

                        دیدگاه


                          #13
                          پاسخ : بحث در مورد Heap &Stack

                          در مورد ماشین وضعیت هم یه سرچی کردم و چیزهایی در موردش فهمیدم .فکر کنم اگه بتونم ازش استفاده کنم خیلی کمک کنه.
                          من دارم الان رو کدهای برنامه کار میکنم .خدا رو شکر فعلا به مشکلی برنخوردم(شایدم خوردم ولی هنوز نفهمیدم )
                          اگر مورد نقضی پیدا شد مطرح کنین تا بشه با هم روش کار کنیم.
                          واقعا مرسی.آدم وقتی میدونه اگه به مشکلی بر بخوره کسی هست که کمکش کنه میتونه با اعتماد به نفس بیشتری کار کنه.
                          [img width=477 height=100]http://www.eca.ir/pic/upload/agazade.png[/img]

                          دیدگاه

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