বাস্তবে, স্ট্যাকটি বৃদ্ধি করা কঠিন (এবং কখনও কখনও অসম্ভব)। ভার্চুয়াল মেমরির কেন কিছু বোঝার প্রয়োজন তা বোঝার জন্য।
একক থ্রেডযুক্ত অ্যাপ্লিকেশন এবং স্বচ্ছ মেমরির ইয়ে ওল্ডে দিনগুলিতে তিনটি ছিল একটি প্রক্রিয়া ঠিকানার স্থানের তিনটি উপাদান: কোড, হিপ এবং স্ট্যাক। এই তিনটি কীভাবে ওএসের উপর নির্ভর করা হয়েছিল, তবে সাধারণত কোডটি প্রথমে আসে মেমরির নীচে থেকে শুরু করে, গাদাটি পরবর্তী দিকে এসে উপরের দিকে বেড়ে যায় এবং স্ট্যাকটি স্মৃতির শীর্ষে শুরু হয় এবং নীচের দিকে বৃদ্ধি পায়। অপারেটিং সিস্টেমের জন্য কিছু মেমরি সংরক্ষিত ছিল, তবে আমরা এটিকে অবহেলা করতে পারি। সেই দিনগুলিতে প্রোগ্রামগুলিতে কিছুটা বেশি নাটকীয় স্ট্যাক ওভারফ্লো হয়েছিল: স্ট্যাকটি গাদাটির মধ্যে ক্র্যাশ হয়ে যাবে এবং কোনটি প্রথমে আপডেট হয়েছিল তার উপর নির্ভর করে আপনি হয় খারাপ ডেটা নিয়ে কাজ করবেন বা একটি সাব্রোটিন থেকে স্মৃতিতে কিছু নির্বিচারে ফিরে আসবেন return
মেমরি ম্যানেজমেন্ট এই মডেলটিকে কিছুটা বদলেছে: প্রোগ্রামটির দৃষ্টিকোণ থেকে আপনার কাছে এখনও একটি প্রক্রিয়া মেমরি মানচিত্রের তিনটি উপাদান ছিল এবং সেগুলি সাধারণত একইভাবে সাজানো হয়েছিল তবে এখন প্রতিটি উপাদানই একটি স্বতন্ত্র বিভাগ হিসাবে পরিচালিত হয়েছিল এবং এমএমইউ সংকেত দেবে ওএস প্রোগ্রামটি যদি কোনও বিভাগের বাইরে মেমরি অ্যাক্সেস করার চেষ্টা করে। একবার আপনার ভার্চুয়াল মেমরি হয়ে গেলে, কোনও প্রোগ্রামের পুরো ঠিকানা জায়গাতে অ্যাক্সেস দেওয়ার কোনও প্রয়োজন বা ইচ্ছা ছিল না । সুতরাং বিভাগগুলিকে নির্দিষ্ট সীমানা নির্ধারণ করা হয়েছিল।
তাহলে কেন কোনও প্রোগ্রামের পুরো ঠিকানা জায়গায় অ্যাক্সেস দেওয়া বাঞ্ছনীয় নয়? কারণ সেই স্মৃতিটি অদলবদলের বিরুদ্ধে "কমিট চার্জ" গঠন করে; যে কোনও সময় কোনও প্রোগ্রামের জন্য যে কোনও বা সমস্ত মেমরির অন্য কোনও প্রোগ্রামের স্মৃতির জন্য জায়গা তৈরি করতে অদলবদল করতে হবে। যদি প্রতিটি প্রোগ্রাম সম্ভাব্যভাবে 2 জিবি অদলবদ গ্রহণ করতে পারে তবে তা হয় আপনার সমস্ত প্রোগ্রামের জন্য পর্যাপ্ত পরিমাণে অদলবদল সরবরাহ করতে হবে বা দুটি প্রোগ্রামকে যতটা সম্ভব তার চেয়ে বেশি প্রয়োজন হবে এমন সুযোগটি নিতে হবে।
এই মুহুর্তে, পর্যাপ্ত ভার্চুয়াল অ্যাড্রেস স্পেস ধরে, আপনি প্রয়োজনে এই বিভাগগুলি প্রসারিত করতে পারেন, এবং ডেটা বিভাগে (হিপ) আসলে সময়ের সাথে সাথে বৃদ্ধি পেতে পারে: আপনি একটি ছোট ডেটা বিভাগে শুরু করেন এবং যখন মেমরি বরাদ্দকারী আরও স্থানের জন্য অনুরোধ করে তখন এটা দরকার এই মুহুর্তে, একটি একক স্ট্যাকের সাহায্যে, স্ট্যাক সেগমেন্টটি প্রসারিত করা শারীরিকভাবে সম্ভব হয়েছিল: ওএস সেগমেন্টের বাইরের কিছু ঠেলাঠেলি করে আরও স্মৃতি যুক্ত করতে পারে tra তবে এটিও বিশেষভাবে কাম্য নয়।
মাল্টি-থ্রেডিং প্রবেশ করান। এই ক্ষেত্রে, প্রতিটি থ্রেডে একটি পৃথক স্ট্যাক সেগমেন্ট থাকে, আবার স্থির আকার। তবে এখন সেগমেন্টগুলি একের পর এক ভার্চুয়াল অ্যাড্রেস স্পেসে রেখে দেওয়া হয়েছে, সুতরাং অন্য অংশ না সরানো ছাড়া এক বিভাগকে প্রসারিত করার কোনও উপায় নেই - যা আপনি করতে পারবেন না কারণ প্রোগ্রামটি স্ট্যাকের মধ্যে থাকা স্মৃতিতে থাকার সম্ভাবনা রয়েছে poin আপনি বিকল্পভাবে বিভাগগুলির মধ্যে কিছু স্থান রেখে দিতে পারেন, তবে সেই স্থানটি প্রায় সমস্ত ক্ষেত্রেই নষ্ট হবে। অ্যাপ্লিকেশন বিকাশকারীকে বোঝা চাপিয়ে দেওয়া আরও ভাল পদ্ধতির ছিল: আপনার যদি সত্যিই গভীর স্ট্যাকের প্রয়োজন হয় তবে থ্রেড তৈরি করার সময় আপনি এটি নির্দিষ্ট করতে পারেন।
আজ, 64৪-বিটের ভার্চুয়াল ঠিকানার স্থান সহ আমরা কার্যকরভাবে অসীম সংখ্যক থ্রেডের জন্য কার্যকরভাবে অসীম স্ট্যাক তৈরি করতে পারি। তবে আবার, এটি বিশেষভাবে কাম্য নয়: প্রায় সব ক্ষেত্রেই একটি স্ট্যাক ওভারলো আপনার কোড সহ একটি বাগটি নির্দেশ করে। আপনাকে একটি 1 গিগাবাইট স্ট্যাক সরবরাহ করা সহজভাবে সেই বাগটি আবিষ্কারকে পিছিয়ে দেয়।