প্রোগ্রামিংয়ে থ্রেডগুলির যথাযথ ব্যবহারকে কী বলে?


13

আমি শুনে শুনে ক্লান্ত হয়ে পড়েছি যে লোকেরা আপনাকে প্রতি প্রসেসরের জন্য কেবল একটি থ্রেড ব্যবহার করার পরামর্শ দেয়, অন্যদিকে অনেকগুলি প্রোগ্রাম প্রসেস প্রতি 100 টি পর্যন্ত ব্যবহার করে! উদাহরণস্বরূপ কিছু সাধারণ প্রোগ্রাম নিন

vb.net ide uses about 25 thread when not debugging
System uses about 100
chrome uses about 19
Avira uses more than about 50

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


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

2
"আমাকে প্রায় প্রতিবারই মনে করিয়ে দেওয়া হচ্ছে যে আমি প্রসেসরে আরও একটি থ্রেড ব্যবহার করি না"? আপনি লিঙ্ক বা উদাহরণ পোস্ট করতে পারেন? প্রায় প্রতিবার ?
এসলট

2
"... লোকেরা আপনাকে পরামর্শ দেয় যে প্রক্রিয়া অনুযায়ী আপনার কেবল একটি থ্রেড ব্যবহার করা উচিত" " এরা কারা? সময়সূচী অন্ধকার যুগের পরে উল্লেখযোগ্যভাবে অগ্রসর হয়েছে।
রেন হেনরিচস

2
প্রক্রিয়া অনুযায়ী আপনার একাধিক ইউআই থ্রেড থাকা উচিত নয় ।
স্ল্যাक्स

3
@ বিলি ওনিল, আপনার সম্পাদনা প্রশ্নটিকে অর্থহীন করে তুলেছে
এসকে-যুক্তি

উত্তর:


22

প্রসেসরের প্রতি আপনার কেবল একটি থ্রেড ব্যবহার করা উচিত,

সম্ভবত এইচপিসিতে যেখানে আপনি সর্বাধিক বুদ্ধিমান চান - তবে অন্যথায় আমি আজ যে বোকামি শুনেছি!

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

ওয়েব সার্ভারের জন্য প্রতিটি আগত সংযোগের জন্য একটি থ্রেড চালানো যুক্তিসঙ্গত হতে পারে (যদিও খুব বেশি ভারী লোড করা সার্ভারের জন্য আরও ভাল উপায় রয়েছে)।

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


9
এখন আপনি আমাকে ভাবছেন যে মূর্খ জিনিস আপনি কখনও শুনেছেন কি!
মাইকেল কে

3
@ মিশেল - আমি আন্ডারগ্র্যাড শিখিয়েছি এবং প্রতিরক্ষা চুক্তিতে কাজ করেছি - আপনি যে মূর্খ বিষয় শুনেছি তা বিশ্বাস করবেন না!
মার্টিন বেকেট

1
আমরা কি তাদের TheDailyWTF.com এ দেখেছি?
হতাশ

আমি এখনই তাদের সত্যিই খুঁজে পাচ্ছি না, তবে এই লিঙ্কটি দেখুন social.msdn.microsoft.com/forums/en-US/vbgeneral/thread/…
স্মিথ

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

2

এক-থ্রেড-প্রতি-কোর পরামর্শটি প্রযোজ্য যখন সমান্তরাল সম্পাদনের মাধ্যমে গতি হয়।

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


1
আইও-বাউন্ড প্রসেসিং ইভেন্ট উত্স প্রতি এক থ্রেড হিসাবে করা যেতে পারে, বা একাধিক ইভেন্ট উত্স একক থ্রেডে মাল্টিপ্লেক্স করা যেতে পারে। মাল্টিপ্লেক্সড কোড সাধারণত আরও জটিল এবং আরও কার্যকর।
ডোনাল ফেলো

2

আপনি প্রতিটি গণনার জন্য একটি থ্রেড চান যা অন্যান্য গণনার তুলনায় বিভিন্ন হারে এগিয়ে যেতে পারে।

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

আই / ও বাউন্ড গণনার জন্য, আপনি সাধারণত প্রতিটি স্বতন্ত্র আই / ও "চ্যানেল" এর জন্য একটি থ্রেড চান, যেহেতু তারা বিভিন্ন হারে যোগাযোগ করে এবং থ্রেডগুলি চ্যানেলে ব্লক করা থাকে তবে অগ্রগতি করার জন্য অন্যান্য থ্রেডগুলি আটকাবে না।


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

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

1

থ্রেডগুলির জন্য থাম্বের নিয়মটি হ'ল, আপনি কমপক্ষে একটি "সক্রিয়" চান (এর কমান্ডগুলি তত্ক্ষণাত সিপিইউর সময় দিয়ে দেওয়া হবে) কম্পিউটারে প্রতিটি "এক্সিকিউশন ইউনিট" এর জন্য কর্মী থ্রেড চাই। একটি "এক্সিকিউশন ইউনিট" একটি লজিকাল ইন্সট্রাকশন প্রসেসর, তাই কোয়াড-চিপ, কোয়াড-কোর জিয়ন হাইপারথ্রেড সার্ভারের 32 ইইউ (4 চিপস, চিপ প্রতি 4 কোর, প্রতিটি হাইপারথ্রেড) থাকবে। আপনার গড় কোর i7 এর 8 হবে।

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

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

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


যদি এন থ্রেডের সংখ্যা এবং ইউটি ইউনিটের সংখ্যা হয় তবে ওপি "এন = ইউ" বিধিটিকে প্রশ্নবিদ্ধ করেছিল। আপনি এটিকে "ইউ <= এন <= 2 ইউ" নিয়মে শিথিল করছেন। আমি আরও কিছুটা এগিয়ে গিয়ে বলতে পারি যে "যুক্তিযুক্ত ছোট" ধ্রুবক (প্রোগ্রামারের কাছে পরিচিত) "এন <= সি ইউ" সি গ্রহণযোগ্য (যদি মানদণ্ড যুক্তিসঙ্গত পারফরম্যান্স দেখায়)। থ্রেডের সংখ্যাটি সম্ভাব্য সীমাহীন সংখ্যায় বাড়তে পারলে আমি খুব উদ্বিগ্ন।
5gon12eder

1

আপনার জন্য একটি থ্রেড ব্যবহার করা উচিত:

প্রতিটি প্রসেসর আপনার ব্যস্ত রাখা প্রয়োজন।

প্রতিটি I / O আপনি কার্যকরভাবে একযোগে দুলতে পারেন যে আপনি কোনও অবরুদ্ধকরণ উপায়ে পারফর্ম করতে পারবেন না। (উদাহরণস্বরূপ, স্থানীয় ডিস্ক থেকে পড়া))

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

পৃষ্ঠার ত্রুটিগুলির মতো অপ্রত্যাশিত অবরুদ্ধ থেকে রক্ষা পেতে আরও কয়েকটি অতিরিক্ত।

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

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


0

আপনি কোনও একক প্রোগ্রামের জন্য মাল্টিকোর \ মাল্টিপ্রসেসর সিস্টেমের সক্ষমতা অর্জনের জন্য প্রক্রিয়া এবং থ্রেডগুলি স্প্যান করতে পারেন যার ক্ষেত্রে আপনি আরও থ্রেড \ প্রক্রিয়াগুলি পরে কোরে কোনও লাভ না পেয়ে (কমপক্ষে একক প্রোগ্রামের জন্য) লাভ করতে পারেন।

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


0

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

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

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