Skip to main content

Command Palette

Search for a command to run...

Stack আর Stack Frame

Published
5 min read
Stack আর Stack Frame
I

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 এ থাকে:

  1. Function Parameters: function এর যে arguments পাঠানো হয়েছে

  2. Return Address: function শেষ হলে কোড কোথায় ফিরে যাবে

  3. Previous Frame Pointer: আগের stack frame এর address

  4. Local Variables: function এর সব local variable

  5. Temporary Results: calculation এর অস্থায়ী results

  6. 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):

  1. Arguments Push: caller সব arguments stack এ push করে

  2. Return Address Push: call instruction বাইট-কোড execute হলে, CPU automatically return address stack এ push করে

  3. Base Pointer Save: current BP stack এ save হয়

  4. New Base Pointer Set: BP-কে current SP এর value দিয়ে update করা হয়

  5. Local Variables এর জায়গা নেওয়া: SP কে adjust করে variables এর জন্য জায়গা বানানো হয়

এই পয়েন্টে function এর actual code execution শুরু হয়।

Function শেষ হওয়ার সময় (Epilogue):

  1. Return Value Set: যদি function কিছু return করে, তাহলে সেটা register এ set করা হয়

  2. SP Reset: SP কে BP এর value তে নিয়ে আসা হয়

  3. Previous BP Restore: আগের BP restore করা হয়

  4. 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 আলাদা হওয়ার কারণ:

  1. Function Call Independence: একাধিক thread একই সময়ে function call করলেও তারা একে অপরের stack frame affect করে না

  2. Local Variable Safety: Stack variables thread-safe (যদি reference না pass করা হয়)

  3. 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 করে, তখন:

  1. Current thread এর stack-related state (SP, BP) সব save করা হয়

  2. Thread control block এ registers এর state save করা হয়

  3. New thread এর saved stack state restore করা হয়

  4. 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 এর বিশেষ ফিচার

  1. Automatic Memory Management: stack memory allocation/deallocation নিজে থেকেই হয় - কোন malloc/free বা garbage collection লাগে না

  2. Fast Allocation: stack এ memory allocation হয় শুধু pointer adjust করে, যা super fast

  3. Cache Friendly: stack এর data memory তে পাশাপাশি থাকে, যা cache performance ভালো করে

  4. Size Limit: stack এর সাইজ সীমিত (usually few MB)

  5. Thread-Specific: প্রতিটা thread এর নিজের আলাদা stack আছে

Stack Overflow:

Stack এর সবচেয়ে বড় লিমিটেশন হল এর সীমিত সাইজ। যখন program stack এর allocated space এর চেয়ে বেশি use করে, তখন stack overflow হয়। এটা সাধারণত হয়:

  1. Infinite Recursion: কোন function নিজেকে বারবার কল করে যায় আর থামে না

  2. Deep Recursion: অনেক level গভীরে recursion হওয়া

  3. Large Local Variables: function এর ভিতরে huge arrays বা objects

Stack overflow হলে program crash করে যায়।

Stack vs Heap: মেমোরি ম্যানেজমেন্টের দুই দুনিয়া

Stack এর opposite হল heap memory। এদের মধ্যে important differences:

FeatureStackHeap
AllocationAutomaticManual or garbage collected
SpeedSuper fastSlower
SizeLimitedLarge
LifetimeFunction call পর্যন্তProgrammer controlled
Use CasesLocal variables, function callsDynamic size objects, sharing between functions
Access PatternSequential, cache-friendlyRandom, less cache-friendly
Allocation OrderLIFONo specific order
ThreadingThread-specificShared between threads
2 views

More from this blog

Low Level Design: গভীর থেকে বোঝা এবং আয়ত্ত করা

ভূমিকা: কেন এই Article? তুমি হয়তো programming শিখেছ। Variable, loop, function, data structure - সব জানো। কিন্তু যখন একটা বড় system বানাতে বসো, তখন মনে হয় কোথা থেকে শুরু করব? কীভাবে organize করব? Code লিখতে লিখতে হারিয়ে যাও একটা maze-এ। এই feeling...

Oct 15, 202520 min read71
Low Level Design: গভীর থেকে বোঝা এবং আয়ত্ত করা

Go-তে Interface কীভাবে Code Decouple করে?

একটা HTTP Server দিয়ে পুরো ব্যাপারটা বুঝে নেওয়া যাক আমরা সবাই জানি Go একটা সিম্পল ল্যাঙ্গুয়েজ, কিন্তু interface নিয়ে অনেকেরই confusion থাকে। আজকে আমরা দেখব কীভাবে interface আসলে তোমার code-কে flexible এবং maintainable বানায়। একটা real-world HTT...

Oct 14, 202520 min read5
Go-তে Interface কীভাবে Code Decouple করে?

তোমার Project-এ Coupled Code কীভাবে খুঁজে বের করবে?

Coupled code খোঁজা মানে হচ্ছে তোমার codebase-এ এমন জায়গা খুঁজে বের করা যেখানে একটা অংশ আরেকটার উপর বেশি depend করছে। এটা একটা detective work — তুমি clue খুঁজবে, pattern দেখবে, এবং সমস্যা চিহ্নিত করবে। চলো step by step শিখি কীভাবে এটা করতে হয়। কেন ...

Oct 14, 202510 min read2

Go-তে Object (Struct Instance) তৈরির সম্পূর্ণ গাইড

Go programming শেখার সময় একটা জিনিস খুব তাড়াতাড়ি বুঝতে হয় - কীভাবে object তৈরি করতে হয়। অন্য language যেমন Java বা Python এ class আছে, কিন্তু Go-তে আছে struct। আর struct এর instance বানানোই হলো object তৈরি করা। আজকের এই blog এ আমরা দেখব Go-তে ob...

Oct 13, 202524 min read3
Go-তে Object (Struct Instance) তৈরির সম্পূর্ণ গাইড
I

Imran Hasan

61 posts

Full-stack developer with experience in developing and managing web applications. Skilled in React, Node.js, HTML, CSS, and JavaScript. Experience in managing website hosting and security.