যতদূর আমি জানি প্রতিটি থ্রেড অপারেটিং সিস্টেম দ্বারা থ্রেড তৈরি করা হলে একটি পৃথক স্ট্যাক পেয়ে যায়। আমি ভাবছি যদি প্রতিটি থ্রেডের নিজেরও আলাদা গাদা থাকে?
যতদূর আমি জানি প্রতিটি থ্রেড অপারেটিং সিস্টেম দ্বারা থ্রেড তৈরি করা হলে একটি পৃথক স্ট্যাক পেয়ে যায়। আমি ভাবছি যদি প্রতিটি থ্রেডের নিজেরও আলাদা গাদা থাকে?
উত্তর:
না। সমস্ত থ্রেড একটি সাধারণ গাদা ভাগ।
প্রতিটি থ্রেডের একটি ব্যক্তিগত স্ট্যাক রয়েছে , এটি এটি থেকে আইটেমগুলি দ্রুত যুক্ত এবং সরাতে পারে। এটি স্ট্যাক ভিত্তিক মেমরিটিকে দ্রুত করে তোলে, তবে আপনি যদি অসীম পুনরাবৃত্তির ক্ষেত্রে খুব বেশি স্ট্যাক মেমরি ব্যবহার করেন তবে আপনি স্ট্যাকের ওভারফ্লো পাবেন।
যেহেতু সমস্ত থ্রেড একই গাদা ভাগ করে নেয়, বরাদ্দকারী / ডিএলোকেটরের অ্যাক্সেস অবশ্যই সিঙ্ক্রোনাইজ করতে হবে। বরাদ্দ বিতর্ক এড়ানোর জন্য বিভিন্ন পদ্ধতি এবং গ্রন্থাগার রয়েছে ।
কিছু ভাষাগুলি আপনাকে মেমরির ব্যক্তিগত পুল বা পৃথক স্তূপ তৈরি করতে দেয় যা আপনি একক থ্রেডে নির্ধারণ করতে পারেন।
you will get a stack overflow.
স্ট্যাক ওভারফ্লোতে একটি স্ট্যাক ওভারফ্লো!
ডিফল্টরূপে সি এর কেবল একটি একক স্তূপ রয়েছে।
এটি বলেছে, কিছু বরাদ্দকারী যা থ্রেড সচেতন সেগুলি হিপটি ভাগ করবে যাতে প্রতিটি থ্রেড থেকে বরাদ্দ দেওয়ার নিজস্ব অঞ্চল থাকে। ধারণাটি হ'ল এটি হ্যাপ স্কেল আরও ভাল করা উচিত।
এ জাতীয় স্তূপের একটি উদাহরণ হর্ড ।
ওএসের উপর নির্ভর করে। উইন্ডোজ এবং ইউনিসগুলিতে স্ট্যান্ডার্ড সি রানটাইম থ্রেডগুলি জুড়ে একটি ভাগ করা হিপ ব্যবহার করে। এর অর্থ প্রতি ম্যালোক / বিনামূল্যে লক করা।
সিম্বিয়ার উপর, উদাহরণস্বরূপ, প্রতিটি থ্রেড তার নিজস্ব গাদা দিয়ে আসে, যদিও থ্রেডগুলি কোনও হ্যাপে বরাদ্দ করা ডেটারে পয়েন্টার ভাগ করতে পারে। সিম্বিয়ান ডিজাইনটি আমার মতে আরও ভাল, কারণ এটি বরাদ্দ / ফ্রি দেওয়ার সময় লকিংয়ের প্রয়োজনীয়তা কেবল নয়, থ্রেডগুলির মধ্যে ডেটা মালিকানার পরিষ্কার স্পেসিফিকেশনকেও উত্সাহ দেয়। এছাড়াও সেই ক্ষেত্রে যখন কোনও থ্রেড মারা যায়, এটি তার সাথে বরাদ্দকৃত সমস্ত বস্তু গ্রহণ করে - যেমন এটি বরাদ্দকৃত বস্তুগুলি ফাঁস করতে পারে না, যা মেমরির সীমাবদ্ধতার সাথে মোবাইল ডিভাইসে থাকা একটি গুরুত্বপূর্ণ সম্পত্তি।
এরলং একই ধরণের নকশা অনুসরণ করে যেখানে "প্রক্রিয়া" আবর্জনা সংগ্রহের একক হিসাবে কাজ করে। সমস্ত ডেটা প্রসেসের মধ্যে অনুলিপি দ্বারা প্রেরণ করা হয়, বাইনারি ব্লবগুলি বাদে যা রেফারেন্স গণনা করা হয় (আমার মনে হয়)।
এটি "গাদা" বলার সময় আপনি কী বোঝাতে চেয়েছিলেন তা নির্ভর করে।
সমস্ত থ্রেড ঠিকানার জায়গাগুলি ভাগ করে, তাই হ্যাপ-বরাদ্দ হওয়া অবজেক্টগুলি সমস্ত থ্রেড থেকে অ্যাক্সেসযোগ্য। প্রযুক্তিগতভাবে, স্ট্যাকগুলি এই অর্থেও ভাগ করা হয়, অর্থাত্ কোনও কিছুই আপনাকে অন্য থ্রেডের স্ট্যাক অ্যাক্সেস করতে বাধা দেয় না (যদিও এটি এটি করার জন্য প্রায় কোনও অর্থই দেয় না)।
অন্যদিকে, মেমরি বরাদ্দ করতে ব্যবহৃত হিপ কাঠামো রয়েছে । সেখানেই হিপ মেমরির বরাদ্দের সমস্ত বুককিপিং করা হয়। এই কাঠামোগুলি সূক্ষ্মভাবে থ্রেডগুলির মধ্যে বিবাদ হ্রাস করার জন্য সংগঠিত হয় - যাতে কিছু থ্রেড একটি গাদা কাঠামো ভাগ করতে পারে (একটি অঙ্গন), এবং কিছু পৃথক অঙ্গন ব্যবহার করতে পারে।
বিশদটির দুর্দান্ত ব্যাখ্যার জন্য নিম্নলিখিত থ্রেডটি দেখুন: মাল্টিথ্রেডেড পরিবেশে ম্যালোক কীভাবে কাজ করে?
সাধারণত, থ্রেডগুলি গাদা এবং অন্যান্য সংস্থানগুলি ভাগ করে, তবে থ্রেডের মতো নির্মাণ রয়েছে যা না। এই থ্রেডের মতো নির্মাণগুলির মধ্যে রয়েছে এরলংয়ের লাইটওয়েট প্রক্রিয়াগুলি এবং ইউএনআইএক্সের ফুল-অন প্রক্রিয়াগুলি (একটি কল দিয়ে তৈরি করা হয়েছে fork()
)। আপনি মাল্টি-মেশিন সম্মতিতেও কাজ করতে পারেন, এই ক্ষেত্রে আপনার আন্ত-থ্রেড যোগাযোগের বিকল্পগুলি যথেষ্ট সীমিত।
সাধারণভাবে বলতে গেলে, সমস্ত থ্রেডে একই ঠিকানার স্থান ব্যবহার করা হয় এবং তাই সাধারণত কেবল একটি গাদা থাকে।
তবে এটি কিছুটা জটিল হতে পারে। আপনি থ্রেড লোকাল স্টোরেজ (টিএলএস) খুঁজছেন তবে এটি কেবল একক মান সংরক্ষণ করে।
উইন্ডোজ-নির্দিষ্ট: টিএলএস-স্পেস টিএসএলোক ব্যবহার করে বরাদ্দ করা যেতে পারে এবং টিএসএসফ্রি ( এখানে ওভারভিউ ) ব্যবহার করে মুক্ত করা যায় । আবার, এটি একটি গাদা নয়, কেবলমাত্র ডাবর্ডস।
আশ্চর্যের বিষয় হল, উইন্ডোজ প্রতিটি প্রক্রিয়াতে একাধিক হ্যাপ সমর্থন করে। কেউ হিটের হ্যান্ডেল টিএলএসে সঞ্চয় করতে পারে। তাহলে আপনার কাছে "থ্রেড-লোকাল হিপ" এর মতো কিছু থাকবে। যাইহোক, কেবল হ্যান্ডেলটি অন্য থ্রেডগুলির সাথে পরিচিত নয়, তারা এখনও পয়েন্টার ব্যবহার করে এর মেমরিটি অ্যাক্সেস করতে পারে কারণ এটি এখনও একই ঠিকানার স্থান।
সম্পাদনা : কিছু মেমোরি বরাদ্দকারী (বিশেষত ফ্রিবিএসডি- তে জেমলোক ) থ্রেডগুলিতে " আখরান " নির্ধারণের জন্য টিএলএস ব্যবহার করে। সিঙ্ক্রোনাইজেশন ওভারহেড হ্রাস করে একাধিক কোরগুলির জন্য বরাদ্দ অনুকূলিতকরণের জন্য এটি করা হয়।
ফ্রিআরটিওএস অপারেটিং সিস্টেমে, টাস্ক (থ্রেড) একই গাদা ভাগ করে নেয় তবে তাদের প্রত্যেকের নিজস্ব স্ট্যাক থাকে। লো পাওয়ার কম র্যাম আর্কিটেকচারের সাথে কাজ করার সময় এটি খুব কাজে আসে, কারণ একই মেমরির পুলটি বেশ কয়েকটি থ্রেড দ্বারা অ্যাক্সেস / ভাগ করা যায়, তবে এটি একটি ছোট ক্যাচের সাথে আসে, বিকাশকারীকে মনে রাখা উচিত যে ম্যালোক সিঙ্ক্রোনাইজ করার জন্য একটি পদ্ধতি এবং নিখরচায় প্রয়োজন হয়, এ কারণেই গাদাতে মেমরি বরাদ্দকরণ বা মুক্ত করার সময় কিছু ধরণের প্রক্রিয়া সমন্বয় / লক ব্যবহার করা প্রয়োজন, উদাহরণস্বরূপ একটি সেমফোর বা মিউটেক্স।