যদি স্ট্যাকের উপর আরও দক্ষতার সাথে সমস্ত কিছু করা যায় তবে আমাদের কেন একটি গাদা দরকার?


24

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

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


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

2
আপনার ভিত্তি ত্রুটিযুক্ত - স্ট্যাকের উপরে সবকিছু আরও কার্যকরভাবে করা যায় না। যে কি - এই আপনি যে উত্তরগুলি পেয়েছি তাই কোন বৈপরীত্য নেই পারেন স্ট্যাক সম্পন্ন করা অনেক দ্রুত সেখানে করা যাবে।
ইঙ্গো

... ধরে নেওয়া আপনার হার্ডওয়্যারটির একটি স্ট্যাক, বা স্ট্যাক-আপেক্ষিক ঠিকানা রয়েছে।
রিচ মেল্টন

3
আমি বিশ্বাসী আমি বলি এটা কর
জেফো

উত্তর:


25

স্ট্যাকের সমস্যাটি হ'ল স্ট্যাকের শীর্ষে না থাকলে আপনি "ফ্রি" মেমরি করতে পারবেন না। উদাহরণস্বরূপ, বলুন যে আপনি বিভিন্ন আকারের 3 টি জিনিস বরাদ্দ করেছেন:

a = allocate(2000000); // 2000000 bytes
b = allocate(1);
c = allocate(5000000);

স্ট্যাকটি aনীচে, bমাঝখানে এবং cউপরে থাকবে। আমরা মুক্ত করতে চাইলে এটি সমস্যাযুক্ত হয়ে ওঠে b:

free(b); // b is not on top! We have to wait until c is freed!

কাজটি হ'ল পরে সমস্ত ডেটা সরিয়ে নিয়ে যাওয়া bএবং যদি পরে আসে তবে তা স্থানান্তর করা a। এটি কাজ করে, তবে এক্ষেত্রে 5000000 অনুলিপি লাগবে - এমন একটি জিনিস যা একটি স্তূপের চেয়ে অনেক ধীর হবে।

এই কারণেই আমাদের একটা গাদা আছে। যদিও বরাদ্দ স্ট্যাকের তুলনায় ধীর হতে পারে ( O(log n)বনাম O(1)), হ্যাপগুলি একটি স্বেচ্ছাসেবী স্থানে মেমরিকে O(log n)দ্রুততর করতে দেয় - স্ট্যাকের তুলনায়O(n)


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

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

2
@ ডিডালনিক্স আসলে এটি হ'লের পরিবর্তে একটি বৃহত স্ট্যাক ব্যবহার করার উদাহরণ যা সাধারণত প্রচুর পরিমাণে মেমরির জন্য ব্যবহৃত হয়। ফেসবুক যদিও একটি বিশেষ ক্ষেত্রে। অপসারণের চেয়ে ডেটা এত দ্রুত যুক্ত করা হয় যে ডিওলোকেশন বৃদ্ধির হারের ক্ষেত্রে কোনও তাত্পর্যপূর্ণ করে না - আপনি ও (1) বরাদ্দ পেতে ইচ্ছাকৃতভাবে ডিজাইনে মেমরি ফাঁস অন্তর্ভুক্ত করতে পারেন।
টম ক্লার্কসন

7
@ পলটম্বলিন এফবি সামগ্রীটি সরিয়ে না নেওয়ার মূল কারণটি হ'ল তারা তাদের লাভের জন্য এটি খনন করতে পারেন ...
কোয়ান্ট_দেব

5
Facebook doesn't remove content from its disk when you ask it to remove it, it just removes the pointer to it- আপনি যখন কোনও অপারেটিং সিস্টেমের কোনও ফাইল মুছতে মুছবেন তখন মূলত যা ঘটে তা ঘটে।
রবার্ট হার্ভে

5

স্ট্যাক প্রতি থ্রেড, গাদা প্রক্রিয়া-বিস্তৃত

যদি আমি একটি সারিতে রেখে সমস্ত প্রক্রিয়াকরণ কাজের আইটেমগুলিতে 100 টি থ্রেড থাকে, তবে আমি ঠিক যেখানে ওয়ার্ক আইটেমগুলি বরাদ্দ করব যাতে 100 টি থ্রেডের মধ্যে কোনও সেগুলি দেখতে পারে?

স্মৃতিশক্তি অন্যান্য ধরণের আছে

যেমন মেমরি-ম্যাপযুক্ত ফাইল, ভাগ করা মেমরি, I / O ম্যাপযুক্ত (কার্নেল মোড)। দক্ষতার যুক্তি এই পরিস্থিতিতে এক ধরণের শঙ্কাযুক্ত।


4

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


3
লিফো, ফিফো নয়।
পাব্বি

কখনও কখনও FILO;) নামেও পরিচিত
oenone

3

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

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


0

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


0

হিপ স্টোরেজ বরাদ্দের অন্যান্য অনেক কারণের মধ্যে।

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

আপনি আপনার ফাংশন থেকে স্ট্যাক আইটেমগুলির ঠিকানাগুলি কল করে ফাংশনগুলিতে প্রেরণ করতে পারেন, কারণ আপনি গ্যারান্টি দিতে পারবেন যে আপনার প্রোগ্রাম "রিটার্ন ()" না হওয়া পর্যন্ত এগুলি বিদ্যমান থাকবে। তবে আপনার ফাংশনটি ফিরিয়ে দেওয়ার সাথে সাথে সমস্ত স্ট্যাক স্টোরেজ গ্র্যাব হয়ে যায়।

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