Stack আর Stack Frame

A highly motivated and experienced full-stack developer with a proven track record of developing and deploying web applications. Skilled in a range of programming languages and frameworks, as well as database technologies. Comfortable working in a fast-paced environment and able to adapt to new technologies quickly. A team player who is also able to work independently when required.
Stack কি?
Stack হল memory এর একটা special জায়গা যেটা LIFO (Last In, First Out) principle অনুসারে কাজ করে। একটা plate stack এর কথা ভাবুন - আপনি সবসময় উপরের প্লেটটা তুলেন, আর নতুন প্লেট যোগ করলে সেটাও উপরেই রাখেন।
প্রতিটা running program এর জন্য OS memory এর একটা অংশ stack হিসেবে বরাদ্দ করে। এর two main pointers থাকে:
Stack Pointer (SP): stack এর top পয়েন্ট করে
Base Pointer (BP): current function এর stack frame এর base address দেখায়
বেশিরভাগ modern architecture (যেমন x86) তে stack "grows down" - মানে যত নতুন জিনিস add হয়, stack pointer ততই lower memory address এ যায়।
Stack Frame: Function Call এর ব্লুপ্রিন্ট
যখনই কোন function কল করেন, stack এ একটা নতুন block তৈরি হয় - এটাই stack frame। এটা function এর সবকিছু hold করে রাখে।
Stack Frame এ থাকে:
Function Parameters: function এর যে arguments পাঠানো হয়েছে
Return Address: function শেষ হলে কোড কোথায় ফিরে যাবে
Previous Frame Pointer: আগের stack frame এর address
Local Variables: function এর সব local variable
Temporary Results: calculation এর অস্থায়ী results
Saved Registers: function কল করার সময় save করা registers
একটা typical stack frame এর structure:
| Parameter n | <-- উপরের দিকে (higher memory address)
| ... |
| Parameter 2 |
| Parameter 1 |
| Return Address |
| Saved Base Pointer |
| Local Variable 1 |
| Local Variable 2 |
| ... |
| Local Variable m | <-- নিচের দিকে (lower memory address)
Function Call এ Stack কিভাবে কাজ করে
একটা function কল হলে stack এ step-by-step যা ঘটে:
Function কল করার সময় (Prologue):
Arguments Push: caller সব arguments stack এ push করে
Return Address Push:
callinstruction বাইট-কোড execute হলে, CPU automatically return address stack এ push করেBase Pointer Save: current BP stack এ save হয়
New Base Pointer Set: BP-কে current SP এর value দিয়ে update করা হয়
Local Variables এর জায়গা নেওয়া: SP কে adjust করে variables এর জন্য জায়গা বানানো হয়
এই পয়েন্টে function এর actual code execution শুরু হয়।
Function শেষ হওয়ার সময় (Epilogue):
Return Value Set: যদি function কিছু return করে, তাহলে সেটা register এ set করা হয়
SP Reset: SP কে BP এর value তে নিয়ে আসা হয়
Previous BP Restore: আগের BP restore করা হয়
Return: return address অনুযায়ী execution আবার আগের function এ ফিরে যায়
এই প্রসেসে function এর stack frame create হয় আর পরে clean up হয়, কোন memory leak ছাড়াই।
Thread আর Stack এর সম্পর্ক
Thread আর stack একে অপরের সাথে গভীরভাবে connected। এদের সম্পর্ক বুঝলে concurrent programming অনেক সহজ হয়ে যায়:
প্রতিটি Thread এর নিজস্ব Stack আছে
এটা concurrent programming এর একটা fundamental concept:
প্রতিটা Thread নিজের Stack পায়: যখন OS একটা নতুন thread create করে, তখন এর জন্য একটা separate stack memory allocate করা হয়
Stack Size Configuration: প্রায় সব OS এ thread এর stack size configure করা যায় (보통 1MB থেকে 8MB)
Stack Isolation: একটা thread এর stack অন্য thread এর stack থেকে completely isolated
Thread এর Stack কেন আলাদা?
Thread এর stack আলাদা হওয়ার কারণ:
Function Call Independence: একাধিক thread একই সময়ে function call করলেও তারা একে অপরের stack frame affect করে না
Local Variable Safety: Stack variables thread-safe (যদি reference না pass করা হয়)
Parallel Execution: Multiple threads একই সময়ে execute করার সময় নিজেদের local execution context থাকে
Multi-threading এ Stack vs Heap
এখানে একটা important difference আছে:
Stack Variables: Thread-safe, কারণ প্রতিটা thread এর নিজের আলাদা stack
Heap Variables: Thread-safe না, কারণ সব thread একই heap share করে
func threadSafeExample() {
// Thread-safe (stack variable)
counter := 0
counter++
// Not thread-safe (heap variable)
sharedCounter := &counter
// Multiple threads accessing sharedCounter needs synchronization
}
Context Switch এ Stack এর ভূমিকা
যখন OS এক thread থেকে অন্য thread এ switch করে, তখন:
Current thread এর stack-related state (SP, BP) সব save করা হয়
Thread control block এ registers এর state save করা হয়
New thread এর saved stack state restore করা হয়
Execution new thread এর stack এ continue করে
এটা হল context switch এর একটা core component যা concurrent programming সম্ভব করে।
Stack Overflow in Threaded Applications
Thread এর stack সাইজ limited হওয়ায়:
Thread stacks অনেক ছোট হতে পারে (1-8MB) যেখানে process এর main stack বড় হতে পারে
Deep recursion বা large local arrays থ্রেডেড অ্যাপ্লিকেশনে বেশি risk create করে
Thread stack size application start করার সময় configure করা যায়
Stack Memory এর বিশেষ ফিচার
Automatic Memory Management: stack memory allocation/deallocation নিজে থেকেই হয় - কোন
malloc/freeবা garbage collection লাগে নাFast Allocation: stack এ memory allocation হয় শুধু pointer adjust করে, যা super fast
Cache Friendly: stack এর data memory তে পাশাপাশি থাকে, যা cache performance ভালো করে
Size Limit: stack এর সাইজ সীমিত (usually few MB)
Thread-Specific: প্রতিটা thread এর নিজের আলাদা stack আছে
Stack Overflow:
Stack এর সবচেয়ে বড় লিমিটেশন হল এর সীমিত সাইজ। যখন program stack এর allocated space এর চেয়ে বেশি use করে, তখন stack overflow হয়। এটা সাধারণত হয়:
Infinite Recursion: কোন function নিজেকে বারবার কল করে যায় আর থামে না
Deep Recursion: অনেক level গভীরে recursion হওয়া
Large Local Variables: function এর ভিতরে huge arrays বা objects
Stack overflow হলে program crash করে যায়।
Stack vs Heap: মেমোরি ম্যানেজমেন্টের দুই দুনিয়া
Stack এর opposite হল heap memory। এদের মধ্যে important differences:
| Feature | Stack | Heap |
| Allocation | Automatic | Manual or garbage collected |
| Speed | Super fast | Slower |
| Size | Limited | Large |
| Lifetime | Function call পর্যন্ত | Programmer controlled |
| Use Cases | Local variables, function calls | Dynamic size objects, sharing between functions |
| Access Pattern | Sequential, cache-friendly | Random, less cache-friendly |
| Allocation Order | LIFO | No specific order |
| Threading | Thread-specific | Shared between threads |



