Forwarded from Deleted Account
http://bayanbox.ir/view/2217721331961810063/code-in-stack.png
#نکته
🔆 قوائد حافظه Stack
- در حافظه مجازی دستگاه، قسمت #Stack قرار داره.
- محل ذخیره متغیرهای محلی(غیر static)، پارامتر های توابع، آدرس های بازگشتی(return) توابع هست. (همچنین ردگیری توابع تودرتو)
- سایز Stack برنامه هنگام Compile تعیین و تخصیص داده میشه.
- در مقابل مشکل Stackoverflow پاسخگو هستش.
- بصورت خودکار توسط CPU مدیریت میشه.
- با فراخوانی تابع، Push میشه بداخل حافظه Stack و با خاتمه کار تابع، Pop میشه از داخل حافظه Stack.
- از نظر سرعت در اشغال فضا، از حافظه Heap سریعتره.
- در زبان C/Cpp، کلاس ها و ساختمان ها درصورت عدم استفاده از اشاره گر در حافظه Stack ذخیره میشن.
- در حین allocation/اشغال نابخردانه یا بیش از ظرفیت می تونه stackoverflow رخ بده.
- هر برنامه یک thread main داره و هر thread یک حافظه Stack خصوصی داره. پس تا وقتی که thread بسته نشده Stack ش هم وجود داره. (در اینجا بستن یعنی exit و نه terminate)
- حوزه ی حافظه Stack برنامه به thread اون برنامه ضمیمه شده.
- داده ها در حافظه Stack بترتیب بر روی هم قرار می گیرند.(با قائده LIFO)
- با افزایش مصرف حافظه stack، حافظه کمتری برای heap باقی می مونه.
- این نوع از حافظه readable و writable هستش.
و...
🔆 مشکل Stackoverflow
واژه stackoverflow در لغت بمعنی سرریز شدن Stack هستش. از جمله دلایل خطای stackoverflow میشه عمق زیاد توابع تودرتو/nested و chain، متغیرهای محلی حجیم، بزرگ شدن بیش از حد سایز stack، تخریب یا corrupt شدن قسمتی از memory، استفاده اشتباه از Native API رو نام برد.
⚠️ نکته: مشکل Stackoverflow از دسته Error ها هستش و نه Exception ها.
با اجرای کدهای زیر درک بیشتری نسبت به حافظه Stack و مشکل Stackoverflow پیدا خواهید کرد.
📄 مثال PHP:
"PHP Fatal error: Allowed memory size of 134217728 bytes(134MB) exhausted (tried to allocate 130968 bytes) in develop.php on line 5."
در این مثال با هربار فراخوانی تابع myInfiniteRecursion()، یک Stack Frame برای اون تابع در حافظه Stack ایجاد میشه و این روند تا جایی که موتور PHP (مقدار memory_limit در php.ini) اجازه داشته باشه ادامه پیدا میکنه... نهایتاً ظرفیت مجاز Stack موتور PHP پر میشه و اسکریپت سعی میکنه به خارج از ظرفیت Stack دسترسی پیدا کنه اما سیستم اجازه نمیده و اسکریپت رو با خطای stackoverflow متوقف میکنه.
📄 مثال Java:
"Exception in thread "main" java.lang.StackOverflowError"
📄 مثال C:
"Linux: Segmentation fault.
Windows: Unhandled exception in develop.exe: 0xC00000FD: Stackoverflow."
میبینید که در همه خطاها واژه stack و overflow مشترکه;
⚠️ توجه: خطای buffer overflow با خطای stack overflow ارتباطی نداره و این دو با هم تفاوت دارن.
#نکته
🔆 قوائد حافظه Stack
- در حافظه مجازی دستگاه، قسمت #Stack قرار داره.
- محل ذخیره متغیرهای محلی(غیر static)، پارامتر های توابع، آدرس های بازگشتی(return) توابع هست. (همچنین ردگیری توابع تودرتو)
- سایز Stack برنامه هنگام Compile تعیین و تخصیص داده میشه.
- در مقابل مشکل Stackoverflow پاسخگو هستش.
- بصورت خودکار توسط CPU مدیریت میشه.
- با فراخوانی تابع، Push میشه بداخل حافظه Stack و با خاتمه کار تابع، Pop میشه از داخل حافظه Stack.
- از نظر سرعت در اشغال فضا، از حافظه Heap سریعتره.
- در زبان C/Cpp، کلاس ها و ساختمان ها درصورت عدم استفاده از اشاره گر در حافظه Stack ذخیره میشن.
- در حین allocation/اشغال نابخردانه یا بیش از ظرفیت می تونه stackoverflow رخ بده.
- هر برنامه یک thread main داره و هر thread یک حافظه Stack خصوصی داره. پس تا وقتی که thread بسته نشده Stack ش هم وجود داره. (در اینجا بستن یعنی exit و نه terminate)
- حوزه ی حافظه Stack برنامه به thread اون برنامه ضمیمه شده.
- داده ها در حافظه Stack بترتیب بر روی هم قرار می گیرند.(با قائده LIFO)
- با افزایش مصرف حافظه stack، حافظه کمتری برای heap باقی می مونه.
- این نوع از حافظه readable و writable هستش.
و...
function myFunction (param1, param2) // To Stack memory
{
_testVar = param1 + param2; // To Stack memory
return _testVar; // To Stack memory
}
🔆 مشکل Stackoverflow
واژه stackoverflow در لغت بمعنی سرریز شدن Stack هستش. از جمله دلایل خطای stackoverflow میشه عمق زیاد توابع تودرتو/nested و chain، متغیرهای محلی حجیم، بزرگ شدن بیش از حد سایز stack، تخریب یا corrupt شدن قسمتی از memory، استفاده اشتباه از Native API رو نام برد.
⚠️ نکته: مشکل Stackoverflow از دسته Error ها هستش و نه Exception ها.
با اجرای کدهای زیر درک بیشتری نسبت به حافظه Stack و مشکل Stackoverflow پیدا خواهید کرد.
📄 مثال PHP:
function myInfiniteRecursion()
{
myInfiniteRecursion();
}
myInfiniteRecursion();
"PHP Fatal error: Allowed memory size of 134217728 bytes(134MB) exhausted (tried to allocate 130968 bytes) in develop.php on line 5."
در این مثال با هربار فراخوانی تابع myInfiniteRecursion()، یک Stack Frame برای اون تابع در حافظه Stack ایجاد میشه و این روند تا جایی که موتور PHP (مقدار memory_limit در php.ini) اجازه داشته باشه ادامه پیدا میکنه... نهایتاً ظرفیت مجاز Stack موتور PHP پر میشه و اسکریپت سعی میکنه به خارج از ظرفیت Stack دسترسی پیدا کنه اما سیستم اجازه نمیده و اسکریپت رو با خطای stackoverflow متوقف میکنه.
📄 مثال Java:
class MyClass
{
private MyClass MyCls = new MyClass();
public static void main(String[] args)
{
new MyClass();
}
}
"Exception in thread "main" java.lang.StackOverflowError"
📄 مثال C:
int main()
{
int large[10000000] = {0};
return 0;
}
"Linux: Segmentation fault.
Windows: Unhandled exception in develop.exe: 0xC00000FD: Stackoverflow."
میبینید که در همه خطاها واژه stack و overflow مشترکه;
⚠️ توجه: خطای buffer overflow با خطای stack overflow ارتباطی نداره و این دو با هم تفاوت دارن.