স্ট্যাক এবং গাদা কি এবং কোথায়?


8098

প্রোগ্রামিং ভাষার বইগুলি ব্যাখ্যা করে যে স্ট্যাকের উপর মান প্রকারগুলি তৈরি করা হয় , এবং এই দুটি জিনিস কী তা ব্যাখ্যা না করেই স্তূপে রেফারেন্স প্রকারগুলি তৈরি করা হয়। আমি এর একটি পরিষ্কার ব্যাখ্যা পড়িনি। আমি বুঝতে পারি একটি স্ট্যাক কি। কিন্তু,

  • তারা কোথায় এবং কী (একটি বাস্তব কম্পিউটারের স্মৃতিতে শারীরিকভাবে)?
  • ওএস বা ভাষা রান-টাইমের মাধ্যমে তারা কতটা নিয়ন্ত্রণ করে?
  • তাদের সুযোগ কী?
  • এদের প্রত্যেকের আকার কী নির্ধারণ করে?
  • কি দ্রুততর করে তোলে?

175
একটি সত্যই ভাল ব্যাখ্যা এখানে পাওয়া যাবে একটি স্ট্যাক এবং একটি গাদা মধ্যে পার্থক্য কি?
সোঙ্গো

12
এছাড়াও (সত্যই) ভাল: কোডেপ্রজেক্ট / আর্টিকেল / 76153 / (স্ট্যাক / গাদা অংশ)
বেন


3
সম্পর্কিত, স্ট্যাক সংঘর্ষ দেখুন । স্ট্যাক ক্ল্যাশ প্রতিকারগুলি সিস্টেম ভেরিয়েবল এবং এর মতো আচরণের কিছু দিককে প্রভাবিত করে rlimit_stack। এছাড়াও রেড হ্যাট ইস্যু 1463241
jww

3
@ ম্যাটশনে স্ট্যাক এবং হ্যাপের সংজ্ঞাগুলি যা মান এবং রেফারেন্সের ধরণের উপর নির্ভর করে না। অন্য কথায়, মান এবং রেফারেন্স ধরণের অস্তিত্ব না থাকলেও স্ট্যাক এবং হিপগুলি পুরোপুরি সংজ্ঞায়িত করা যায়। তদ্ব্যতীত, মান এবং রেফারেন্সের ধরণগুলি বোঝার সময়, স্ট্যাকটি কেবল একটি বাস্তবায়ন বিশদ। প্রতি এরিক লিপার্ট: স্ট্যাকটি একটি বাস্তবায়ন বিশদ, প্রথম ভাগ
ম্যাথু

উত্তর:


5960

স্ট্যাক হ'ল কার্য সম্পাদনের থ্রেডের জন্য স্ক্র্যাচ স্পেস হিসাবে আলাদা করা মেমরি। যখন কোনও ফাংশন বলা হয়, স্থানীয় ভেরিয়েবল এবং কিছু বুককিপিং ডেটার জন্য স্ট্যাকের শীর্ষে একটি ব্লক সংরক্ষিত থাকে। যখন এই ফাংশনটি ফিরে আসে, ব্লকটি অব্যবহৃত হয়ে যায় এবং পরের বার কোনও ফাংশন বলার জন্য ব্যবহার করা যেতে পারে। স্ট্যাকটি সর্বদা একটি লাইফো (সর্বশেষে শেষের) ক্রমে সংরক্ষিত থাকে; সর্বাধিক সংরক্ষিত ব্লক সর্বদা মুক্তি পাওয়ার পরের ব্লক। এটি স্ট্যাকের উপর নজর রাখা সত্যিই সহজ করে তোলে; স্ট্যাক থেকে একটি ব্লক মুক্ত করা একটি পয়েন্টার সামঞ্জস্য করা ছাড়া আর কিছুই নয়।

গাদা গতিশীল বরাদ্দের জন্য আলাদা করা মেমরি। স্ট্যাকের বিপরীতে, গাদা থেকে ব্লকগুলি বরাদ্দ এবং অবনতির কোনও প্রয়োগকৃত প্যাটার্ন নেই; আপনি যে কোনও সময় একটি ব্লক বরাদ্দ করতে এবং যে কোনও সময় এটিকে ফ্রি করতে পারেন। এটি যে স্তূপের কোন অংশ নির্ধারিত সময়ে বরাদ্দ দেওয়া হয়েছে বা নিখরচায় রয়েছে তার নিরীক্ষণ করা আরও জটিল করে তোলে; বিভিন্ন ব্যবহারের নিদর্শনগুলির জন্য সুরক্ষিত হিপ পারফরম্যান্সের জন্য অনেকগুলি কাস্টম হ্যাপ বরাদ্দ পাওয়া যায়।

প্রতিটি থ্রেড একটি স্ট্যাক পায়, যখন অ্যাপ্লিকেশনটির জন্য সাধারণত কেবলমাত্র একটি গাদা থাকে (যদিও বিভিন্ন ধরণের বরাদ্দের জন্য একাধিক স্তূপ রাখা অস্বাভাবিক নয়)।

আপনার প্রশ্নের সরাসরি উত্তর দিতে:

ওএস বা ভাষা রানটাইম দ্বারা তারা কতটা নিয়ন্ত্রণ করে?

থ্রেডটি তৈরি হওয়ার পরে প্রতিটি সিস্টেম-স্তরের থ্রেডের জন্য ওএস স্ট্যাক বরাদ্দ করে। অ্যাপ্লিকেশনটির হিপ বরাদ্দ করতে সাধারণত ভাষা রানটাইম দ্বারা ওএসকে ডাকা হয়।

তাদের সুযোগ কী?

স্ট্যাকটি একটি থ্রেডের সাথে সংযুক্ত থাকে, সুতরাং থ্রেডটি প্রস্থান করলে স্ট্যাকটি পুনরায় দাবি করা হয়। রানটাইম দ্বারা অ্যাপ্লিকেশন শুরুতে হিপগুলি সাধারণত বরাদ্দ করা হয় এবং অ্যাপ্লিকেশন (প্রযুক্তিগতভাবে প্রক্রিয়া) প্রস্থান করার সময় পুনরুদ্ধার করা হয়।

এদের প্রত্যেকের আকার কী নির্ধারণ করে?

কোনও থ্রেড তৈরি হয়ে গেলে স্ট্যাকের আকার সেট করা হয়। হিপটির আকার অ্যাপ্লিকেশন শুরুতে সেট করা থাকে, তবে স্থান প্রয়োজনের সাথে বাড়তে পারে (বরাদ্দকারী অপারেটিং সিস্টেম থেকে আরও মেমরি অনুরোধ করে)।

কি দ্রুততর করে তোলে?

স্ট্যাকটি দ্রুততর হয় কারণ অ্যাক্সেস প্যাটার্নটি এটিকে থেকে মেমরি বরাদ্দকরণ এবং ডিএলোকট করতে তুচ্ছ করে তোলে (পয়েন্টার / পূর্ণসংখ্যা কেবল বাড়ানো বা হ্রাস করা হয়), যখন গাদা একটি বরাদ্দ বা অবনতির সাথে জড়িত আরও অনেক জটিল বুককিপিং রয়েছে। এছাড়াও, স্ট্যাকের প্রতিটি বাইট খুব ঘন ঘন পুনরায় ব্যবহার করা হয় যার অর্থ এটি প্রসেসরের ক্যাশে ম্যাপ করা যায়, এটি খুব দ্রুত করে তোলে। গাদাটির জন্য আরেকটি পারফরম্যান্স হিট হ'ল মূলত গ্লোবাল রিসোর্স হ'ল হিপটি সাধারণত মাল্টি-থ্রেডিং নিরাপদ হতে হয়, অর্থাত্ প্রতিটি বরাদ্দ এবং ডিএলোকেশন হওয়া দরকার - সাধারণত - প্রোগ্রামে "সমস্ত" অন্যান্য গাদা অ্যাক্সেসের সাথে সিঙ্ক্রোনাইজ করা।

একটি পরিষ্কার বিক্ষোভ:
চিত্র উত্স: vikashazrati.wordpress.com


74
উত্তম উত্তর - তবে আমি মনে করি আপনার যুক্ত করা উচিত যে যখন প্রক্রিয়াটি শুরু হয় যখন কোনও ওএসের দ্বারা স্ট্যাক বরাদ্দ করা হয় (কোনও ওএসের অস্তিত্ব অনুমান করে), এটি প্রোগ্রামের দ্বারা ইনলাইন বজায় রাখা হয়। এই স্ট্যাকটি দ্রুততর হওয়ার অন্য কারণ, ধাক্কা এবং পপ অপারেশনগুলি সাধারণত একটি মেশিনের নির্দেশনা হয় এবং আধুনিক মেশিনগুলি একটি চক্রের মধ্যে তাদের মধ্যে কমপক্ষে 3 টি করতে পারে, যেখানে ওএস কোডে কলিং জড়িত বা হিপ বরাদ্দ করা জড়িত।
sqykly

273
আমি শেষে ডায়াগ্রাম দ্বারা সত্যিই বিভ্রান্ত। আমি ভাবলাম আমি এই চিত্রটি না পাওয়া পর্যন্ত এটি পেয়েছি।
সিনা মাদানী

10
@ আনারেল প্রসেসর কোনও OS এর সাথে বা ছাড়াই নির্দেশনা চালায়। আমার হৃদয়ের কাছাকাছি একটি উদাহরণ হ'ল এসএনইএস, যার কোনও এপিআই কল ছিল না, কোনও OS নেই যা আমরা এটি আজ জানি - তবে এটির স্ট্যাক ছিল। এই সিস্টেমে স্ট্যাকের জন্য বরাদ্দ করা সংযোজন এবং বিয়োগফল এবং এটি তৈরি করা ফাংশন থেকে ফিরে যখন পপ করা হয় তখন ভেরিয়েবলগুলির পক্ষে এটি ঠিক আছে, তবে একটি নির্মাণকারীর সাথে এটির গঠন করুন, যার ফলাফল কেবলমাত্র হতে পারে না দূরে নিক্ষিপ্ত. তার জন্য আমাদের গাদা দরকার, যা কল এবং ফিরে যাওয়ার সাথে আবদ্ধ নয়। বেশিরভাগ ওএসের এপিআই হিপ থাকে, এটি নিজেই করার কোনও কারণ নেই
sqykly

2
"স্ট্যাক হ'ল স্ক্র্যাচ স্পেস হিসাবে আলাদা করা স্মৃতি"। কুল। তবে এটি আসলে জাভা মেমরি কাঠামোর দিক থেকে "আলাদা" কোথায় ?? এটি কি হিপ মেমরি / নন-হ্যাপ মেমরি / অন্যান্য ( বেটসল ডটকম / ২০১ /0/০ //২০১৮ অনুসারে জাভা মেমরি স্ট্রাকচার )
যতীন শশু

4
@ জাটিনশাশু জাভা রানটাইম, বাইটকোড দোভাষী হিসাবে, ভার্চুয়ালাইজেশনের আরও একটি স্তর যুক্ত করেছে, তাই আপনি যা উল্লেখ করেছেন তা কেবল জাভা অ্যাপ্লিকেশন পয়েন্ট অফ দ্য ভিউ। অপারেটিং সিস্টেমের দৃষ্টিকোণ থেকে এগুলি কেবল একটি হিপ, যেখানে জাভা রানটাইম প্রক্রিয়া তার কিছু জায়গা "নন-হিপ" মেমরি হিসাবে প্রক্রিয়াজাত বাইকোডের জন্য বরাদ্দ করে। ওএস-স্তরের হিপগুলির বাকি অংশটি অ্যাপ্লিকেশন-স্তরের হিপ হিসাবে ব্যবহৃত হয়, যেখানে বস্তুর ডেটা সংরক্ষণ করা হয়।
kbec

2348

স্ট্যাক:

  • কম্পিউটারের র‌্যামে সঞ্চিত ঠিক হিড়ির মতো।
  • স্ট্যাকের মধ্যে তৈরি ভেরিয়েবলগুলি সুযোগের বাইরে চলে যাবে এবং স্বয়ংক্রিয়ভাবে dellocated হয়।
  • গাদাতে চলকগুলির তুলনায় তুলনামূলকভাবে বরাদ্দ করা আরও দ্রুত faster
  • একটি বাস্তব স্ট্যাক ডেটা কাঠামো দিয়ে প্রয়োগ করা হয়েছে।
  • প্যারামিটার পাস করার জন্য ব্যবহৃত স্থানীয় ডেটা, রিটার্ন ঠিকানাগুলি সঞ্চয় করে।
  • যখন স্ট্যাকের অনেক বেশি ব্যবহার করা হয় তখন (বেশিরভাগ অসীম বা খুব গভীর পুনরাবৃত্তি থেকে, খুব বড় বরাদ্দ থেকে) স্ট্যাক ওভারফ্লো হতে পারে।
  • স্ট্যাকে তৈরি ডেটা বিনা পয়েন্টার ব্যবহার করা যেতে পারে।
  • সংকলনের সময় আপনাকে ঠিক কতটা ডেটা বরাদ্দ করতে হবে তা সঠিকভাবে জানা থাকলে এবং এটি খুব বড় নয় use
  • আপনার প্রোগ্রামটি শুরু হওয়ার পরে সাধারণত সর্বাধিক আকার নির্ধারিত থাকে।

গাদা:

  • কম্পিউটার র‌্যামে স্ট্যাকের মতো সঞ্চিত।
  • সি ++ তে, গাদাতে থাকা ভেরিয়েবলগুলি ম্যানুয়ালি ধ্বংস করতে হবে এবং কখনই সুযোগের বাইরে পড়বে না। ডেটার সাথে মুক্তি পেয়েছে delete, delete[]বা, free
  • স্ট্যাকের ভেরিয়েবলের তুলনায় তুলনামূলকভাবে ধীর গতিতে।
  • প্রোগ্রাম দ্বারা ব্যবহারের জন্য ডেটা একটি ব্লক বরাদ্দ দাবিতে ব্যবহৃত।
  • যখন প্রচুর বরাদ্দ এবং অবনতি হয় তখন খণ্ডিত হতে পারে।
  • সি ++ বা সি-তে, গাদাতে তৈরি ডেটা পয়েন্টারগুলি দ্বারা নির্দেশিত হবে এবং যথাক্রমে newবা এর সাথে বরাদ্দ হবে malloc
  • খুব বেশি বড় বাফারকে বরাদ্দের অনুরোধ করা হলে বরাদ্দ ব্যর্থতা থাকতে পারে।
  • চলার সময় আপনার ঠিক কতটা ডেটা প্রয়োজন হবে বা আপনার যদি প্রচুর ডেটা বরাদ্দ করতে হয় তবে সঠিকভাবে না জানলে আপনি হিপটি ব্যবহার করবেন।
  • স্মৃতি ফাঁসির জন্য দায়বদ্ধ।

উদাহরণ:

int foo()
{
  char *pBuffer; //<--nothing allocated yet (excluding the pointer itself, which is allocated here on the stack).
  bool b = true; // Allocated on the stack.
  if(b)
  {
    //Create 500 bytes on the stack
    char buffer[500];

    //Create 500 bytes on the heap
    pBuffer = new char[500];

   }//<-- buffer is deallocated here, pBuffer is not
}//<--- oops there's a memory leak, I should have called delete[] pBuffer;

31
পয়েন্টার পিফার এবং খ এর মান স্ট্যাকের উপরে অবস্থিত এবং সম্ভবত ফাংশনের প্রবেশদ্বারে বরাদ্দ করা হয়। সংকলকটির উপর নির্ভর করে ফাংশনের প্রবেশদ্বারেও বাফার বরাদ্দ করা যেতে পারে।
অ্যান্ডি

36
এটি একটি সাধারণ ভুল ধারণা যে ভাষার মান Cদ্বারা C99ভাষা নির্ধারিত ( ওপেন -স্টডি.আর.জেসিটি 1 / এসসি 22/WG14/www/docs/n1256.pdfউপলব্ধ ) এর জন্য একটি "স্ট্যাক" প্রয়োজন। আসলে, 'স্ট্যাক' শব্দটি এমনকি স্ট্যান্ডার্ডে উপস্থিত হয় না। এই জবাবগুলি জাগ্রত / থেকে Cস্ট্যাকের ব্যবহারগুলি সাধারণভাবে সত্য, তবে কোনওভাবেই ভাষাটির প্রয়োজন হয় না। দেখুন knosof.co.uk/cbook/cbook.html আরও তথ্যের জন্য এবং বিশেষ করে কিভাবে Cযেমন বিজোড় বল আর্কিটেকচারের উপর বাস্তবায়িত হয় en.wikipedia.org/wiki/Burroughs_large_systems
johne

55
@ ব্রায়ানকে আপনার ব্যাখ্যা করা উচিত কেন বাফার [] এবং পিফার পয়েন্টারটি স্ট্যাকের উপরে তৈরি করা হয় এবং পিফফারের ডেটা কেন স্তূপে তৈরি করা হয়। আমি মনে করি কিছু পিপিএল আপনার উত্তর দ্বারা বিভ্রান্ত হতে পারে কারণ তারা মনে করতে পারে যে প্রোগ্রামটি বিশেষভাবে নির্দেশ দিচ্ছে যে স্টেম বনাম হিপগুলিতে মেমরি বরাদ্দ করা উচিত তবে এটি ঘটনাটি নয়। এটি কি কারণ বাফার একটি মান ধরণের যেখানে পিফার একটি রেফারেন্স টাইপ?
হাওিক্যাম্প

9
@ রিমোভার: কোনও পয়েন্টার কোনও ঠিকানা রাখে না এবং এটি গাদা বা স্ট্যাকের সমানভাবে কিছুতে নির্দেশ করতে পারে। নতুন, মলোক এবং অন্যান্য কিছু ফাংশন মলকের মতো একই পরিমাণে বরাদ্দ দেয় এবং বরাদ্দ করা মেমরির ঠিকানা ফেরত দেয়। আপনি কেন গাদা বরাদ্দ করতে চান? যাতে আপনার স্মৃতিশক্তি সুযোগের বাইরে চলে না যায় এবং আপনি এটি না করা পর্যন্ত মুক্তি পাবেন না।
ব্রায়ান আর বন্ডি

35
"মেমরি ফাঁসের জন্য দায়বদ্ধ" - মেমরি ফাঁসের জন্য গাদা দায়বদ্ধ নয়! অলস / ভুলে যাওয়া / প্রাক্তন জাভা কোডার / কোডাররা যারা বোকা দেয় না তারা হ'ল!
লাজ

1370

সবচেয়ে গুরুত্বপূর্ণ বিষয়টি হ'ল গাদা এবং স্ট্যাক হল জেনেরিক পদগুলি যে উপায়গুলিতে মেমরি বরাদ্দ করা যায়। এগুলি বিভিন্ন উপায়ে প্রয়োগ করা যেতে পারে এবং শর্তাদি মূল ধারণাগুলির ক্ষেত্রে প্রযোজ্য।

  • আইটেমের স্ট্যাকে, আইটেমগুলি সেখানে রাখা ক্রম অনুসারে একে অপরের উপরে বসে থাকে এবং আপনি কেবল শীর্ষটি সরাতে পারেন (পুরো জিনিসটি টপল না করে)।

    কাগজের স্ট্যাকের মতো স্ট্যাক

    স্ট্যাকের সরলতা হ'ল আপনাকে বরাদ্দ মেমরির প্রতিটি বিভাগের রেকর্ডযুক্ত একটি সারণী বজায় রাখতে হবে না; আপনার কেবলমাত্র রাষ্ট্রীয় তথ্য প্রয়োজন হ'ল স্ট্যাকের শেষের একক পয়েন্টার। বরাদ্দ এবং ডি-বরাদ্দ করার জন্য, আপনি কেবলমাত্র একক পয়েন্টার বৃদ্ধি এবং হ্রাস। দ্রষ্টব্য: একটি স্ট্যাক কখনও কখনও মেমরির একটি বিভাগের শীর্ষে শুরু করতে এবং উপরের দিকে বাড়ার চেয়ে নীচে প্রসারিত করতে প্রয়োগ করা যেতে পারে।

  • একটি স্তূপে, আইটেমগুলি যেভাবে স্থাপন করা হয়েছে তার কোনও নির্দিষ্ট ক্রম নেই। কোনও স্পষ্ট 'শীর্ষ' আইটেম নেই বলে আপনি কোনও ক্রমে আইটেমগুলিতে পৌঁছাতে এবং মুছে ফেলতে পারেন।

    অজস্র লাইসেন্সের স্তূপের মতো গাদা

    গাদা বরাদ্দকরণে কী মেমরি বরাদ্দ করা হয় এবং কোনটি নয় তার পুরো রেকর্ড বজায় রাখা দরকার, পাশাপাশি খণ্ড খণ্ডকে হ্রাস করতে কিছু ওভারহেড রক্ষণাবেক্ষণের জন্য অনুরোধের আকারের সাথে ফিট করার জন্য যথেষ্ট পরিমাণে মেটাল মেমরির অংশগুলি খুঁজে পেতে পারেন। মেমরিটি যে কোনও সময় ফাঁকা জায়গা ছেড়ে চলে যেতে পারে all কখনও কখনও মেমোরি বরাদ্দকারী রক্ষণাবেক্ষণের কাজগুলি যেমন বরাদ্দকৃত মেমরিটিকে ঘুরিয়ে রেখে মেমরি ডিফ্রেগমেন্টিং বা আবর্জনা সংগ্রহ করা - রানটাইমগুলিতে শনাক্তকরণের সময় সনাক্ত না করে যখন স্মৃতিটির আর সুযোগ থাকে না এবং এটিকে হ্রাস করা হয়।

এই চিত্রগুলির একটি স্ট্যাক এবং একটি স্তূপে মেমরি বরাদ্দকরণ এবং মুক্ত করার দুটি উপায় বর্ণনা করার জন্য যথেষ্ট ভাল কাজ করা উচিত। ইস!

  • ওএস বা ভাষা রানটাইম দ্বারা তারা কতটা নিয়ন্ত্রণ করে?

    উল্লিখিত হিসাবে, গাদা এবং স্ট্যাকটি সাধারণ পদ, এবং এটি বিভিন্ন উপায়ে প্রয়োগ করা যেতে পারে। কম্পিউটার প্রোগ্রামগুলিতে সাধারণত একটি কল স্ট্যাক নামে একটি স্ট্যাক থাকে যা বর্তমান ফাংশনের সাথে সম্পর্কিত তথ্য যেমন কোনও পয়েন্টার থেকে যে কোনও ফাংশন থেকে ফোন করা হয়েছিল এবং যে কোনও স্থানীয় ভেরিয়েবল সংরক্ষণ করে। ফাংশনগুলি অন্যান্য ক্রিয়াকলাপগুলিকে কল করে এবং তারপরে ফিরে আসার কারণে কল স্ট্যাকের নিচে ফাংশনগুলি থেকে তথ্য ধরে রাখতে স্ট্যাকটি বৃদ্ধি পায় এবং সঙ্কুচিত হয়। একটি প্রোগ্রামের আসলে এটির উপর রানটাইম নিয়ন্ত্রণ নেই; এটি প্রোগ্রামিং ভাষা, ওএস এবং এমনকি সিস্টেম আর্কিটেকচার দ্বারা নির্ধারিত হয়।

    গাদা একটি সাধারণ শব্দ যা কোনও স্মৃতিতে ব্যবহৃত হয় যা গতিশীল এবং এলোমেলোভাবে বরাদ্দ করা হয়; অর্ডার অফ আউট। মেমরিটি সাধারণত ওএস দ্বারা বরাদ্দ করা হয়, অ্যাপ্লিকেশন কলিং এপিআই ফাংশনগুলির সাথে এই বরাদ্দটি করতে। ডায়নামিকভাবে বরাদ্দ মেমরি পরিচালনায় প্রচুর পরিমাণে ওভারহেড প্রয়োজন হয় যা সাধারণত প্রোগ্রামিং ভাষা বা পরিবেশের ব্যবহৃত রানটাইম কোড দ্বারা পরিচালিত হয়।

  • তাদের সুযোগ কী?

    কল স্ট্যাকটি এমন একটি নিম্ন স্তরের ধারণা যা প্রোগ্রামিংয়ের অর্থে এটি 'স্কোপ' এর সাথে সম্পর্কিত নয়। যদি আপনি কিছু কোড বিচ্ছিন্ন করে থাকেন তবে আপনি স্ট্যাকের অংশগুলির সাথে সম্পর্কিত পয়েন্টার শৈলীর উল্লেখ দেখতে পাবেন, তবে উচ্চতর স্তরের ভাষার ক্ষেত্রে, ভাষাটি তার নিজস্ব সুযোগের নিয়ম আরোপ করে। তবে স্ট্যাকের একটি গুরুত্বপূর্ণ বিষয় হ'ল একবার ফাংশন ফিরে আসার পরে সেই ফাংশনে স্থানীয় যে কোনও কিছু সঙ্গে সঙ্গে স্ট্যাক থেকে মুক্তি দেওয়া হয়। আপনার প্রোগ্রামিং ভাষাগুলি কীভাবে কাজ করে তা আপনি কাজ করার জন্য এটি যেভাবে প্রত্যাশা করতেন তা কাজ করে। একটি গাদা, এটি সংজ্ঞা দেওয়াও কঠিন। স্কোপটি ওএস দ্বারা যা খুশি হয়েছে তা হ'ল তবে আপনার প্রোগ্রামিং ভাষা সম্ভবত আপনার অ্যাপ্লিকেশনে একটি "সুযোগ" কী তা সম্পর্কে তার বিধিগুলি যুক্ত করে। প্রসেসরের আর্কিটেকচার এবং ওএস ভার্চুয়াল ঠিকানা ব্যবহার করে, যেটি প্রসেসর শারীরিক ঠিকানায় অনুবাদ করে এবং সেখানে পৃষ্ঠার ত্রুটি রয়েছে ইত্যাদি They তারা কোন অ্যাপ্লিকেশনগুলির সাথে কী পৃষ্ঠাগুলির অন্তর্ভুক্ত তা ট্র্যাক করে। আপনার সত্যিকার অর্থে কখনই চিন্তা করার দরকার নেই, কারণ আপনার প্রোগ্রামিং ভাষাটি বরাদ্দ এবং নিখরচায় মেমরির জন্য যে কোনও পদ্ধতি ব্যবহার করে এবং ত্রুটিগুলি পরীক্ষা করে (যদি কোনও কারণে বরাদ্দ / নিবন্ধন ব্যর্থ হয়)।

  • এদের প্রত্যেকের আকার কী নির্ধারণ করে?

    আবার এটি ভাষা, সংকলক, অপারেটিং সিস্টেম এবং আর্কিটেকচারের উপর নির্ভর করে। একটি স্ট্যাক সাধারণত প্রাক বরাদ্দ করা হয়, কারণ সংজ্ঞা অনুসারে এটি অবশ্যই স্বচ্ছ মেমরির হতে হবে। ভাষা সংকলক বা ওএস এর আকার নির্ধারণ করে। আপনি স্ট্যাকের উপরে প্রচুর পরিমাণে ডেটা সঞ্চয় করেন না, তাই এটি এত বড় হবে যে অযাচিত অবিরাম পুনরাবৃত্তি (অতএব, "স্ট্যাক ওভারফ্লো") বা অন্যান্য অস্বাভাবিক প্রোগ্রামিংয়ের সিদ্ধান্ত ব্যতীত এটি কখনই পুরোপুরি ব্যবহার করা উচিত নয়।

    একটি গাদা একটি সাধারণ শব্দ যা গতিশীলভাবে বরাদ্দ করা যেতে পারে। আপনি কোন দিকে তাকান তার উপর নির্ভর করে এটি ক্রমাগত আকার পরিবর্তন করে। আধুনিক প্রসেসর এবং অপারেটিং সিস্টেমগুলিতে এটি যেভাবে কাজ করে ঠিক সেই পদ্ধতিটি যাইহোক খুব বিমূর্ত হয়, সুতরাং এটি সাধারণত কীভাবে এটি গভীরভাবে কাজ করে সে সম্পর্কে আপনাকে খুব বেশি চিন্তা করার দরকার নেই, (যে ভাষাগুলিতে এটি আপনাকে দেয়) আপনি অবশ্যই স্মৃতি ব্যবহার করবেন না আপনি এখনও বরাদ্দ করেননি বা মেমরি যা আপনি মুক্ত করেছেন।

  • কি দ্রুততর করে তোলে?

    স্ট্যাকটি দ্রুততর কারণ সমস্ত নিখরচায় মেমরি সর্বদা সুসংগত। ফ্রি মেমরির সমস্ত বিভাগকে কোনও তালিকা বজায় রাখতে হবে না, স্ট্যাকের বর্তমান শীর্ষে কেবলমাত্র একক পয়েন্টার। সংকলকগণ সাধারণত এই উদ্দেশ্যে একটি বিশেষ, দ্রুত রেজিস্টারে এই পয়েন্টারটি সঞ্চয় করেন । সর্বোপরি, স্ট্যাকের পরবর্তী ক্রিয়াকলাপগুলি সাধারণত মেমরির খুব কাছের অঞ্চলে কেন্দ্রীভূত হয়, যা প্রসেসর অন ডাই ক্যাশে অপ্টিমাইজেশনের জন্য খুব কম স্তরে ভাল।


20
ডেভিড আমি একমত নই যে এটি একটি ভাল চিত্র বা "পুশ-ডাউন স্ট্যাক" ধারণাটি চিত্রিত করার জন্য একটি ভাল শব্দ। আপনি যখন কোনও স্ট্যাকের সাথে কিছু যুক্ত করেন, তখন স্ট্যাকের অন্যান্য সামগ্রীগুলি নীচে ঠেকানো হয় না , তারা যেখানে থাকে তেমন থাকে।
থোমাসরুটটার

8
এই উত্তরে একটি বৃহত ভুল অন্তর্ভুক্ত রয়েছে। স্ট্যাটিক ভেরিয়েবলগুলি স্ট্যাকের জন্য বরাদ্দ করা হয় না। স্পষ্টতার জন্য আমার উত্তর [লিঙ্ক] stackoverflow.com/a/13326916/1763801 দেখুন । আপনি "স্ট্যাটিক" ভেরিয়েবলগুলির সাথে "স্বয়ংক্রিয়" ভেরিয়েবলগুলি সমান করছেন তবে সেগুলি
মোটেও একরকম

13
বিশেষত, আপনি বলছেন যে "স্ট্যাটিকালি বরাদ্দ স্থানীয় ভেরিয়েবলগুলি" স্ট্যাকের জন্য বরাদ্দ করা হয়েছে। আসলে এগুলি ডেটা বিভাগে বরাদ্দ করা হয়। কেবলমাত্র স্বয়ংক্রিয়ভাবে বরাদ্দকৃত ভেরিয়েবলগুলি (যার মধ্যে বেশিরভাগ কিন্তু সমস্ত স্থানীয় ভেরিয়েবল অন্তর্ভুক্ত নয় এবং এছাড়াও ফাংশন পরামিতিগুলির মতো জিনিসগুলি রেফারেন্সের পরিবর্তে মান দ্বারা পাস করা হয়) স্ট্যাকের জন্য বরাদ্দ করা হয়।
ডেভেক

9
আমি ঠিক বুঝতে পেরেছি যে আপনি ঠিক বলেছেন - সি তে, স্থিতিশীল বরাদ্দ গতিশীল নয় এমন কোনও জিনিসের জন্য একটি শব্দটির চেয়ে তার নিজস্ব পৃথক জিনিস । আমি আমার উত্তর সম্পাদনা করেছি, ধন্যবাদ।
thomasrutter

5
এটি কেবল সি জাভা, পাস্কাল, পাইথন এবং অন্যান্য অনেকেরই স্ট্যাটিক বনাম স্বয়ংক্রিয় বনাম গতিশীল বরাদ্দের ধারণা রয়েছে। "স্ট্যাটিক বরাদ্দ" বলার অর্থ প্রায় সর্বত্র একই জিনিস। কোনও ভাষায় স্থির বরাদ্দের অর্থ "গতিশীল নয়"। আপনি যা বর্ণনা করছেন (অর্থাত্ স্ট্যাকের জিনিসগুলি) তার জন্য আপনি "স্বয়ংক্রিয়" বরাদ্দ শব্দটি চান।
ডেভেক

726

(আমি এই উত্তরটি অন্য একটি প্রশ্ন থেকে সরিয়ে নিয়েছি যা এই প্রশ্নের কমবেশি ডুপ ছিল))

আপনার প্রশ্নের উত্তরটি নির্দিষ্টকরণ বাস্তবায়ন এবং সংকলক এবং প্রসেসরের আর্কিটেকচারে পৃথক হতে পারে। তবে, এখানে একটি সরল ব্যাখ্যা দেওয়া হয়েছে।

  • স্ট্যাক এবং হিপ উভয়ই অন্তর্নিহিত অপারেটিং সিস্টেম থেকে বরাদ্দকৃত মেমরি অঞ্চল (প্রায়শই ভার্চুয়াল মেমরি যা চাহিদা অনুসারে শারীরিক স্মৃতিতে ম্যাপ করা হয়)।
  • বহু-থ্রেডযুক্ত পরিবেশে প্রতিটি থ্রেডের নিজস্ব সম্পূর্ণ স্বতন্ত্র স্ট্যাক থাকবে তবে তারা স্তূপটি ভাগ করবে। একযোগে অ্যাক্সেস গাদা উপর নিয়ন্ত্রণ করতে হবে এবং স্ট্যাকের মধ্যে সম্ভব নয়।

গাদা

  • হিপটিতে ব্যবহৃত এবং বিনামূল্যে ব্লকগুলির একটি লিঙ্কযুক্ত তালিকা রয়েছে। হিপগুলিতে নতুন বরাদ্দগুলি ( newবা দ্বারা malloc) একটি মুক্ত ব্লক থেকে একটি উপযুক্ত ব্লক তৈরি করে সন্তুষ্ট। এটির জন্য গাদা ব্লকের তালিকা আপডেট করার প্রয়োজন। স্তূপে থাকা ব্লকগুলি সম্পর্কে এই মেটা সম্পর্কিত তথ্য প্রায়শই প্রতিটি ব্লকের সামনের অংশে ছোট্ট একটি অঞ্চলে প্রায়শই জমা হয় stored
  • গাদা বড় হওয়ার সাথে সাথে প্রায়শই নীচের ঠিকানাগুলি থেকে উচ্চতর ঠিকানার দিকে বরাদ্দ দেওয়া হয়। সুতরাং আপনি যদি একটি যেমন গাদা মনে করতে পারেন গাদা মেমরি ব্লক যে আকার যতই বৃদ্ধি পাবে মেমরি বরাদ্দ করা হয়। যদি বরাদ্দকরণের জন্য গাদাটি খুব ছোট হয় তবে অন্তর্নিহিত অপারেটিং সিস্টেম থেকে আরও মেমরি অর্জন করে আকারটি প্রায়শই বাড়ানো যেতে পারে।
  • অনেকগুলি ছোট ব্লক বরাদ্দ করা এবং হ্রাস করার ফলে ব্যবহৃত একটি ব্লকের মধ্যে ছেয়ে যাওয়া প্রচুর ছোট ছোট ব্লক রয়েছে state একটি বৃহত ব্লক বরাদ্দের একটি অনুরোধ ব্যর্থ হতে পারে কারণ ফ্রি ব্লকগুলির সম্মিলিত আকার পর্যাপ্ত পরিমাণে বড় হওয়া সত্ত্বেও নিখরচায় কোনওগুলিই বরাদ্দ অনুরোধটি পূরণ করতে যথেষ্ট নয় satis একে হিপ ফ্র্যাগমেন্টেশন বলে
  • যখন একটি ব্যবহৃত ব্লকটি একটি ফ্রি ব্লকের সাথে সংলগ্ন থাকে তখন নতুন ফ্রি ব্লকটি সংলগ্ন ফ্রি ব্লকের সাথে একত্রে মিশ্রিত করা যেতে পারে যাতে কার্যকরভাবে গাদাটির খণ্ড বিভাজন হ্রাস করতে পারে free

গাদা

স্ট্যাক

  • স্ট্যাক প্রায়শই সিপিইউতে স্ট্যাক পয়েন্টার নামক একটি বিশেষ রেজিস্ট্রারের সাথে ঘনিষ্ঠতার সাথে কাজ করে । প্রাথমিকভাবে স্ট্যাক পয়েন্টারটি স্ট্যাকের শীর্ষে (স্ট্যাকের সর্বোচ্চ ঠিকানা) নির্দেশ করে।
  • CPU- র জন্য বিশেষ নির্দেশাবলী রয়েছে ঠেলাঠেলি স্ট্যাকের সম্মুখের মূল্যবোধ ও পপিং তাদের স্ট্যাক থেকে ফিরে। প্রতিটি পুশ স্ট্যাক পয়েন্টারের বর্তমান অবস্থানে মান সঞ্চয় করে এবং স্ট্যাক পয়েন্টার হ্রাস করে। একটি পপ স্ট্যাক পয়েন্টার দ্বারা নির্দেশিত মানটি পুনরুদ্ধার করে এবং তারপরে স্ট্যাক পয়েন্টারটি বাড়িয়ে তোলে (স্ট্যাকের সাথে একটি মান যুক্ত করার ফলে স্ট্যাক পয়েন্টার হ্রাস হয় এবং একটি মান বৃদ্ধি অপসারণ করে বিভ্রান্ত হবেন না এটি করে Remember মনে রাখবেন যে স্ট্যাকটি বৃদ্ধি পায় নিচে). সঞ্চিত এবং পুনরুদ্ধার করা মানগুলি সিপিইউ নিবন্ধকের মান।
  • যখন কোনও ফাংশন বলা হয় সিপিইউ বিশেষ নির্দেশাবলী ব্যবহার করে যা বর্তমান নির্দেশ পয়েন্টারটিকে ধাক্কা দেয় , অর্থাত্ স্ট্যাকের উপর কার্যকর কোডের ঠিকানা। এরপরে সিপিইউ ডাকা ফাংশনের ঠিকানায় নির্দেশিকা নির্দেশক সেট করে ফাংশনে যায়। পরে, ফাংশনটি ফিরে আসার পরে, পুরানো নির্দেশিকা পয়েন্টারটি স্ট্যাক থেকে পপ করা হয় এবং ফাংশনে কল করার ঠিক পরে কোডে এক্সিকিউশনটি পুনরায় শুরু হয়।
  • যখন কোনও ফাংশন প্রবেশ করা হয়, স্থানীয় (স্বয়ংক্রিয়) ভেরিয়েবলের জন্য স্ট্যাকের আরও স্থান বরাদ্দ করতে স্ট্যাক পয়েন্টার হ্রাস করা হয়। যদি ফাংশনটির একটি স্থানীয় 32 বিট ভেরিয়েবল থাকে তবে চারটি বাইট স্ট্যাকের উপরে রেখে দেওয়া হয়। ফাংশনটি ফিরে আসার পরে, স্ট্যাক পয়েন্টারটি বরাদ্দকৃত অঞ্চলটি বিনামূল্যে সরিয়ে নেওয়া হয়।
  • যদি কোনও ফাংশনটির প্যারামিটার থাকে তবে ফাংশনটিতে কল করার আগে এগুলি স্ট্যাকের দিকে ঠেলে দেওয়া হয়। ফাংশনের কোডগুলি এই মানগুলি সনাক্ত করতে বর্তমান স্ট্যাক পয়েন্টার থেকে স্ট্যাকটি নেভিগেট করতে সক্ষম হয়।
  • নেস্টিং ফাংশন কলগুলি কবজ হিসাবে কাজ করে। প্রতিটি নতুন কল ফাংশন প্যারামিটারগুলি বরাদ্দ করবে, স্থানীয় ভেরিয়েবলগুলির জন্য ফেরতের ঠিকানা এবং স্থান এবং এই অ্যাক্টিভেশন রেকর্ডগুলি নেস্টেড কলগুলির জন্য সজ্জিত করা যেতে পারে এবং ফাংশনগুলি ফিরে আসার সময় সঠিক উপায়ে খুলে দেওয়া হবে।
  • স্ট্যাক যেমন মেমোরির একটি সীমিত ব্লক, আপনি অনেকগুলি নেস্টেড ফাংশনগুলি কল করে এবং / অথবা স্থানীয় ভেরিয়েবলের জন্য খুব বেশি জায়গা বরাদ্দ করে স্ট্যাকের ওভারফ্লো করতে পারেন । প্রায়শই স্ট্যাকের জন্য ব্যবহৃত মেমরি অঞ্চলটি এমনভাবে সেট আপ করা হয় যে স্ট্যাকের নীচে (সর্বনিম্ন ঠিকানা) রচনাগুলি সিপিইউতে একটি ফাঁদ বা ব্যতিক্রম ঘটায়। এই ব্যতিক্রমী অবস্থাটি তখন রানটাইমের দ্বারা ধরা পড়ে এবং একরকম স্ট্যাক ওভারফ্লো ব্যতিক্রমে রূপান্তরিত হতে পারে।

স্ট্যাক

স্ট্যাকের পরিবর্তে গাদা ফাংশন বরাদ্দ করা যেতে পারে?

না, ফাংশনগুলির জন্য অ্যাক্টিভেশন রেকর্ডগুলি (যেমন স্থানীয় বা স্বয়ংক্রিয় ভেরিয়েবলগুলি) স্ট্যাকের জন্য বরাদ্দ করা হয় যা কেবল এই ভেরিয়েবলগুলি সংরক্ষণ করার জন্যই ব্যবহৃত হয় না, তবে নেস্টেড ফাংশন কলগুলি ট্র্যাক রাখতেও ব্যবহৃত হয়।

হিপ কীভাবে পরিচালিত হয় তা রানটাইম পরিবেশের উপর নির্ভর করে। সি ব্যবহার করে mallocএবং সি ++ ব্যবহার করে newতবে অন্যান্য অনেক ভাষায় আবর্জনা সংগ্রহ রয়েছে।

যাইহোক, স্ট্যাকটি প্রসেসরের আর্কিটেকচারের সাথে নিবিড়ভাবে বাঁধা আরও নিম্ন-স্তরের বৈশিষ্ট্য। যখন পর্যাপ্ত জায়গা না থাকে তখন গাদা বাড়ানো খুব শক্ত নয় কারণ এটি লাইব্রেরি কলটিতে প্রয়োগ করা যেতে পারে যা গাদাটি পরিচালনা করে। তবে, স্ট্যাক বাড়ানো প্রায়শই অসম্ভব কারণ স্ট্যাকের ওভারফ্লো কেবল তখনই আবিষ্কার হয় যখন এটি খুব দেরী হয়; এবং মৃত্যুদন্ড কার্যকর করার একমাত্র কার্যকর বিকল্প the


35
@ মার্টিন - আরও বিমূর্ত গ্রহণযোগ্য উত্তরের চেয়ে খুব ভাল উত্তর / ব্যাখ্যা। স্ট্যাম পয়েন্টার / রেজিস্টার দেখানো একটি ভিজ্যু ফাংশন কলগুলির জন্য ব্যবহৃত একটি নমুনা সমাবেশ প্রোগ্রামটি আরও চিত্রিত হবে।
বিকাল লেম

3
প্রতিটি রেফারেন্স টাইপ মান ধরণের (ইন্ট, স্ট্রিং ইত্যাদি) রচনা। যেমনটি বলা হয়ে থাকে, মান মানগুলি স্টোরের মধ্যে সংরক্ষণ করা হয় যখন তারা রেফারেন্স টাইপের অংশ হয় তখন এটি কীভাবে কাজ করে।
এনপিএস

15
এই উত্তরটি আমার মতে সেরা ছিল, কারণ এটি আমাকে বুঝতে সাহায্য করেছিল যে রিটার্নের স্টেটমেন্টটি আসলে কী এবং এই "রিটার্ন ঠিকানা" এর সাথে কীভাবে সম্পর্কিত যেটি আমি এখন এবং পরে এসেছি, স্ট্যাকের উপরে কোনও ফাংশনকে ধাক্কা দেওয়ার অর্থ কী, এবং কেন ফাংশন স্ট্যাকের দিকে ঠেলাঠেলি করা হয়। দুর্দান্ত উত্তর!
অ্যালেক্স

3
এটি আমার মতে সর্বোত্তম, যথা উল্লেখ করার জন্য যে গাদা / স্ট্যাকটি খুব বাস্তবায়ন নির্দিষ্ট। অন্যান্য উত্তরগুলি ভাষা এবং পরিবেশ / ওএস সম্পর্কে প্রচুর পরিমাণে অনুমান করে । +1
কিউস - মনিকা

2
আপনার অর্থ কী "ফাংশনের কোডটি এই মানগুলি সনাক্ত করতে বর্তমান স্ট্যাক পয়েন্টার থেকে স্ট্যাকটি নেভিগেট করতে সক্ষম হয়।" ? আপনি এই দয়া করে বিস্তারিত বলতে পারেন?
Koray Tugay

404

নিম্নলিখিত সি # কোডে

public void Method1()
{
    int i = 4;
    int y = 2;
    class1 cls1 = new class1();
}

স্মৃতিটি কীভাবে পরিচালিত হয় তা এখানে

স্ট্যাকের ভেরিয়েবলের ছবি

Local Variablesএটি কেবল ততক্ষণ স্থায়ী হওয়া উচিত যতক্ষণ ফাংশন অনুরোধ স্ট্যাকের মধ্যে যায়। গাদাটি এমন ভেরিয়েবলগুলির জন্য ব্যবহৃত হয় যার আজীবন আমরা সত্যিই সামনে জানি না তবে আমরা সেগুলি কিছুক্ষণ স্থায়ী হওয়ার প্রত্যাশা করি। বেশিরভাগ ভাষায় এটি সমালোচনামূলক যে আমরা সংকলনের সময় জানতে পারি যদি আমরা এটি স্ট্যাকের মধ্যে সঞ্চয় করতে চাই তবে কত বড় পরিবর্তনশীল is

অবজেক্টস (যা আমরা তাদের আপডেট করার সাথে সাথে আকারে পৃথক হয়) গাদা হয়ে যায় কারণ আমরা জানি না তারা তৈরির সময় কতক্ষণ স্থায়ী হয়। অনেক ভাষায় গাদা আবর্জনা সংগ্রহ করা হয় অবজেক্টগুলি (যেমন ক্লাস 1 অবজেক্ট) সন্ধান করার জন্য যার আর কোনও উল্লেখ নেই।

জাভাতে, বেশিরভাগ বস্তু সরাসরি গাদা হয়ে যায়। সি / সি ++ এর মতো ভাষায়, যখন আপনি পয়েন্টারগুলির সাথে কাজ করছেন না তখন স্ট্রাক্ট এবং ক্লাসগুলি প্রায়শই স্ট্যাকের উপরে থাকতে পারে।

আরো তথ্য পাওয়া যাবে এখানে:

স্ট্যাক এবং হিপ মেমরি বরাদ্দের মধ্যে পার্থক্য «টিমমুরফি.অর্গ

এবং এখানে:

স্ট্যাক এবং হিপগুলিতে অবজেক্ট তৈরি করা

এই নিবন্ধটি উপরের ছবির উত্স: ছয়টি গুরুত্বপূর্ণ। নেট ধারণা: স্ট্যাক, গাদা, মানের ধরণ, রেফারেন্সের ধরণ, বক্সিং এবং আনবক্সিং - কোডপ্রজেক্ট

তবে সচেতন থাকুন এতে কিছু ভুলত্রুটি থাকতে পারে।


15
এটি ভুল। i এবং cls "স্থিতিশীল" ভেরিয়েবল নয়। তাদের "স্থানীয়" বা "স্বয়ংক্রিয়" ভেরিয়েবল বলা হয়। এটি একটি খুব গুরুত্বপূর্ণ পার্থক্য। [লিংক] দেখুন stackoverflow.com/a/13326916/1763801 শোধন জন্য
davec

9
আমি স্থির ছিলাম না পরিবর্তনশীল ছিল । আমি বলেছিলাম যে int এবং cls1 স্ট্যাটিক আইটেম । তাদের স্মৃতি স্থিতিশীলভাবে বরাদ্দ করা হয়েছে এবং সেইজন্য তারা স্ট্যাকের উপরে চলে যায়। এটি এমন কোনও সামগ্রীর বিপরীতে যা গতিশীল মেমরি বরাদ্দ প্রয়োজন যা অতএব onগলে যায়।
স্নো ক্র্যাশ

12
আমি "স্ট্যাটিক আইটেম ... স্ট্যাকে যান" উদ্ধৃত করছি। এটি ঠিক ফ্ল্যাট আউট ভুল। স্ট্যাটিক আইটেমগুলি ডেটা বিভাগে যায়, স্বয়ংক্রিয় আইটেমগুলি স্ট্যাকের দিকে যায়।
ডেভেক

14
এছাড়াও যে কোডড্রজেক্ট নিবন্ধ লিখেছেন তিনি জানেন না তিনি কী বিষয়ে কথা বলছেন। উদাহরণস্বরূপ, তিনি বলেছেন যে "আদিমদের স্ট্যাটিক টাইপ মেমরি দরকার" যা সম্পূর্ণ অসত্য। গতির গতিবেগের মধ্যে আদিমগুলি বরাদ্দ করা থেকে কোনও কিছুই আপনাকে থামায় না, কেবল "এনট অ্যারে [] = নতুন ইনট [নাম]" এবং ভোইলা জাতীয় কিছু লিখুন, নেটগুলিতে গতিশীলভাবে বরাদ্দকৃত আদিমগুলি। এটি বেশ কয়েকটি ভুলত্রুটিগুলির মধ্যে একটি।
ডেভেক

8
আমি আপনার পোস্টটি সম্পাদনা করেছি কারণ আপনি স্ট্যাক এবং হিপ কী করে সে সম্পর্কে গুরুতর প্রযুক্তিগত ভুল করেছেন।
টম লেস

209

স্ট্যাক আপনি যখন কোনও ফাংশনটি কল করেন তখন সেই ফাংশনটির সাথে যুক্তিগুলি যুক্ত করে অন্য কোনও ওভারহেড স্ট্যাকের উপরে রাখা হয়। কিছু তথ্য (যেমন ফিরতে যেতে হবে) এছাড়াও সেখানে সংরক্ষণ করা হয়। আপনি যখন আপনার ফাংশনের অভ্যন্তরে কোনও ভেরিয়েবল ঘোষণা করেন, সেই পরিবর্তনশীলটিও স্ট্যাকের জন্য বরাদ্দ করা হয়।

স্ট্যাকটি ডিলোকেটিং করা বেশ সহজ কারণ আপনি সর্বদা বিপরীত ক্রমে যেটি বরাদ্দ করেন তা হ্রাস করুন। ফাংশন প্রবেশ করার সাথে সাথে স্ট্যাক স্টাফ যুক্ত করা হবে, প্রস্থান করার সাথে সাথে সম্পর্কিত ডেটা সরিয়ে ফেলা হবে। এর অর্থ হ'ল আপনি স্ট্যাকের একটি ছোট অঞ্চলের মধ্যেই রয়েছেন না যদি না আপনি প্রচুর ফাংশন কল করেন যা প্রচুর অন্যান্য ফাংশন কল করে (বা পুনরাবৃত্ত সমাধান তৈরি করে)।

দ্য হিপ হিপ এমন একটি জেনেরিক নাম যেখানে আপনি ফ্লাইতে তৈরি করা ডেটা রাখেন। আপনার প্রোগ্রামটি কতটি স্পেসশিপ তৈরি করতে চলেছে তা যদি আপনি না জানেন তবে আপনি প্রতিটি স্পেসশিপ তৈরি করতে নতুন (বা ম্যালোক বা সমতুল্য) অপারেটরটি ব্যবহার করতে পারবেন। এই বরাদ্দটি কিছু সময়ের জন্য স্থায়ী হতে চলেছে, সুতরাং সম্ভবত আমরা জিনিসগুলি তৈরি করার চেয়ে আলাদাভাবে সাজিয়ে দেব।

সুতরাং, গাদাটি আরও জটিল, কারণ এখানে মেমরির অঞ্চল রয়েছে যা অব্যবহৃত অংশগুলির সাথে অবিচ্ছিন্ন থাকে - স্মৃতিটি খণ্ডিত হয়ে যায়। আপনার প্রয়োজনীয় আকারের নিখরচায় স্মৃতি খুঁজে পাওয়া একটি কঠিন সমস্যা problem এজন্য গাদাটি এড়ানো উচিত (যদিও এটি এখনও প্রায়শই ব্যবহৃত হয়)।

বাস্তবায়ন স্ট্যাক এবং হিপ উভয়েরই প্রয়োগটি সাধারণত রানটাইম / ওএসের নিচে থাকে। প্রায়শই গেমস এবং অন্যান্য অ্যাপ্লিকেশনগুলি যা পারফরম্যান্স সমালোচনামূলক তাদের নিজস্ব মেমরি সমাধান তৈরি করে যা মেমরির ওএসের উপর নির্ভর না করার জন্য এটিকে অভ্যন্তরীণভাবে সজ্জিত করে।

এটি কেবলমাত্র তখন ব্যবহারিক যদি আপনার মেমরির ব্যবহার আদর্শের থেকে একেবারে আলাদা হয় - যেমন গেমগুলির জন্য যেখানে আপনি একটি বিশাল ক্রিয়ায় একটি স্তর লোড করেন এবং অন্য বিশাল ক্রিয়াকলাপে পুরোটা অনেকটা ছুঁড়ে ফেলতে পারেন।

স্মৃতিতে শারীরিক অবস্থান এটি ভার্চুয়াল মেমরি নামে পরিচিত এমন প্রযুক্তির কারণে আপনি যা ভাবেন তার চেয়ে কম প্রাসঙ্গিক যা আপনার প্রোগ্রামটিকে ভাবায় যে শারীরিক ডেটা অন্য কোথাও (এমনকি হার্ডডিস্কেও রয়েছে) এমন কোনও ঠিকানায় আপনার অ্যাক্সেস রয়েছে। আপনার কল গাছটি আরও গভীর হওয়ার সাথে সাথে আপনি স্ট্যাকের জন্য যে ঠিকানাগুলি পেয়েছেন সেগুলি ক্রমবর্ধমান ক্রমে রয়েছে। গাদা জন্য ঠিকানাগুলি প্রাক-অনুমানযোগ্য (যেমন ইমপ্লিমেন্টেশন নির্দিষ্ট) এবং খোলামেলাভাবে গুরুত্বপূর্ণ নয়।


16
গাদা ব্যবহার এড়াতে একটি প্রস্তাবনা বেশ শক্তিশালী। আধুনিক সিস্টেমে ভাল হিপ ম্যানেজার রয়েছে এবং আধুনিক গতিশীল ভাষাগুলি প্রচুর পরিমাণে হিপটি ব্যবহার করে (প্রোগ্রামারটি সত্যই এটি নিয়ে উদ্বিগ্ন না হয়ে)। আমি বলছিলাম যে গাদাটি ব্যবহার করুন, তবে একটি ম্যানুয়াল বরাদ্দকারীকে সাথে মুক্ত করতে ভুলবেন না!
গ্রেগ হিউগিল

2
আপনি যদি স্ট্যাক বা হিপ ব্যবহার করতে পারেন তবে স্ট্যাকটি ব্যবহার করুন। আপনি যদি স্ট্যাকটি ব্যবহার করতে না পারেন তবে সত্যিই কোনও বিকল্প নেই। আমি উভয়ই প্রচুর ব্যবহার করি, এবং অবশ্যই std :: ভেক্টর ব্যবহার করে বা অনুরূপ হিপকে আঘাত করে। নবজাতকের জন্য, আপনি গাদাটি এড়ান কারণ স্ট্যাকটি এত সহজ!
টম লেস

যদি আপনার ভাষা আবর্জনা সংগ্রহ বাস্তবায়িত না করে, স্মার্ট পয়েন্টার (মেমরির গতিযুক্ত বরাদ্দ অংশগুলির জন্য রেফারেন্স গণনা করে এমন একটি পয়েন্টারের চারপাশে মোড়ানো পৃথকভাবে বরাদ্দকৃত অবজেক্টগুলি) আবর্জনা সংগ্রহের সাথে ঘনিষ্ঠভাবে সম্পর্কিত এবং এটি নিরাপদে গাদা পরিচালনার একটি শালীন উপায় are এবং বিনামূল্যে ফাঁস। এগুলি বিভিন্ন ফ্রেমওয়ার্কে প্রয়োগ করা হয়, তবে আপনার নিজস্ব প্রোগ্রামগুলির জন্য এটি কার্যকর করাও কঠিন নয়।
বেনপেন

1
"এজন্য গাদাটি এড়ানো উচিত (যদিও এটি এখনও প্রায়শই ব্যবহৃত হয়)" আমি এর ব্যবহারিকভাবে এর অর্থ কী তা নিশ্চিত নই, বিশেষত অনেকগুলি উচ্চ স্তরের ভাষায় স্মৃতি আলাদাভাবে পরিচালিত হয়। যেহেতু এই প্রশ্নটি ভাষা-অজ্ঞাতনামা হিসাবে ট্যাগ করা হয়েছে, তাই আমি বলতে চাই যে এই বিশেষ মন্তব্য / লাইনটি খারাপ অবস্থানে রয়েছে এবং প্রযোজ্য নয়।
LintfordPickle

2
ভাল পয়েন্ট @ জন্নাহ্যাম্পসন - আপনি একটি বৈধ পয়েন্ট দেওয়ার সময়, আমি যুক্তি দিয়ে বলছি যে আপনি যদি কোন জিসির সাথে "উচ্চ স্তরের ভাষায়" কাজ করে থাকেন তবে আপনি সম্ভবত মেমরি বরাদ্দকরণের প্রক্রিয়াটি মোটেই পছন্দ করেন না - এবং তাই না এমনকি স্ট্যাক এবং গাদা কী তা যত্নশীল।
টম লেস

194

স্পষ্ট করার জন্য, এই উত্তরে ভুল তথ্য রয়েছে ( থোমাস মন্তব্যগুলির পরে তার উত্তর স্থির করেছেন, দুর্দান্ত :))। অন্যান্য উত্তরগুলি স্থির বরাদ্দের অর্থ কী তা ব্যাখ্যা করা এড়ানো যায়। সুতরাং আমি বরাদ্দের তিনটি মূল ফর্ম এবং সেগুলি কীভাবে সাধারণত নীচে নীচে স্তূপ, স্ট্যাক এবং ডেটা বিভাগের সাথে সম্পর্কিত তা ব্যাখ্যা করব। লোকেরা বুঝতে সাহায্য করতে আমি সি / সি ++ এবং পাইথন উভয় ক্ষেত্রেও কয়েকটি উদাহরণ দেখাব।

"স্ট্যাটিক" (একে একে স্ট্যাটিকালি বরাদ্দ) ভেরিয়েবলগুলি স্ট্যাকের জন্য বরাদ্দ করা হয় না। এমনটা ধরে নিবেন না - "স্ট্যাটিক" অনেকটা "স্ট্যাক" এর মতো বলে মনে হয় বলে অনেকেই করেন। এগুলি আসলে স্ট্যাক বা স্তূপের মধ্যেই নেই। এইগুলি হ'ল ডেটা বিভাগ যা বলা হয় তারই অংশ

তবে সাধারণত " সুযোগ " এবং " জীবনকাল বিবেচনা করা ভাল। " "স্ট্যাক" এবং "গাদা" না দিয়ে " ।

স্কোপ কোডের কোন অংশগুলিতে কোনও চলক অ্যাক্সেস করতে পারে তা বোঝায়। সাধারণত আমরা স্থানীয় সুযোগ সম্পর্কে চিন্তা করি (কেবলমাত্র বর্তমান ফাংশন দ্বারা অ্যাক্সেস করা যেতে পারে) বনাম বৈশ্বিক সুযোগ (কোথাও অ্যাক্সেস করা যেতে পারে) যদিও সুযোগ আরও জটিল হতে পারে।

লাইফটাইম বলতে বোঝায় যখন প্রোগ্রামের প্রয়োগের সময় কোনও ভেরিয়েবল বরাদ্দ করা হয় এবং deallocated হয়। সাধারণত আমরা স্থির বরাদ্দের কথা ভাবি (পরিবর্তনশীল প্রোগ্রামের পুরো সময়কাল ধরে চলতে থাকবে, একাধিক ফাংশন কলগুলিতে একই তথ্য সংরক্ষণের জন্য দরকারী করে তোলে) বনাম স্বয়ংক্রিয় বরাদ্দ (ভেরিয়েবল কেবল কোনও ফাংশনে একক কল চলাকালীন স্থায়ী থাকে, এটি কার্যকর করে তোলে গতিশীল বরাদ্দ বনাম (পরিবর্তনশীল যার স্থায়িত্ব স্থির বা স্বয়ংক্রিয় যেমন সংকলন সময় পরিবর্তে রানটাইম সময়ে সংজ্ঞায়িত করা হয়) বনাম গতিশীল বরাদ্দ বনাম তথ্য শুধুমাত্র আপনার ফাংশন চলাকালীন ব্যবহৃত হয় এবং সংরক্ষণ করা যেতে পারে ।

যদিও বেশিরভাগ সংকলক এবং দোভাষী এই স্ট্যাকস, হিপস ইত্যাদির ব্যবহারের ক্ষেত্রে একইভাবে এই আচরণটি প্রয়োগ করেন, কোনও সংকলক মাঝে মাঝে এই কনভেনশনগুলিকে ভেঙে ফেলতে পারে যদি এটি আচরণটি সঠিক হওয়া পর্যন্ত চায়। উদাহরণস্বরূপ, অপ্টিমাইজেশনের কারণে স্থানীয় ভেরিয়েবল কেবলমাত্র একটি রেজিস্টারে উপস্থিত থাকতে পারে বা সম্পূর্ণ অপসারণ করা যায়, যদিও বেশিরভাগ স্থানীয় ভেরিয়েবলগুলি স্ট্যাকের মধ্যে উপস্থিত থাকে। যেমন কয়েকটি মন্তব্যে ইঙ্গিত করা হয়েছে, আপনি এমন একটি সংকলক প্রয়োগ করতে পারেন যা এমনকি স্ট্যাক বা একটি গাদা ব্যবহার করে না, তবে এর পরিবর্তে কিছু অন্যান্য স্টোরেজ মেকানিজম (খুব কমই সম্পন্ন হয়, যেহেতু স্ট্যাকস এবং গাদা এটির জন্য দুর্দান্ত)।

আমি এই সমস্ত চিত্রিত করার জন্য কিছু সাধারণ বর্ণিত সি কোড সরবরাহ করব। সবচেয়ে ভাল উপায় হ'ল ডিবাগারের অধীনে একটি প্রোগ্রাম চালানো এবং আচরণটি পর্যবেক্ষণ করা। আপনি যদি অজগরটি পড়তে পছন্দ করেন তবে উত্তরটির শেষে চলে যান :)

// Statically allocated in the data segment when the program/DLL is first loaded
// Deallocated when the program/DLL exits
// scope - can be accessed from anywhere in the code
int someGlobalVariable;

// Statically allocated in the data segment when the program is first loaded
// Deallocated when the program/DLL exits
// scope - can be accessed from anywhere in this particular code file
static int someStaticVariable;

// "someArgument" is allocated on the stack each time MyFunction is called
// "someArgument" is deallocated when MyFunction returns
// scope - can be accessed only within MyFunction()
void MyFunction(int someArgument) {

    // Statically allocated in the data segment when the program is first loaded
    // Deallocated when the program/DLL exits
    // scope - can be accessed only within MyFunction()
    static int someLocalStaticVariable;

    // Allocated on the stack each time MyFunction is called
    // Deallocated when MyFunction returns
    // scope - can be accessed only within MyFunction()
    int someLocalVariable;

    // A *pointer* is allocated on the stack each time MyFunction is called
    // This pointer is deallocated when MyFunction returns
    // scope - the pointer can be accessed only within MyFunction()
    int* someDynamicVariable;

    // This line causes space for an integer to be allocated in the heap
    // when this line is executed. Note this is not at the beginning of
    // the call to MyFunction(), like the automatic variables
    // scope - only code within MyFunction() can access this space
    // *through this particular variable*.
    // However, if you pass the address somewhere else, that code
    // can access it too
    someDynamicVariable = new int;


    // This line deallocates the space for the integer in the heap.
    // If we did not write it, the memory would be "leaked".
    // Note a fundamental difference between the stack and heap
    // the heap must be managed. The stack is managed for us.
    delete someDynamicVariable;

    // In other cases, instead of deallocating this heap space you
    // might store the address somewhere more permanent to use later.
    // Some languages even take care of deallocation for you... but
    // always it needs to be taken care of at runtime by some mechanism.

    // When the function returns, someArgument, someLocalVariable
    // and the pointer someDynamicVariable are deallocated.
    // The space pointed to by someDynamicVariable was already
    // deallocated prior to returning.
    return;
}

// Note that someGlobalVariable, someStaticVariable and
// someLocalStaticVariable continue to exist, and are not
// deallocated until the program exits.

আজীবন এবং সুযোগের মধ্যে পার্থক্য করা কেন গুরুত্বপূর্ণ এটির একটি বিশেষ উদাহরণটি হ'ল কোনও ভেরিয়েবলের স্থানীয় সুযোগ থাকলেও স্থির জীবনকাল থাকতে পারে - উদাহরণস্বরূপ, উপরের কোডের নমুনায় "কিছু লোকালস্ট্যাটিক পরিবর্তনশীল"। এ জাতীয় পরিবর্তনশীলগুলি আমাদের সাধারণ তবে অনানুষ্ঠানিক নামকরণ অভ্যাসকে খুব বিভ্রান্ত করতে পারে। উদাহরণস্বরূপ যখন আমরা " স্থানীয় " বলি তখন আমরা সাধারণত " স্থানীয়ভাবে স্কোপড স্বয়ংক্রিয়ভাবে বরাদ্দক ভেরিয়েবল " এবং যখন আমরা বিশ্বব্যাপী বলে থাকি তখন আমরা সাধারণত "গ্লোবাল স্কোপড স্ট্যাটিক্যালি বরাদ্দ ভেরিয়েবল " অর্থ করি। দুর্ভাগ্যক্রমে যখন " ফাইল স্কোপড স্ট্যাটিকালি বরাদ্দ করা ভেরিয়েবল " এর মতো জিনিস আসে তখন অনেকেই কেবল ... " হু ??? " বলে থাকেন।

সি / সি +++ এর কিছু বাক্য গঠন পছন্দ এই সমস্যাটিকে আরও বাড়িয়ে তোলে - উদাহরণস্বরূপ অনেকের ধারণা নীচে দেখানো সিনট্যাক্সের কারণে বৈশ্বিক পরিবর্তনগুলি "স্থিতিশীল" নয়।

int var1; // Has global scope and static allocation
static int var2; // Has file scope and static allocation

int main() {return 0;}

নোট করুন যে উপরের ঘোষণায় "স্থিতিশীল" কীওয়ার্ডটি রাখার ফলে ভার 2 কে বৈশ্বিক সুযোগ থাকা থেকে বাধা দেয়। তবুও, বৈশ্বিক ভার 1 এর স্থির বরাদ্দ রয়েছে। এটা স্বজ্ঞাত নয়! এই কারণে, সুযোগটি বর্ণনা করার সময় আমি কখনই "স্থির" শব্দটি ব্যবহার করার চেষ্টা করি না এবং এর পরিবর্তে "ফাইল" বা "ফাইল সীমাবদ্ধ" সুযোগের মতো কিছু বলি। তবে অনেকগুলি একটি পরিবর্তনশীল বর্ণনা করতে "স্ট্যাটিক" বা "স্ট্যাটিক স্কোপ" শব্দটি ব্যবহার করে যা কেবল একটি কোড ফাইল থেকে অ্যাক্সেস করা যায়। আজীবন প্রসঙ্গে, "স্ট্যাটিক" এর অর্থ সর্বদা চলকটি প্রোগ্রামের শুরুতে বরাদ্দ করা হয় এবং প্রোগ্রামটি প্রস্থান করার সময় deallocated হয়।

কিছু লোক এই ধারণাগুলিকে সি / সি ++ নির্দিষ্ট হিসাবে ভাবেন। তারা না. উদাহরণস্বরূপ, নীচে পাইথন নমুনাটি তিনটি ধরণের বরাদ্দকে চিত্রিত করে (ব্যাখ্যা করা ভাষায় কিছু সূক্ষ্ম পার্থক্য রয়েছে যা আমি এখানে পাব না)।

from datetime import datetime

class Animal:
    _FavoriteFood = 'Undefined' # _FavoriteFood is statically allocated

    def PetAnimal(self):
        curTime = datetime.time(datetime.now()) # curTime is automatically allocatedion
        print("Thank you for petting me. But it's " + str(curTime) + ", you should feed me. My favorite food is " + self._FavoriteFood)

class Cat(Animal):
    _FavoriteFood = 'tuna' # Note since we override, Cat class has its own statically allocated _FavoriteFood variable, different from Animal's

class Dog(Animal):
    _FavoriteFood = 'steak' # Likewise, the Dog class gets its own static variable. Important to note - this one static variable is shared among all instances of Dog, hence it is not dynamic!


if __name__ == "__main__":
    whiskers = Cat() # Dynamically allocated
    fido = Dog() # Dynamically allocated
    rinTinTin = Dog() # Dynamically allocated

    whiskers.PetAnimal()
    fido.PetAnimal()
    rinTinTin.PetAnimal()

    Dog._FavoriteFood = 'milkbones'
    whiskers.PetAnimal()
    fido.PetAnimal()
    rinTinTin.PetAnimal()

# Output is:
# Thank you for petting me. But it's 13:05:02.255000, you should feed me. My favorite food is tuna
# Thank you for petting me. But it's 13:05:02.255000, you should feed me. My favorite food is steak
# Thank you for petting me. But it's 13:05:02.255000, you should feed me. My favorite food is steak
# Thank you for petting me. But it's 13:05:02.255000, you should feed me. My favorite food is tuna
# Thank you for petting me. But it's 13:05:02.255000, you should feed me. My favorite food is milkbones
# Thank you for petting me. But it's 13:05:02.256000, you should feed me. My favorite food is milkbones

আমি কোনও স্থানীয় অ্যাক্সেসিবিলিটি হিসাবে একটি ফাংশনটির মধ্যে ঘোষিত একটি স্ট্যাটিক ভেরিয়েবল উল্লেখ করব , তবে সাধারণত এটির সাথে "স্কোপ" শব্দটি ব্যবহার করবে না। এছাড়াও, এটি লক্ষণীয়ও হতে পারে যে একটি স্ট্যাক / গাদা দিক যার সাথে ভাষার মূলত শূন্য নমনীয়তা রয়েছে: একটি ভাষা যা একটি স্ট্যাকের উপর কার্যকরকরণের প্রেক্ষাপটকে সংরক্ষণ করে সেই জিনিসগুলি ধরে রাখতে সেই একই স্ট্যাকটি ব্যবহার করতে পারে না যেখানে সেগুলি তৈরি করা হয়েছে সেই প্রেক্ষাপটে প্রকাশের প্রয়োজন হবে need । কিছু ভাষার মতো PostScriptএকাধিক স্ট্যাক থাকে তবে একটি "গাদা" থাকে যা স্ট্যাকের মতো আচরণ করে।
সুপারক্যাট

পছন্দ করুন আমি
স্কোপটিকে

আমি একটি ভেরিয়েবলের "স্কোপ "টিকে সময় এবং স্থানের সাথে আবদ্ধ হিসাবে বিবেচনা করব। শ্রেণি-অবজেক্ট স্কোপটিতে একটি ভেরিয়েবলের অবধি যতক্ষণ অবজেক্ট বিদ্যমান তার মান ধরে রাখতে হয়। এক্সিকিউশন-কনটেক্সট স্কোপের মধ্যে একটি ভেরিয়েবলের যতক্ষণ কার্যকর হওয়া যায় না তার মান ধরে রাখা আবশ্যক। একটি স্থিতিশীল ভেরিয়েবল ঘোষণা একটি শনাক্তকারী তৈরি করে যার স্কোপটি বর্তমান ব্লকের সাথে আবদ্ধ, যা একটি ভেরিয়েবলের সাথে সংযুক্ত থাকে যার সুযোগটি সীমাহীন।
সুপারক্যাট

@ সুপের্যাট এই কারণেই আমি আজীবন শব্দটি ব্যবহার করি, এটিই আপনি কীভাবে সময়কে কল্পনা করে থাকেন term এটি এতগুলি অর্থ সহ "স্কোপ" শব্দটি ওভারলোডের প্রয়োজনীয়তা হ্রাস করে। আমি যতদূর বলতে পারি, এমনকি সংজ্ঞা সম্পর্কিত উত্সগুলির মধ্যে সঠিক সংজ্ঞাগুলির বিষয়ে একমত হতে পারে বলে মনে হয় না। আমার পরিভাষা আংশিকভাবে কেএন্ডআর থেকে আঁকা এবং আংশিকভাবে আমি ব্যবহৃত প্রথম সিএস বিভাগে প্রচলিত ব্যবহার থেকে পড়া / শিখিয়েছি। অন্য অবহিত মতামত শুনতে সর্বদা ভাল।
ডেভেক

1
আপনি নিশ্চই ছেলেমানুষী করছেন. আপনি কি সত্যিই কোনও ফাংশনের অভ্যন্তরে স্থির পরিবর্তনশীল সংজ্ঞা দিতে পারেন?
জহিম সাত্তার

168

অন্যরা প্রশস্ত স্ট্রোকগুলির উত্তমরূপে উত্তর দিয়েছেন, তাই আমি কয়েকটি বিবরণ দিয়ে দেব।

  1. স্ট্যাক এবং গাদা একবিন্দু হওয়ার দরকার নেই। একটি সাধারণ পরিস্থিতি যেখানে আপনার একাধিক স্ট্যাক রয়েছে কোনও প্রক্রিয়াতে যদি আপনার একাধিক থ্রেড থাকে। এই ক্ষেত্রে প্রতিটি থ্রেডের নিজস্ব স্ট্যাক রয়েছে has আপনার একাধিক হিপ থাকতে পারে, উদাহরণস্বরূপ কিছু ডিএলএল কনফিগারেশনের ফলে বিভিন্ন ডিএলএল বিভিন্ন হ্যাপ থেকে বরাদ্দ হতে পারে, যার কারণেই এটি একটি ভিন্ন গ্রন্থাগারের দ্বারা বরাদ্দ হওয়া মেমরির প্রকাশ করা একটি খারাপ ধারণা।

  2. সিতে আপনি বরাদ্দ ব্যবহারের মাধ্যমে পরিবর্তনশীল দৈর্ঘ্যের বরাদ্দের সুবিধা পেতে পারেন , যা স্ট্যাকের উপর বরাদ্দ, বরাদ্দের বিপরীতে , যা গাদাতে বরাদ্দ করে। এই স্মৃতিটি আপনার রিটার্নের বিবৃতিটি টিকে থাকবে না, তবে এটি স্ক্র্যাচ বাফার জন্য দরকারী।

  3. উইন্ডোজে একটি বিশাল অস্থায়ী বাফার তৈরি করা যা আপনি খুব বেশি ব্যবহার করেন না এটি নিখরচায় নয়। এর কারণ হ'ল সংকলকটি স্ট্যাকের অনুসন্ধানের লুপ তৈরি করবে যা আপনার ফাংশনটি প্রবেশ করার সময় ডাকা হয় প্রতিটি বার স্ট্যাকের উপস্থিতি নিশ্চিত করার জন্য (কারণ উইন্ডোটি যখন আপনার স্ট্যাকটি বাড়ানোর প্রয়োজন হয় তখন এটি সনাক্ত করতে আপনার স্ট্যাকের শেষে একটি গার্ড পৃষ্ঠা ব্যবহার করে। যদি আপনি স্ট্যাকের শেষে এক পৃষ্ঠারও বেশি মেমোরি অ্যাক্সেস করেন তবে আপনি ক্র্যাশ হয়ে যাবেন)। উদাহরণ:

void myfunction()
{
   char big[10000000];
   // Do something that only uses for first 1K of big 99% of the time.
}

পুনরায় "বরাদ্দের বিরোধিতা": আপনার অর্থ "মলোকের বিপরীতে"?
পিটার মর্টেনসেন

বহনযোগ্য কীভাবে alloca?
পিটার মর্টেনসেন

@ পিটারমোরটেনসেন এটি পসিক্স নয়, বহনযোগ্যতার গ্যারান্টিযুক্ত নয়।
ডন নিউফেল্ড

135

অন্যরা সরাসরি আপনার প্রশ্নের উত্তর দিয়েছে, কিন্তু স্ট্যাক এবং হিপগুলি বোঝার চেষ্টা করার সময়, আমি মনে করি একটি traditionalতিহ্যবাহী ইউনিক্স প্রক্রিয়া (থ্রেড এবং mmap()ভিত্তিক বরাদ্দ ছাড়াই ) মেমরির বিন্যাসটি বিবেচনা করা সহায়ক । মেমরি ম্যানেজমেন্ট শব্দকোষ ওয়েবপৃষ্ঠাটি এই মেমরি লেআউট একটি ডায়াগ্রাম হয়েছে।

স্ট্যাক এবং হিপগুলি traditionতিহ্যগতভাবে প্রক্রিয়াটির ভার্চুয়াল ঠিকানা জায়গার বিপরীত প্রান্তে অবস্থিত। প্রবেশ করার পরে স্ট্যাকটি স্বয়ংক্রিয়ভাবে বৃদ্ধি পায়, কার্নেলের দ্বারা নির্ধারিত আকার পর্যন্ত (যার সাথে সামঞ্জস্য করা যায় setrlimit(RLIMIT_STACK, ...))। প্রক্রিয়াটির ভার্চুয়াল অ্যাড্রেস স্পেসে মেমরির বরাদ্দকারী brk()বা sbrk()সিস্টেম কলের অনুরোধ জানায় , শারীরিক মেমরির আরও পৃষ্ঠাগুলি ম্যাপ করে The

ভার্চুয়াল মেমরিবিহীন সিস্টেমে, যেমন কিছু এম্বেড থাকা সিস্টেমগুলিতে, স্ট্যাক এবং হিপ আকারে স্থির না করা ছাড়া প্রায়শই একই বেসিক লেআউটটি প্রয়োগ হয়। তবে অন্যান্য এম্বেড থাকা সিস্টেমে (যেমন মাইক্রোচিপ পিআইসি মাইক্রোকন্ট্রোলারগুলির উপর ভিত্তি করে), প্রোগ্রাম স্ট্যাক মেমরির একটি পৃথক ব্লক যা ডেটা মুভমেন্ট নির্দেশাবলী দ্বারা চিহ্নিত করা যায় না, এবং কেবল প্রোগ্রাম প্রবাহের নির্দেশের মাধ্যমে সংশোধন বা অপ্রত্যক্ষভাবে পড়া যায় (কল, রিটার্ন, ইত্যাদি)। অন্যান্য আর্কিটেকচার, যেমন ইন্টেল ইটানিয়াম প্রসেসরগুলিতে একাধিক স্ট্যাক রয়েছে । এই অর্থে, স্ট্যাকটি সিপিইউ আর্কিটেকচারের একটি উপাদান।


117

স্ট্যাক কি?

স্ট্যাক হ'ল অবজেক্টের একটি গাদা, সাধারণত একটি যা খুব সুন্দরভাবে সাজানো থাকে।

এখানে চিত্র বিবরণ লিখুন

কম্পিউটিং আর্কিটেকচারের স্ট্যাকগুলি মেমরির এমন অঞ্চল যেখানে ডেটা যুক্ত করা হয় বা শেষ-প্রথম-আউট পদ্ধতিতে সরানো হয়।
বহু-থ্রেডযুক্ত অ্যাপ্লিকেশনটিতে প্রতিটি থ্রেডের নিজস্ব স্ট্যাক থাকবে।

গাদা কী?

একটি স্তূপ হ'ল অলসভাবে পাইল করা জিনিসগুলির একটি অপ্রয়োজনীয় সংগ্রহ।

এখানে চিত্র বিবরণ লিখুন

কম্পিউটিং আর্কিটেকচারে হিপটি গতিশীল বরাদ্দ মেমরির একটি অঞ্চল যা অপারেটিং সিস্টেম বা মেমরি ম্যানেজার লাইব্রেরি দ্বারা স্বয়ংক্রিয়ভাবে পরিচালিত হয়।
হিপগুলিতে মেমরি বরাদ্দ করা হয়, deallocated হয় এবং প্রোগ্রাম সঞ্চালনের সময় নিয়মিত পুনরায় আকার দেওয়া হয় এবং এটি ফ্র্যাগমেন্টেশন নামে একটি সমস্যা তৈরি করতে পারে।
ফ্র্যাগমেন্টেশন ঘটে যখন অতিরিক্ত মেমোরি অবজেক্টগুলি ধরে রাখতে মেমরি অবজেক্টগুলি খুব ছোট হয় তার মধ্যে ছোট স্পেস সহ বরাদ্দ করা হয়।
নেট রেজাল্ট হিপ স্পেসের এক শতাংশ যা পরবর্তী মেমরির বরাদ্দের জন্য ব্যবহারযোগ্য নয়।

উভয় একসঙ্গে

বহু-থ্রেডযুক্ত অ্যাপ্লিকেশনটিতে প্রতিটি থ্রেডের নিজস্ব স্ট্যাক থাকবে। তবে, সমস্ত বিভিন্ন থ্রেড গাদা ভাগ করে নেবে।
যেহেতু বিভিন্ন থ্রেডগুলি একাধিক-থ্রেড অ্যাপ্লিকেশনটিতে হিপ ভাগ করে দেয়, এর অর্থ এইও হয় যে থ্রেডগুলির মধ্যে কিছুটা সমন্বয় থাকতে হবে যাতে তারা হিপটিতে একই মেমরির টুকরা (গুলি) অ্যাক্সেস করতে এবং পরিচালনা করতে চেষ্টা না করে at একই সময়.

কোনটি দ্রুত - স্ট্যাক বা গাদা? এবং কেন?

স্ট্যাকটি গাদার থেকে অনেক দ্রুত।
স্ট্যাকের উপর মেমরি বরাদ্দ করার কারণে এটি।
স্ট্যাকের মেমরি বরাদ্দ করা স্ট্যাকের পয়েন্টারটিকে উপরে সরিয়ে দেওয়ার মতোই সহজ।

প্রোগ্রামিংয়ে নতুন লোকের জন্য, স্ট্যাকটি সহজ হওয়ায় এটি ব্যবহার করা সম্ভবত একটি ভাল ধারণা।
স্ট্যাকটি ছোট হওয়ায় আপনি যখন আপনার ডেটাটির জন্য আপনার কতটা মেমরির প্রয়োজন তা সঠিকভাবে জানেন বা আপনি যদি জানেন তবে আপনার ডেটার আকার খুব ছোট is
যখন আপনি জানেন যে আপনার ডেটার জন্য আপনার প্রচুর মেমরির প্রয়োজন হবে বা আপনি কতটা মেমরির প্রয়োজন হবে তা আপনি নিশ্চিত নন (যেমন ডায়নামিক অ্যারের মতো) আপনি হিপটি ব্যবহার করা ভাল।

জাভা মেমোরি মডেল

এখানে চিত্র বিবরণ লিখুন

স্ট্যাক হ'ল মেমরির ক্ষেত্র যেখানে স্থানীয় ভেরিয়েবল (পদ্ধতি পরামিতি সহ) সঞ্চিত থাকে। বস্তুর ভেরিয়েবলের ক্ষেত্রে এটি হ'ল স্তূপের আসল বস্তুর নিছক উল্লেখ (পয়েন্টার)।
প্রতিবার যখন কোনও বস্তু তাত্ক্ষণিকভাবে ব্যবহৃত হয়, তখন সেই বস্তুর ডেটা (অবস্থা) ধরে রাখতে হিপ মেমরির একটি অংশ আলাদা করা হয়। যেহেতু অবজেক্টগুলি অন্যান্য অবজেক্টগুলিকে ধারণ করতে পারে, তাই এই ডেটাগুলির কয়েকটি বাস্তবে সেই নেস্টেড অবজেক্টগুলির রেফারেন্স রাখতে পারে।


115

স্ট্যাক হ'ল মেমোরির একটি অংশ যা বেশ কয়েকটি কী সমাবেশে ভাষার নির্দেশাবলী যেমন 'পপ' (স্ট্যাক থেকে কোনও মান সরিয়ে ফেলা) এবং 'পুশ' (স্ট্যাকের কোনও মান টিপুন) এর মাধ্যমে ব্যবহার করা যেতে পারে, তবে কল ( একটি সাব্রুটিন কল করুন - এটি স্ট্যাকটিতে ফিরে আসার জন্য ঠিকানাটিকে চাপ দেয়) এবং ফিরে (সাব্রোটিন থেকে ফিরে - এটি স্ট্যাকের ঠিকানাটি পপ করে এবং এতে লাফ দেয়)। এটি স্ট্যাক পয়েন্টার রেজিস্ট্রারের নীচে মেমরির অঞ্চল, যা প্রয়োজন অনুযায়ী সেট করা যেতে পারে। স্ট্রাকটি সাবরুটাইনগুলিতে যুক্তিগুলি পাস করার জন্য, এবং সাব্রুটাইনগুলি কল করার আগে রেজিস্টারে মান সংরক্ষণ করার জন্যও ব্যবহৃত হয়।

হিপ মেমোরির একটি অংশ যা অপারেটিং সিস্টেম দ্বারা একটি অ্যাপ্লিকেশনকে দেওয়া হয়, সাধারণত ম্যালোকের মতো সিস্কলের মাধ্যমে। আধুনিক ওএসে এই মেমরিটি এমন পৃষ্ঠাগুলির একটি সেট যা কেবলমাত্র কলিং প্রক্রিয়াটিতে অ্যাক্সেস থাকে।

স্ট্যাকের আকার রানটাইমে নির্ধারিত হয়, এবং প্রোগ্রামটি আরম্ভ হওয়ার পরে সাধারণত বৃদ্ধি পায় না। একটি সি প্রোগ্রামে, প্রতিটি ফাংশনের মধ্যে ঘোষিত প্রতিটি ভেরিয়েবল ধরে রাখতে স্ট্যাকটি যথেষ্ট বড় হওয়া দরকার। প্রয়োজন অনুসারে গাদাটি গতিশীলভাবে বৃদ্ধি পাবে, তবে ওএস চূড়ান্তভাবে কল করছে (এটি প্রায়শই মলোক দ্বারা অনুরোধকৃত মানের চেয়ে বেশি গাদা বাড়বে, যাতে ভবিষ্যতে কমপক্ষে কিছু মলোকগুলি কার্নেলের কাছে ফিরে যাওয়ার প্রয়োজন না হয়) আরও স্মৃতি পান This এই আচরণটি প্রায়শই স্বনির্ধারিত হয়)

প্রোগ্রামটি চালু করার আগে আপনি স্ট্যাকটি বরাদ্দ করেছেন, তাই আপনি স্ট্যাকটি ব্যবহার করার আগে কখনও ম্যালোক লাগবে না, তাই এটির সামান্য সুবিধা। বাস্তবে, ভার্চুয়াল মেমরি সাবসিস্টেম রয়েছে এমন আধুনিক অপারেটিং সিস্টেমে কী দ্রুত হবে এবং কোনটি ধীর হবে তা অনুমান করা খুব কঠিন, কারণ পৃষ্ঠাগুলি কীভাবে বাস্তবায়ন করা হয় এবং সেগুলি কোথায় সংরক্ষণ করা হয় তা একটি বাস্তবায়ন বিশদ।


2
এখানে উল্লেখ করার মতো বিষয়ও যে इंटেল স্ট্যাক অ্যাক্সেসগুলিকে প্রচুর পরিমাণে অনুকূল করে, বিশেষত এমন কোনও জিনিস যেখানে আপনি কোনও ফাংশন থেকে ফিরে আসবেন তা ভবিষ্যদ্বাণী করা।
টম লেস

113

আমি মনে করি অন্য অনেক লোক আপনাকে এই বিষয়ে বেশিরভাগ ক্ষেত্রে সঠিক উত্তর দিয়েছে।

তবে একটি বিবরণ যা মিস করা হয়েছে তা হ'ল "গাদা "টিকে সম্ভবত" ফ্রি স্টোর "বলা উচিত। এই পার্থক্যের কারণ হ'ল মূল ফ্রি স্টোরটি "দ্বিপদী গাদা" হিসাবে পরিচিত একটি ডেটা কাঠামো দিয়ে প্রয়োগ করা হয়েছিল। যে কারণে, মলোক () / ফ্রি () এর প্রাথমিক বাস্তবায়ন থেকে বরাদ্দ করা ছিল একটি গাদা থেকে বরাদ্দ। যাইহোক, এই আধুনিক দিনে, বেশিরভাগ ফ্রি স্টোরগুলি খুব বিস্তৃত ডেটা স্ট্রাকচারের সাথে প্রয়োগ করা হয় যা দ্বিপদী .াল নয়।


8
আর একটি নিতপিক- বেশিরভাগ উত্তর (হালকাভাবে) বোঝায় যে Cভাষার দ্বারা "স্ট্যাক" ব্যবহার করা দরকার । এটি একটি সাধারণ ভুল ধারণা, যদিও এটি প্রয়োগ করা C99 6.2.4 automatic storage duration objects(পরিবর্তনশীল) বাস্তবায়নের ( দূরবর্তী) আধিপত্যের দৃষ্টান্ত । আসলে, "স্ট্যাক" শব্দটি এমনকি C99ভাষা স্ট্যান্ডার্ডে উপস্থিত হয় না : ওপেন-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
জন

[@ স্বাস্থ্য] আপনার উত্তর সম্পর্কে আমার একটি ছোট মন্তব্য আছে। এই প্রশ্নের গৃহীত উত্তর একবার দেখুন । এটি বলে যে ফ্রি স্টোর সম্ভবত গাদা হিসাবে একই , যদিও এটি অগত্যা নয়।
ওমরঅথম্যান

91

আপনি স্ট্যাক দিয়ে কিছু আকর্ষণীয় কাজ করতে পারেন। উদাহরণস্বরূপ, আপনার বরাদ্দের মতো ফাংশন রয়েছে (ধরে নিলে আপনি এর ব্যবহার সম্পর্কে প্রচুর সতর্কবাণীগুলি পেয়ে যেতে পারেন), এটি ম্যালোকের একটি রূপ যা মেমরির জন্য বিশেষত স্ট্যাক ব্যবহার করে, গাদা নয়।

এটি বলেছিল, স্ট্যাক-ভিত্তিক মেমরির ত্রুটিগুলি আমার মধ্যে সবচেয়ে খারাপতম অভিজ্ঞতা রয়েছে। যদি আপনি হিপ মেমরি ব্যবহার করেন এবং আপনি আপনার বরাদ্দকৃত ব্লকের সীমানা ছাড়িয়ে যান তবে আপনার সেগমেন্টের ত্রুটিটি ট্রিগার করার শালীন সুযোগ রয়েছে। (১০০% নয়: আপনার ব্লকটি পূর্বের বরাদ্দকৃত অন্যটির সাথে ঘটনাক্রমে সুসংগত হতে পারে) তবে স্ট্যাকের উপর যে ভেরিয়েবলগুলি সর্বদা একে অপরের সাথে সামঞ্জস্যপূর্ণ তাই সীমার বাইরে লেখা অন্য ভেরিয়েবলের মান পরিবর্তন করতে পারে। আমি শিখেছি যে যখনই আমি অনুভব করি যে আমার প্রোগ্রামটি যুক্তির বিধিগুলি পালন করা বন্ধ করে দিয়েছে, এটি সম্ভবত বাফার ওভারফ্লো।


বহনযোগ্য কীভাবে alloca? উদাহরণস্বরূপ, এটি উইন্ডোজে কাজ করে? এটি কি কেবল ইউনিক্সের মতো অপারেটিং সিস্টেমের জন্য?
পিটার মর্টেনসেন

89

সহজভাবে, স্ট্যাকটি যেখানে স্থানীয় ভেরিয়েবলগুলি তৈরি হয়। এছাড়াও, আপনি যখনই সাব্রটাইনকে প্রোগ্রামের কাউন্টারটি (পরবর্তী মেশিনের নির্দেশের দিকে নির্দেশক) এবং কোনও গুরুত্বপূর্ণ রেজিস্ট্রার কল করেন এবং কখনও কখনও প্যারামিটারগুলি স্ট্যাকের উপর চাপ দেয়। তারপরে সাবরুটিনের অভ্যন্তরীণ যে কোনও স্থানীয় ভেরিয়েবলগুলি স্ট্যাকের দিকে ধাক্কা দেওয়া হয় (এবং সেখান থেকে ব্যবহৃত হয়)। সাব্রোটিন শেষ হয়ে গেলে, স্টাফগুলি সমস্ত স্ট্যাকের বাইরে ফিরে যায়। পিসি এবং রেজিস্ট্রার ডেটা পেয়ে যায় এবং পপ করা হয় এমনভাবে যেখানে সেখানে রেখে দেয় তাই আপনার প্রোগ্রামটি আনন্দময় পথে যেতে পারে।

হিপ মেমরি ডায়নামিক মেমরির বরাদ্দের ক্ষেত্র (স্পষ্ট "নতুন" বা "বরাদ্দ" কলগুলি তৈরি করা হয়)। এটি একটি বিশেষ ডেটা স্ট্রাকচার যা বিভিন্ন আকারের মেমরির ব্লক এবং তাদের বরাদ্দের স্থিতি রাখতে পারে।

"ক্লাসিক" সিস্টেমে র‌্যামটি এমনভাবে নির্ধারণ করা হয়েছিল যে স্ট্যাক পয়েন্টারটি মেমরির নীচে থেকে শুরু হয়েছিল, হিপ পয়েন্টারটি শীর্ষে শুরু হয়েছিল এবং তারা একে অপরের দিকে বাড়তে থাকে। যদি সেগুলি ওভারল্যাপ করে তবে আপনি র‌্যামের বাইরে চলে যান। এটি যদিও আধুনিক মাল্টি-থ্রেডেড ওএসগুলির সাথে কাজ করে না। প্রতিটি থ্রেডের নিজস্ব স্ট্যাক থাকতে হবে এবং সেগুলি গতিশীলভাবে তৈরি হতে পারে।


[@TED] আপনি কেন "মাঝে মাঝে প্যারামিটারগুলি স্ট্যাকের উপর চাপ দেয়" বলেছিলেন? আমি জানি যা তারা সর্বদা হয়। আপনি আরও বিস্তারিত বলতে পারেন?
ওমরঅথম্যান

1
@ ওমরথম্যান - আমি বলেছি যে কারণ এটি সম্পূর্ণরূপে আপনার সংকলক / দোভাষীর লেখকের উপর নির্ভর করে যখন সাব্রুটিন বলা হয় তখন কী ঘটে। ক্লাসিক ফোর্টরান আচরণ হ'ল কোনও স্ট্যাক ব্যবহার না করা। কিছু ভাষা পাস-বাই-নাম যেমন বিদেশী জিনিসগুলিকে সমর্থন করে যা কার্যকরভাবে একটি পাঠ্য প্রতিস্থাপন।
টেড

83

উইকিঅনসর থেকে।

গাদা

যখন কোনও ফাংশন বা কোনও পদ্ধতি অন্য কোনও ফাংশনকে কল করে যা ঘুরে ফিরে অন্য ফাংশন ইত্যাদি কল করে, যখন খুব শেষ ফাংশনটির মান না ফেরায় ততক্ষণ all সমস্ত ফাংশন সম্পাদন স্থগিত থাকে।

স্থগিত ফাংশন কলগুলির এই চেইনটি স্ট্যাক, কারণ স্ট্যাকের উপাদানগুলি (ফাংশন কল) একে অপরের উপর নির্ভর করে।

স্ট্যাকটি ব্যতিক্রম হ্যান্ডলিং এবং থ্রেড মৃত্যুদন্ডের ক্ষেত্রে বিবেচনা করা গুরুত্বপূর্ণ।

গাদা

ভেরিয়েবল সংরক্ষণের জন্য প্রোগ্রামগুলির দ্বারা ব্যবহৃত হ'ল মেমরিটি হ'ল। হিপ (ভেরিয়েবল) এর উপাদানগুলির একে অপরের সাথে কোনও নির্ভরতা নেই এবং যে কোনও সময় এলোমেলোভাবে অ্যাক্সেস করা যায়।


"আমি গৃহীত উত্তরটি আরও বেশি নিম্নতর স্তরের থেকে পছন্দ করি low" এটি একটি খারাপ জিনিস, একটি ভাল জিনিস না।
অরবিট

54

গাদা

  • খুব দ্রুত অ্যাক্সেস
  • সুস্পষ্টভাবে ভেরিয়েবলগুলি ডি-বরাদ্দ করতে হবে না
  • স্পেস সিপিইউ দ্বারা দক্ষতার সাথে পরিচালিত হয়, মেমরিটি খণ্ডিত হয়ে উঠবে না
  • শুধুমাত্র স্থানীয় ভেরিয়েবল
  • স্ট্যাক আকারের সীমা (ওএস-নির্ভর)
  • চলকগুলি পুনরায় আকার দেওয়া যাবে না

গাদা

  • চলকগুলি বিশ্বব্যাপী অ্যাক্সেস করা যায়
  • মেমরির আকারের কোনও সীমা নেই
  • (তুলনামূলকভাবে) ধীর অ্যাক্সেস
  • কোনও জায়গার গ্যারান্টিযুক্ত দক্ষ ব্যবহারের সুযোগ নেই, মেমরির ব্লকগুলি বরাদ্দ করা হয়, তারপরে ছেড়ে দেওয়া হওয়ায় মেমরি সময়ের সাথে খণ্ডিত হয়ে যেতে পারে
  • আপনাকে অবশ্যই মেমরি পরিচালনা করতে হবে (আপনি ভেরিয়েবলগুলি বরাদ্দ এবং মুক্ত করার দায়িত্বে আছেন)
  • পরিবর্তনগুলি রিলোক () ব্যবহার করে পুনরায় আকার দেওয়া যেতে পারে

50

ঠিক আছে, সহজ এবং সংক্ষিপ্ত কথায়, তাদের অর্থ অর্ডার করা এবং অর্ডার করা হয়নি ...!

স্ট্যাক : স্ট্যাক আইটেমগুলিতে জিনিসগুলি একে অপরের শীর্ষে উঠে আসে, যার অর্থ প্রক্রিয়া করা আরও দ্রুত এবং আরও দক্ষ হতে হবে! ...

সুতরাং নির্দিষ্ট আইটেমটি নির্দেশ করার জন্য সর্বদা একটি সূচক থাকে, প্রক্রিয়াটি দ্রুততর হয়, আইটেমগুলির মধ্যেও সম্পর্ক রয়েছে! ...

গাদা : কোনও আদেশ নেই, প্রক্রিয়াকরণটি ধীর হয়ে যাবে এবং কোনও নির্দিষ্ট অর্ডার বা সূচী না দিয়ে মানগুলি একসাথে মিশে যাবে ... এলোমেলো রয়েছে এবং তাদের মধ্যে কোনও সম্পর্ক নেই ... সুতরাং মৃত্যুদন্ড কার্যকর করার এবং ব্যবহারের সময় বিভিন্ন হতে পারে ...

তারা দেখতে কেমন তা দেখতে নীচের চিত্রটি আমি তৈরি করেছি:

এখানে চিত্র বর্ণনা লিখুন


49

সংক্ষেপে

স্থির মেমরি বরাদ্দকরণ এবং গতিশীল মেমরি বরাদ্দকরণের জন্য একটি স্তূপ ব্যবহৃত হয়, উভয়ই কম্পিউটারের র‌্যামে সঞ্চিত।


বিস্তারিত

স্ট্যাক

স্ট্যাকটি একটি "লিফো" (সর্বশেষে, প্রথম আউট) ডেটা স্ট্রাকচার, এটি সিপিইউ দ্বারা বেশ কাছাকাছিভাবে পরিচালনা এবং অনুকূলিত হয়। প্রতিবার কোনও ফাংশন একটি নতুন ভেরিয়েবল ঘোষণা করার সময়, এটি স্ট্যাকের উপরে "ধাক্কা" দেওয়া হয়। তারপরে যখনই কোনও ফাংশনটি প্রস্থান করে, সেই ফাংশনটির মাধ্যমে স্ট্যাকের দিকে ধাক্কা দেওয়া সমস্ত ভেরিয়েবলগুলি মুক্ত হয়ে যায় (এর অর্থ এটি মুছে ফেলা হয়)। একবার স্ট্যাক ভেরিয়েবল মুক্ত হয়ে গেলে সেই মেমরির অঞ্চলটি অন্যান্য স্ট্যাক ভেরিয়েবলের জন্য উপলব্ধ হয়ে যায়।

ভেরিয়েবলগুলি স্টোর করার জন্য স্ট্যাকটি ব্যবহার করার সুবিধাটি হ'ল মেমরিটি আপনার জন্য পরিচালিত হয়। আপনাকে নিজের হাতে মেমরি বরাদ্দ করতে হবে না, বা একবার আপনার আর প্রয়োজন না হলে এটি মুক্ত করুন। আরও কী, কারণ সিপিইউ স্ট্যাক মেমোরিটিকে এত দক্ষতার সাথে সংগঠিত করে, স্ট্যাক ভেরিয়েবলগুলি থেকে পড়া এবং লেখা খুব দ্রুত।

আরও পাওয়া যাবে এখানে


গাদা

হিপ আপনার কম্পিউটারের মেমরির এমন একটি অঞ্চল যা আপনার জন্য স্বয়ংক্রিয়ভাবে পরিচালিত হয় না এবং সিপিইউ দ্বারা দৃ tight়ভাবে পরিচালিত হয় না। এটি মেমরির একটি আরও মুক্ত-ভাসমান অঞ্চল (এবং আরও বড়)। স্তূপে মেমরি বরাদ্দ করতে, আপনাকে অবশ্যই ম্যালোক () বা কলোক () ব্যবহার করতে হবে যা অন্তর্নির্মিত সি ফাংশনগুলি রয়েছে। একবার আপনি স্তূপে মেমরি বরাদ্দের পরে, একবার আর আপনার আর প্রয়োজন না হলে সেই মেমরিটি হ্রাস করতে ফ্রি () ব্যবহার করার জন্য আপনি দায়বদ্ধ।

আপনি যদি এটি করতে ব্যর্থ হন তবে আপনার প্রোগ্রামটিতে মেমরি ফুটো হিসাবে পরিচিত have অর্থাৎ, গাদাতে থাকা মেমরিটি এখনও আলাদা করা হবে (এবং অন্যান্য প্রক্রিয়াগুলিতে উপলব্ধ হবে না)। আমরা ডিবাগিং বিভাগে যেমন দেখব, সেখানে ভ্যালগ্রাইন্ড নামে একটি সরঞ্জাম রয়েছে যা আপনাকে মেমরি ফাঁস সনাক্ত করতে সহায়তা করতে পারে।

স্ট্যাকের বিপরীতে, গাদাটির পরিবর্তনশীল আকারের উপর আকারের বিধিনিষেধ নেই (আপনার কম্পিউটারের সুস্পষ্ট শারীরিক সীমাবদ্ধতা বাদে)। হিপ মেমরিটি পড়তে এবং এগুলিতে লিখিতভাবে পড়ার জন্য কিছুটা ধীর হয় কারণ গাদাটিতে মেমরিটি অ্যাক্সেস করতে পয়েন্টার ব্যবহার করতে হয়। আমরা শীঘ্রই পয়েন্টার সম্পর্কে কথা বলতে হবে।

স্ট্যাকের বিপরীতে, গাদাতে তৈরি ভেরিয়েবলগুলি আপনার প্রোগ্রামের যে কোনও জায়গায়, যে কোনও ফাংশন দ্বারা অ্যাক্সেসযোগ্য। গাদা ভেরিয়েবলগুলি মূলত বিশ্বব্যাপী স্কোপ।

আরও পাওয়া যাবে এখানে


স্ট্যাকের বরাদ্দকৃত ভেরিয়েবলগুলি সরাসরি মেমোরিতে সংরক্ষণ করা হয় এবং এই মেমরিটিতে অ্যাক্সেস খুব দ্রুত হয় এবং প্রোগ্রামটি সংকলিত হওয়ার সাথে সাথে এর বরাদ্দকে মোকাবেলা করা হয়। যখন কোনও ফাংশন বা কোনও পদ্ধতি অন্য কোনও ফাংশনকে কল করে যা ঘুরে ফিরে অন্য ফাংশন ইত্যাদি কল করে, যখন খুব শেষ ফাংশনটির মান না ফেরায় ততক্ষণ all সমস্ত ফাংশন সম্পাদন স্থগিত থাকে। স্ট্যাকটি সর্বদা একটি LIFO অর্ডারে সংরক্ষিত থাকে, সর্বাধিক সংরক্ষিত ব্লক সর্বদা মুক্তি পেতে হবে পরবর্তী ব্লক। এটি স্ট্যাকের উপর নজর রাখা সত্যিই সহজ করে তোলে, স্ট্যাক থেকে একটি ব্লককে মুক্ত করা একটি পয়েন্টারকে সামঞ্জস্য করা ছাড়া আর কিছুই নয়।

গাদাতে বরাদ্দকৃত ভেরিয়েবলগুলির চালনার সময় তাদের মেমরি বরাদ্দ থাকে এবং এই মেমরিটিতে অ্যাক্সেস করা কিছুটা ধীর হয় তবে হিপ আকারটি ভার্চুয়াল মেমরির আকার দ্বারা সীমাবদ্ধ থাকে। স্তূপের উপাদানগুলির একে অপরের সাথে কোনও নির্ভরতা নেই এবং যে কোনও সময় এলোমেলোভাবে অ্যাক্সেস করা যায়। আপনি যে কোনও সময় একটি ব্লক বরাদ্দ করতে এবং যে কোনও সময় এটিকে ফ্রি করতে পারেন। এটি যে স্তূপের কোন অংশ নির্ধারিত সময়ে বরাদ্দ করা হয়েছে বা নিখরচায় রাখা হয়েছে তা ট্র্যাক করে রাখা আরও জটিল করে তোলে।

এখানে চিত্র বিবরণ লিখুন

সংকলনের সময় আপনাকে ঠিক কতটা ডেটা বরাদ্দ করতে হবে তা সঠিকভাবে জেনে থাকলে আপনি স্ট্যাকটি ব্যবহার করতে পারেন এবং এটি খুব বেশি বড় নয়। রানটাইমের সময় আপনার ঠিক কতটা ডেটা প্রয়োজন হবে বা আপনার যদি প্রচুর পরিমাণে ডেটা বরাদ্দ করতে হয় তা ঠিক না জানলে আপনি হিপটি ব্যবহার করতে পারেন।

বহু-থ্রেড পরিস্থিতিতে প্রতিটি থ্রেডের নিজস্ব সম্পূর্ণ স্বতন্ত্র স্ট্যাক থাকবে তবে তারা গাদা ভাগ করবে। স্ট্যাকটি থ্রেড নির্দিষ্ট এবং হিপটি নির্দিষ্ট অ্যাপ্লিকেশন। স্ট্যাকটি ব্যতিক্রম হ্যান্ডলিং এবং থ্রেড মৃত্যুদন্ডের ক্ষেত্রে বিবেচনা করা গুরুত্বপূর্ণ।

প্রতিটি থ্রেড একটি স্ট্যাক পায়, যখন অ্যাপ্লিকেশনটির জন্য সাধারণত কেবলমাত্র একটি গাদা থাকে (যদিও বিভিন্ন ধরণের বরাদ্দের জন্য একাধিক স্তূপ রাখা অস্বাভাবিক নয়)।

এখানে চিত্র বিবরণ লিখুন

রান-টাইমে, যদি অ্যাপ্লিকেশনটির আরও বেশি গাদা প্রয়োজন হয় তবে এটি ফ্রি মেমরি থেকে মেমরি বরাদ্দ করতে পারে এবং যদি স্ট্যাকের মেমরির প্রয়োজন হয় তবে এটি অ্যাপ্লিকেশনটির জন্য নিখরচায় মেমরি বরাদ্দ করা মেমরি থেকে মেমরি বরাদ্দ করতে পারে।

এমনকি, আরও বিশদ এখানে এবং এখানে দেওয়া হয় ।


এখন আপনার প্রশ্নের উত্তর আসুন ।

ওএস বা ভাষা রানটাইম দ্বারা তারা কতটা নিয়ন্ত্রণ করে?

থ্রেডটি তৈরি হওয়ার পরে প্রতিটি সিস্টেম-স্তরের থ্রেডের জন্য ওএস স্ট্যাক বরাদ্দ করে। অ্যাপ্লিকেশনটির হিপ বরাদ্দ করতে সাধারণত ভাষা রানটাইম দ্বারা ওএসকে ডাকা হয়।

আরও পাওয়া যাবে এখানে

তাদের সুযোগ কী?

ইতিমধ্যে শীর্ষে দেওয়া হয়েছে।

"সংকলনের আগে আপনার ঠিক কতটা ডেটা বরাদ্দ করতে হবে তা যদি আপনি জানেন তবে আপনি স্ট্যাকটি ব্যবহার করতে পারেন, এবং এটি খুব বেশি বড় নয় run রানটাইমে আপনার ঠিক কতটা ডেটা প্রয়োজন হবে তা আপনি যদি না জানেন তবে আপনি হিপটি ব্যবহার করতে পারেন বা যদি আপনাকে প্রচুর ডেটা বরাদ্দ করতে হবে।

আরও এখানে পাওয়া যাবে

এদের প্রত্যেকের আকার কী নির্ধারণ করে?

কোনও থ্রেড তৈরি হয়ে গেলে স্ট্যাকের আকার ওএস দ্বারা সেট করা হয় । হিপটির আকার অ্যাপ্লিকেশন শুরুতে সেট করা থাকে, তবে স্থান প্রয়োজন হিসাবে এটি বাড়তে পারে (বরাদ্দকারী অপারেটিং সিস্টেম থেকে আরও মেমরি অনুরোধ করে)।

কি দ্রুততর করে তোলে?

স্ট্যাক বরাদ্দ অনেক দ্রুত যেহেতু এটি যা যা করে তা স্ট্যাক পয়েন্টারটিকে সরিয়ে দেয়। মেমরি পুল ব্যবহার করে, আপনি গাদা বরাদ্দের তুলনায় তুলনামূলক কর্মক্ষমতা পেতে পারেন, তবে এটি সামান্য যুক্ত জটিলতা এবং তার নিজস্ব মাথা ব্যথার সাথে আসে।

এছাড়াও, স্ট্যাক বনাম হিপ কেবল একটি কার্যকারিতা বিবেচনা নয়; এটি আপনাকে প্রত্যাশিত আয়ুগুলির জীবনকাল সম্পর্কেও অনেক কিছু জানায়।

বিশদটি এখান থেকে পাওয়া যাবে


36

১৯৮০ এর দশকে, ইউএনআইএক্স বড় বড় সংস্থাগুলি তাদের নিজস্ব রোলিংয়ের সাথে বানির মতো প্রচার করেছিল। ইতিহাসে হারিয়ে যাওয়া কয়েক ডজন ব্র্যান্ড নামের মতোই এক্সনর একটি ছিল। কীভাবে স্মৃতি রচনা করা হয়েছিল তা অনেকগুলি প্রয়োগকারীর বিবেচনার ভিত্তিতে।

একটি সাধারণ সি প্রোগ্রাম ব্রেকে () মান পরিবর্তন করে বাড়ানোর সুযোগের সাথে স্মৃতিতে সমতল স্থাপন করা হয়েছিল। সাধারণত, এইচএইপি হ'ল এই ব্র্ক মানটির ঠিক নীচে ছিল এবং ক্রমবর্ধমান ব্রেক উপলব্ধ হিপগুলির পরিমাণ বাড়িয়েছে।

একক স্ট্যাক সাধারণত হ্যাপের নীচে এমন একটি অঞ্চল ছিল যা মেমরির একটি ট্র্যাক্ট ছিল যা মেমরির পরবর্তী নির্দিষ্ট ব্লকের শীর্ষ অবধি মানের কিছুই রাখে না। এই পরবর্তী ব্লকটি প্রায়শই CODE ছিল যা এর যুগের বিখ্যাত হ্যাকগুলির একটিতে স্ট্যাক ডেটা দ্বারা ওভাররাইট করা যেতে পারে।

একটি সাধারণ মেমরি ব্লক ছিল বিএসএস (শূন্য মানের একটি ব্লক) যা দুর্ঘটনাবশত একটি প্রস্তুতকারকের অফারে শূন্য হয় নি। অন্যটি ছিল স্ট্রিংস এবং সংখ্যা সহ প্রাথমিক মানযুক্ত ডেটা। তৃতীয়টি ছিল সিডিটি (সি রানটাইম), প্রধান, ফাংশন এবং লাইব্রেরি সহ কোডে।

ইউনিক্সে ভার্চুয়াল মেমরির আগমন অনেকগুলি প্রতিবন্ধকতাগুলিকে পরিবর্তন করে। এই ব্লকগুলি সুসংহত বা আকারে স্থির করা বা এখনই কোনও নির্দিষ্ট উপায়ে অর্ডার করার কোনও কারণ নেই। অবশ্যই, ইউএনআইএক্সের আগে মাল্টিক্স ছিল যা এই সীমাবদ্ধতায় ভোগেনি। এখানে সেই যুগের স্মৃতি বিন্যাসগুলির মধ্যে একটির স্কিম্যাটিক প্রদর্শন করা হচ্ছে।

একটি সাধারণ 1980 এর স্টাইলের UNIX সি প্রোগ্রাম মেমরি লেআউট



26

কয়েক সেন্ট: আমি মনে করি, মেমরির গ্রাফিকাল এবং আরও সহজ আঁকাই ভাল হবে:

যা ঘটছে তার আরও সহজ বোঝার জন্য সরলীকরণ সহ প্রক্রিয়া মেমরির নির্মাণের এটি আমার দৃষ্টি vision


তীর - যেখানে স্ট্যাক এবং হিপগুলি বৃদ্ধি করে তা দেখান, প্রসেস স্ট্যাকের আকারের সীমা থাকে, ওএসে সংজ্ঞায়িত হয়, থ্রেড স্ট্যাকের আকার সীমাটি সাধারণত থ্রেড তৈরি করে পরামিতি দ্বারা by উদাহরণস্বরূপ 32 বিট 2-4 গিগাবাইটের জন্য সাধারণত সর্বাধিক ভার্চুয়াল মেমরি আকারের দ্বারা সীমাবদ্ধ হিপ।

এত সহজ উপায়: প্রক্রিয়া হিপ প্রক্রিয়া এবং অভ্যন্তরের সমস্ত থ্রেডের জন্য সাধারণ, ম্যালোক () এর মতো কিছু সহ সাধারণ ক্ষেত্রে মেমরি বরাদ্দকরণের জন্য ব্যবহার করে ।

ফাংশন কল, স্থানীয় ফাংশন ভেরিয়েবলের পরামিতি হিসাবে প্রক্রিয়াজাত করা সাধারণ ক্ষেত্রে ফাংশন রিটার্ন পয়েন্টার এবং ভেরিয়েবলগুলিতে স্ট্যাকের জন্য স্টোর হ'ল মেমোরি।


23

যেহেতু কিছু উত্তর নিটপিক করছে, তাই আমি আমার মাইটকে অবদান রাখছি।

আশ্চর্যজনকভাবে, কেউ উল্লেখ করেনি যে একাধিক (যেমন চলমান ওএস-স্তরীয় থ্রেডগুলির সংখ্যার সাথে সম্পর্কিত নয়) কল স্ট্যাকগুলি কেবল বিদেশী ভাষায় (পোস্টস্ক্রিপ্ট) বা প্ল্যাটফর্মগুলিতে (ইনটেল ইটানিয়াম) পাওয়া যাবে না, তবে তন্তুগুলি , সবুজ থ্রেডগুলিতেও পাওয়া যাবে এবং কিছু বাস্তবায়ন কর্টাইনগুলির

আঁশ, সবুজ থ্রেড এবং কর্টিনগুলি বিভিন্ন উপায়ে একই রকম, যা অনেকগুলি বিভ্রান্তির দিকে পরিচালিত করে। ফাইবার এবং সবুজ থ্রেডের মধ্যে পার্থক্যটি হ'ল প্রাক্তন সমবায় মাল্টিটাস্কিং ব্যবহার করে, অন্যদিকেটি সমবায় বা প্রিমিপটিভ একটি (বা এমনকি উভয়) বৈশিষ্ট্যযুক্ত হতে পারে। তন্তু এবং করোটিনগুলির মধ্যে পার্থক্যের জন্য, দেখুন এখানে দেখুন

যাই হোক, উভয় তন্তু, সবুজ থ্রেড এবং coroutines উদ্দেশ্য একই সময়ে নির্বাহ একাধিক ফাংশন হচ্ছে না, কিন্তু না সমান্তরাল (দেখুন এই তাই প্রশ্ন একটি একক অপারেটিং সিস্টেম-স্তরীয় থ্রেড মধ্যে পার্থক্য জন্য) একে অপরের থেকে নিয়ন্ত্রণ আগে পিছে হস্তান্তর একটি সংগঠিত ফ্যাশন।

ফাইবার, সবুজ থ্রেড বা কর্টিনগুলি ব্যবহার করার সময়, আপনার সাধারণত প্রতিটি ফাংশন আলাদা স্ট্যাক থাকে। (প্রযুক্তিগতভাবে, কেবল একটি স্ট্যাক নয়, তবে কার্য সম্পাদনের পুরো প্রসঙ্গটিই রয়েছে। সর্বাধিক গুরুত্বপূর্ণ, সিপিইউ রেজিস্ট্রেশন করে।) প্রতিটি থ্রেডের জন্য একই সাথে চলমান ফাংশনগুলি যতটা স্ট্যাক থাকে এবং প্রতিটি ফাংশন সম্পাদনের মধ্যে থ্রেডটি স্যুইচ করে চলেছে আপনার প্রোগ্রামের যুক্তি অনুযায়ী। যখন কোনও ফাংশন শেষ হয়ে যায় তখন এর স্ট্যাকটি ধ্বংস হয়ে যায়। সুতরাং, স্ট্যাকের সংখ্যা এবং জীবনকাল গতিশীল এবং ওএস-স্তরের থ্রেডের সংখ্যা দ্বারা নির্ধারিত হয় না!

নোট করুন যে আমি বলেছিলাম " সাধারণত প্রতিটি ফাংশন আলাদা স্ট্যাক থাকে"। কোর্টউইনগুলির স্ট্যাকফুল এবং স্ট্যাকলেস উভয়ই প্রয়োগ রয়েছে। সর্বাধিক উল্লেখযোগ্য stackful সি ++ বাস্তবায়নের হয় Boost.Coroutine এবং মাইক্রোসফট PPL এর async/await। (তবে, সি ++ এর পুনরায় শুরুযোগ্য ফাংশন (ওরফে "async এবং await"), যা সি ++ 17 তে প্রস্তাবিত হয়েছিল, স্ট্যাকলেস কর্টিন ব্যবহার করার সম্ভাবনা রয়েছে))

সি ++ স্ট্যান্ডার্ড লাইব্রেরিতে ফাইবারগুলির প্রস্তাব আসন্ন। এছাড়াও, কিছু তৃতীয় পক্ষের গ্রন্থাগার রয়েছে । পাইথন এবং রুবির মতো ভাষায় সবুজ থ্রেডগুলি অত্যন্ত জনপ্রিয়।


19

আমার কাছে কিছু ভাগ করার আছে, যদিও প্রধান পয়েন্টগুলি ইতিমধ্যে আচ্ছাদিত।

গাদা

  • খুব দ্রুত অ্যাক্সেস।
  • র‌্যামে সঞ্চিত।
  • স্থানীয় ভেরিয়েবল এবং ফাংশন প্যারামিটারগুলি সহ এখানে ফাংশন কলগুলি লোড করা হয়।
  • প্রোগ্রামটি সুযোগের বাইরে চলে গেলে স্থান স্বয়ংক্রিয়ভাবে মুক্ত হয়।
  • ক্রমযুক্ত স্মৃতিতে সঞ্চিত।

গাদা

  • স্ট্যাকের তুলনামূলকভাবে অ্যাক্সেস ধীরে ধীরে।
  • র‌্যামে সঞ্চিত।
  • গতিশীলভাবে তৈরি ভেরিয়েবলগুলি এখানে সংরক্ষণ করা হয়, যার জন্য পরে ব্যবহারের পরে বরাদ্দ হওয়া মেমরিটি মুক্ত করা দরকার।
  • মেমোরি বরাদ্দ যেখানেই হয় সেখানে সঞ্চিত, সর্বদা পয়েন্টার দ্বারা অ্যাক্সেস করা।

আকর্ষণীয় দ্রষ্টব্য:

  • যদি ফাংশন কলগুলি হিপে সংরক্ষণ করা হত, তবে এটি 2 টি অগোছালো পয়েন্ট হতে পারে:
    1. স্ট্যাকের ক্রমানুসারে স্টোরেজ হওয়ার কারণে, কার্যকর করা দ্রুত হয়। স্তূপে সংরক্ষণের ফলে প্রচুর সময় খরচ হত ফলে পুরো প্রোগ্রামটি ধীর হয়ে যায়।
    2. যদি ফাংশনগুলি হিপ (পয়েন্টার দ্বারা চিহ্নিত অগোছালো স্টোরেজ) এ সংরক্ষণ করা হত, তবে কলারের ঠিকানায় ফিরে যাওয়ার কোনও উপায় থাকত না (যা মেমরিতে ক্রমান্বয়ে সংরক্ষণের কারণে স্ট্যাক দেয়)।

1
সংক্ষিপ্ত এবং পরিষ্কার। সুন্দর :)
ইংকন্টি

13

কি দারুন! এতগুলি উত্তর এবং আমি মনে করি না যে এর মধ্যে একটিও এটি সঠিকভাবে পেয়েছে ...

1) তারা কোথায় এবং কী (একটি বাস্তব কম্পিউটারের স্মৃতিতে শারীরিকভাবে)?

স্ট্যাকটি এমন মেমরি যা আপনার প্রোগ্রামের চিত্রটিতে বরাদ্দ করা সর্বোচ্চ মেমরির ঠিকানা হিসাবে শুরু হয় এবং এটি সেখান থেকে মান হ্রাস পায়। এটি ফাংশন পরামিতি বলে এবং ফাংশনে ব্যবহৃত সমস্ত অস্থায়ী ভেরিয়েবলের জন্য সংরক্ষিত।

দুটি স্তূপ রয়েছে: সরকারী এবং ব্যক্তিগত।

আপনার প্রোগ্রামে কোডের শেষ বাইটের পরে ব্যক্তিগত গাদা 16-বাইট সীমানা (-৪-বিট প্রোগ্রামের জন্য) বা একটি 8-বাইট সীমানা (32-বিট প্রোগ্রামগুলির জন্য) থেকে শুরু হয় এবং তারপরে সেখান থেকে মান বৃদ্ধি পায় value একে ডিফল্ট হিপও বলা হয়।

যদি ব্যক্তিগত গাদা খুব বড় হয়ে যায় তবে এটি স্ট্যাকের অঞ্চলটি ওভার্যাপল্যাপ করবে, স্ট্যাকটি খুব বড় হয়ে গেলে গাদাটি ওভারল্যাপ করবে। স্ট্যাকটি উচ্চতর ঠিকানায় শুরু হয় এবং নীচের ঠিকানার দিকে চলে যায়, সঠিক হ্যাকিংয়ের সাহায্যে আপনি স্ট্যাকটি এত বড় করে তুলতে পারেন যে এটি ব্যক্তিগত গাদা অঞ্চলটিকে ছাড়িয়ে যাবে এবং কোড অঞ্চলটি ওভারল্যাপ করবে। কৌশলটি হ'ল কোড ক্ষেত্রটি যথেষ্ট পরিমাণে ওভারল্যাপ করা যা আপনি কোডটিতে প্রবেশ করতে পারেন। এটি করা কিছুটা জটিল এবং আপনি একটি প্রোগ্রাম ক্র্যাশ হওয়ার ঝুঁকিপূর্ণ হন তবে এটি সহজ এবং খুব কার্যকর।

আপনার প্রোগ্রামের চিত্রের জায়গার বাইরে পাবলিক হিপগুলি এটির নিজস্ব মেমরির জায়গাতেই থাকে। এই মেমরিটি মেমরির রিসোর্সগুলির দুষ্প্রাপ্যতা পেলে হার্ড ডিস্কে চালিত হবে।

2) ওএস বা ভাষা রানটাইম দ্বারা তারা কতটা নিয়ন্ত্রণ করে?

স্ট্যাকটি প্রোগ্রামার দ্বারা নিয়ন্ত্রিত হয়, বেসরকারী হিপগুলি ওএস দ্বারা পরিচালিত হয়, এবং পাবলিক হিপ কারও দ্বারা নিয়ন্ত্রিত হয় না কারণ এটি একটি ওএস পরিষেবা - আপনি অনুরোধ করেন এবং হয় সেগুলি অনুমোদিত বা অস্বীকৃত হয়।

2 খ) তাদের সুযোগ কী?

এগুলি সমস্ত প্রোগ্রামে বৈশ্বিক, তবে তাদের বিষয়বস্তুগুলি ব্যক্তিগত, সর্বজনীন বা গ্লোবাল হতে পারে।

2 গ) এদের প্রত্যেকটির আকার কী নির্ধারণ করে?

স্ট্যাকের আকার এবং ব্যক্তিগত হ্যাপগুলি আপনার সংকলক রানটাইম বিকল্পগুলির দ্বারা নির্ধারিত হয়। একটি আকারের প্যারামিটার ব্যবহার করে রানটাইম এ পাবলিক হ্যাপ শুরু করা হয়।

2 ডি) কোনটি দ্রুত করে তোলে?

এগুলি দ্রুত হওয়ার জন্য ডিজাইন করা হয়নি, তারা দরকারী হওয়ার জন্য ডিজাইন করা হয়েছে। প্রোগ্রামার তাদের কীভাবে ব্যবহার করে তা নির্ধারণ করে যে তারা "দ্রুত" বা "ধীর" কিনা

সূত্র:

https://norasandler.com/2019/02/18/Write-a-Compiler-10.html

https://docs.microsoft.com/en-us/windows/desktop/api/heapapi/nf-heapapi-getprocessheap

https://docs.microsoft.com/en-us/windows/desktop/api/heapapi/nf-heapapi-heapcreate


8

প্রচুর উত্তর ধারণাগুলি হিসাবে সঠিক, তবে আমাদের অবশ্যই লক্ষ্য রাখতে হবে যে সাব্রউটাইনগুলি (এসেম্বলি ভাষায় CALL ..) কল করার অনুমতি দেওয়ার জন্য হার্ডওয়্যার (অর্থাত্ মাইক্রোপ্রসেসর) দ্বারা একটি স্ট্যাকের প্রয়োজন। (ওওপি ছেলেরা এটিকে পদ্ধতিগুলি বলবে )

স্ট্যাকের মধ্যে আপনি রিটার্নের ঠিকানাগুলি সংরক্ষণ করেন এবং কল করুন → পুশ / রেট → পপ সরাসরি হার্ডওয়্যারে পরিচালিত হয়।

প্যারামিটারগুলি পাস করার জন্য আপনি স্ট্যাকটি ব্যবহার করতে পারেন .. এটি রেজিস্টারগুলি ব্যবহার করার চেয়ে ধীর হলেও এমনকি (কোনও মাইক্রোপ্রসেসর গুরু বলতে পারেন বা 1980 এর দশকের একটি ভাল বায়োস বই ...)

  • কোনও স্ট্যাক ছাড়া মাইক্রোপ্রসেসর কাজ করতে পারে না। (আমরা সাব্রোটাইন / ফাংশন ব্যতীত সমাবেশের ভাষাতেও কোনও প্রোগ্রাম কল্পনা করতে পারি না)
  • গাদা ছাড়া এটি পারে। (একটি অ্যাসেম্বলি ভাষার প্রোগ্রাম ব্যতীত কাজ করতে পারে, কারণ হিপ একটি ওএস ধারণা, ম্যালোক হিসাবে এটি ওএস / লিব কল call

স্ট্যাকের ব্যবহারটি তত দ্রুত:

  • হার্ডওয়্যার, এবং এমনকি ধাক্কা / পপ খুব কার্যকর।
  • ম্যালোকের জন্য কার্নেল মোডে প্রবেশ করা, লক / সেম্যাফোর (বা অন্যান্য সিঙ্ক্রোনাইজেশন প্রিমিটিভস) ব্যবহার করা হবে যা কিছু কোড চালায় এবং বরাদ্দ রাখার জন্য প্রয়োজনীয় কিছু কাঠামো পরিচালনা করে।


আপনি কি বলতে চান যে mallocএটি কার্নেল কল?
পিটার মর্টেনসেন

1) হ্যাঁ, সরি .. ওওপি ... 2) ম্যালোক: আমি শীঘ্রই লিখছি, দুঃখিত ... malloc ব্যবহারকারীর স্পেসে রয়েছে .. তবে অন্যান্য কলগুলি ট্রিগার করতে পারে .... মোদ্দা কথাটি হিপ ব্যবহার করা খুব ধীর হতে পারে AN ...
ingconti

" ধারণাগুলি হিসাবে প্রচুর উত্তর সঠিক, তবে আমাদের অবশ্যই লক্ষ্য রাখতে হবে যে সাব্রুটাইনগুলিকে (সমাবেশ ভাষায় CALL কল করার অনুমতি দেওয়ার জন্য) হার্ডওয়্যার (অর্থাত্ মাইক্রোপ্রসেসর) দ্বারা একটি স্ট্যাকের প্রয়োজন " " আপনি সিপিইউ স্ট্যাককে বিভ্রান্ত করছেন (যদি আধুনিক সিপিইউতে একটি থাকে) এবং ভাষা রানটাইম স্ট্যাকস (প্রতিটি থ্রেডে এক)। প্রোগ্রামাররা যখন কোনও স্ট্যাকের কথা বলে, এটি রানটাইমের থ্রেড এক্সিকিউশন স্ট্যাক, যেমন একটি নেট থ্রেড স্ট্যাক), আমরা সিপিইউ স্ট্যাকের কথা বলছি না।
মিনিট

1

স্ট্যাকটি মূলত একটি অ্যাক্সেস অ্যাক্সেস মেমরি যা কেবল তার আইটেমগুলিকে একটি ভাল - স্ট্যাক হিসাবে পরিচালনা করে। আকারগুলি আগাম হিসাবে পরিচিত কেবল এমন আইটেমগুলি স্ট্যাকের মধ্যে যেতে পারে । এটি সংখ্যা, স্ট্রিং, বুলিয়ানগুলির ক্ষেত্রে।

গাদা আইটেম যা আপনার সঠিক আকার এবং গঠন পূর্বাহ্নে স্থির করতে পারে না একটি স্মৃতি । যেহেতু অবজেক্ট এবং অ্যারেগুলি পরিবর্তিত হতে পারে এবং রানটাইমের সময় পরিবর্তন করা যায়, তাই তাদের গাদা হয়ে যেতে হবে।

সূত্র: একাডেমাইন্ড


0

সত্যিই ভাল আলোচনার জন্য আপনাকে ধন্যবাদ তবে সত্যই নুব হিসাবে আমি ভাবছি কোথায় নির্দেশনা রাখা হয়েছে? শুরুতে বিজ্ঞানীরা দুটি আর্কিটেকচারের মধ্যে সিদ্ধান্ত নিচ্ছিলেন (ভন নিউমন যেখানে সবকিছুই ডেটা এবং হার্ভার্ড হিসাবে বিবেচনা করা হয় যেখানে মেমরির একটি অঞ্চল নির্দেশাবলীর জন্য সংরক্ষিত ছিল এবং অন্যটি তথ্যের জন্য)। শেষ পর্যন্ত, আমরা ভন নিউমান ডিজাইনের সাথে চলেছি এবং এখন সবকিছুই 'এক' হিসাবে বিবেচিত হয়। আমি যখন https://www.cs.virginia.edu/~evans/cs216/guides/x86.html অ্যাসেম্বলি শিখছিলাম তখন এটি আমার পক্ষে কঠিন হয়ে পড়ে কারণ তারা রেজিস্ট্রার এবং স্ট্যাক পয়েন্টার সম্পর্কে কথা বলে।

উপরের সবকিছুই ডেটা নিয়ে কথা বলে। আমার অনুমান যেহেতু কোনও নির্দেশনা একটি নির্দিষ্ট মেমরির পদক্ষেপের সাথে সংজ্ঞায়িত জিনিস তাই এটি স্ট্যাকের উপরে চলে যায় এবং সুতরাং সমাবেশে আলোচিত সমস্ত 'সেই' নিবন্ধগুলি স্ট্যাকের মধ্যে রয়েছে। অবশ্যই তারপরে নির্দেশিকা এবং ডেটা সহ অবজেক্ট ওরিয়েন্টেড প্রোগ্রামিং এ এসেছিল একটি কাঠামোয় যা গতিশীল ছিল তাই এখন নির্দেশাবলীও গাদাতে রাখা হবে?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.