থ্রেডগুলির একটি পৃথক গাদা আছে?


114

যতদূর আমি জানি প্রতিটি থ্রেড অপারেটিং সিস্টেম দ্বারা থ্রেড তৈরি করা হলে একটি পৃথক স্ট্যাক পেয়ে যায়। আমি ভাবছি যদি প্রতিটি থ্রেডের নিজেরও আলাদা গাদা থাকে?


হ্যাঁ, উইন্ডোজ এবং লিনাক্স, সি লাইব্রেরি

3
খুশী হলাম। এই মৌলিক প্রশ্নগুলি +1 রাখুন।

উত্তর:


128

না। সমস্ত থ্রেড একটি সাধারণ গাদা ভাগ।

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

যেহেতু সমস্ত থ্রেড একই গাদা ভাগ করে নেয়, বরাদ্দকারী / ডিএলোকেটরের অ্যাক্সেস অবশ্যই সিঙ্ক্রোনাইজ করতে হবে। বরাদ্দ বিতর্ক এড়ানোর জন্য বিভিন্ন পদ্ধতি এবং গ্রন্থাগার রয়েছে ।

কিছু ভাষাগুলি আপনাকে মেমরির ব্যক্তিগত পুল বা পৃথক স্তূপ তৈরি করতে দেয় যা আপনি একক থ্রেডে নির্ধারণ করতে পারেন।


5
সাধারণত থ্রেডগুলি মেমোরির মতো সংস্থানগুলি ভাগ করে, তাই কোনও নন-ব্রিনডিড থ্রেড বাস্তবায়ন হিপ ভাগ করে দেয়।
আর মার্টিনহো ফার্নান্দিস

10
প্রধান কারণ প্রতিটি থ্রেড নিজস্ব স্ট্যাকের আছে থ্রেড আসলে কিছু (কলের মত একটি ফাংশন) কি করতে পারেন তাই হয় ...
এডমন্ড

3
প্রতিটি থ্রেডের আলাদা স্ট্যাক থাকে তবে এটি 'ব্যক্তিগত' নয় necess অন্যান্য থ্রেডগুলি সাধারণত এটি অ্যাক্সেস করার অনুমতি দেওয়া হয়।
zch

you will get a stack overflow.স্ট্যাক ওভারফ্লোতে একটি স্ট্যাক ওভারফ্লো!
জন স্ট্রুড

2
@ ক্রিস্রন প্রতিটি থ্রেডের জন্য পৃথক স্তূপ স্থাপন করা সম্ভব, তবে আপনি যদি ডিফল্ট ভাগ করা হিপ ব্যবহার না করে এটি করেন তবে উদাহরণস্বরূপ থ্রেড এ এর ​​পক্ষে একটি বাফার বরাদ্দ করা, ডেটা পূরণ করা, বি থ্রেডে পাস করা শক্ত হয়ে যায় , এবং থ্রেড বি ডেটা ব্যবহার করুন এবং তারপরে বাফারটি মুক্ত করুন (কারণ থ্রেড বি থ্রেড এ এর ​​হিপগুলিতে অ্যাক্সেস পায় না, থ্রেড বি বাফারকে মুক্ত করতে পারে না; সেরা থ্রেড বি করতে পারে সেরা থ্রেড বি বাফারটিকে থ্রেডে ফেরত পাঠাতে হবে A আবার এবং থ্রেড এটি একটি মুক্ত করুন)।
জেরেমি ফ্রাইজনার

9

ডিফল্টরূপে সি এর কেবল একটি একক স্তূপ রয়েছে।

এটি বলেছে, কিছু বরাদ্দকারী যা থ্রেড সচেতন সেগুলি হিপটি ভাগ করবে যাতে প্রতিটি থ্রেড থেকে বরাদ্দ দেওয়ার নিজস্ব অঞ্চল থাকে। ধারণাটি হ'ল এটি হ্যাপ স্কেল আরও ভাল করা উচিত।

এ জাতীয় স্তূপের একটি উদাহরণ হর্ড


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

এমনকি যদি বিভিন্ন থ্রেডের গাদা থেকে বরাদ্দ করার জন্য বিভিন্ন অঞ্চল থাকে, তারা এখনও অন্য থ্রেড দ্বারা বরাদ্দকৃত ডেটা দেখতে পারে, সুতরাং থ্রেডগুলি এখনও একই গাদা ভাগ করে।
কেন ব্লুম

1
আপডেট: সি ++ 11 থ্রেড হিসাবে আর বাস্তবায়ন সংজ্ঞায়িত করা হয় না।
মাইকেল ডারস্ট

5

ওএসের উপর নির্ভর করে। উইন্ডোজ এবং ইউনিসগুলিতে স্ট্যান্ডার্ড সি রানটাইম থ্রেডগুলি জুড়ে একটি ভাগ করা হিপ ব্যবহার করে। এর অর্থ প্রতি ম্যালোক / বিনামূল্যে লক করা।

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

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


3

প্রতিটি থ্রেডের নিজস্ব স্ট্যাক এবং কল স্ট্যাক রয়েছে।

প্রতিটি থ্রেড একই গাদা ভাগ করে দেয়।


3

এটি "গাদা" বলার সময় আপনি কী বোঝাতে চেয়েছিলেন তা নির্ভর করে।

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

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


1

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


আমি ভেবেছিলাম কাঁটাচামচ একটি নতুন প্রক্রিয়া তৈরির মতো যা কেবল নতুন মেমরির স্থানে ডেটা অনুলিপি করে।
জেসন থলস্ট্রুপ

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

1

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

তবে এটি কিছুটা জটিল হতে পারে। আপনি থ্রেড লোকাল স্টোরেজ (টিএলএস) খুঁজছেন তবে এটি কেবল একক মান সংরক্ষণ করে।

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

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

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


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

1

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

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