আমি ভেবেছিলাম একটি মাল্টি-কোর কম্পিউটারের বিষয়টি হ'ল এটি একই সাথে একাধিক থ্রেড চালাতে পারে। সেক্ষেত্রে আপনার যদি কোয়াড-কোর মেশিন থাকে তবে এক সাথে 4 টিরও বেশি থ্রেড চলমান কী? তারা কি একে অপরের কাছ থেকে কেবল সময় (সিপিইউ রিসোর্স) চুরি করবে না?
আমি ভেবেছিলাম একটি মাল্টি-কোর কম্পিউটারের বিষয়টি হ'ল এটি একই সাথে একাধিক থ্রেড চালাতে পারে। সেক্ষেত্রে আপনার যদি কোয়াড-কোর মেশিন থাকে তবে এক সাথে 4 টিরও বেশি থ্রেড চলমান কী? তারা কি একে অপরের কাছ থেকে কেবল সময় (সিপিইউ রিসোর্স) চুরি করবে না?
উত্তর:
উত্তরটি থ্রেডের উদ্দেশ্যকে কেন্দ্র করে ঘুরছে, যা সমান্তরালতা: একবারে কার্যকর করার জন্য পৃথক পৃথক লাইন চালানো। একটি 'আদর্শ' সিস্টেমে, আপনার প্রতি কোরে একটি থ্রেড এক্সিকিউট করা থাকবে: কোনও বাধা নেই। বাস্তবে বিষয়টি তেমন নয়। আপনার কাছে চারটি কোর এবং চারটি কার্যকারী থ্রেড থাকলেও আপনার প্রক্রিয়া এবং এটির থ্রেডগুলি ক্রমাগত অন্যান্য প্রক্রিয়া এবং থ্রেডের জন্য স্যুইচ করা হবে। আপনি যদি কোনও আধুনিক ওএস চালাচ্ছেন তবে প্রতিটি প্রক্রিয়াটিতে কমপক্ষে একটি থ্রেড থাকে এবং অনেকের আরও থাকে। এই সমস্ত প্রক্রিয়া একবারে চলছে। আপনার এখন সম্ভবত আপনার মেশিনে কয়েকটি শতাধিক থ্রেড চলছে। আপনি কোনও পরিস্থিতি পাবেন না যেখানে কোনও থ্রেড সময় না নিয়েই চালিত হয়। (ভাল, আপনি যদি এটি রিয়েল-টাইম চলমান থাকে, যদি আপনি রিয়েলটাইম ওএস ব্যবহার করেন বা এমনকি উইন্ডোতে, রিয়েল-টাইম থ্রেড অগ্রাধিকার ব্যবহার করুন। তবে এটি বিরল।)
ব্যাকগ্রাউন্ড হিসাবে, উত্তর: হ্যাঁ, একটি সত্য চার-কোর মেশিনে চারটির বেশি থ্রেড আপনাকে এমন পরিস্থিতি দিতে পারে যেখানে তারা 'একে অপরের কাছ থেকে সময় চুরি করে' তবে কেবল প্রতিটি স্বতন্ত্র থ্রেডের জন্য 100% সিপিইউ প্রয়োজন । যদি কোনও থ্রেড 100% কাজ করে না (যেমন কোনও ইউআই থ্রেড নাও হতে পারে, বা একটি থ্রেড অল্প পরিমাণে কাজ করছে বা অন্য কোনও কিছুর জন্য অপেক্ষা করছে) তবে নির্ধারিত অন্য থ্রেডটি আসলে একটি ভাল পরিস্থিতি।
এটি আসলে এর চেয়ে আরও জটিল:
আপনার যদি পাঁচটি বিট কাজ থাকে যা সমস্ত একবারে করা দরকার? এগুলির চারটি চালানো এবং তারপরে পঞ্চমটি চালানোর চেয়ে একবারে এগুলি চালানো আরও বেশি অর্থবোধ করে।
কোনও থ্রেডের পক্ষে সত্যিকারের 100% সিপিইউ প্রয়োজন এটি বিরল। এই মুহুর্তে এটি ডিস্ক বা নেটওয়ার্ক I / O ব্যবহার করে, উদাহরণস্বরূপ, এটি কার্যকরভাবে কিছুই না করার জন্য অপেক্ষা করতে ব্যয় হতে পারে। এটি একটি খুব সাধারণ পরিস্থিতি।
আপনার যদি চালানো দরকার এমন কাজ করে থাকেন তবে একটি সাধারণ প্রক্রিয়া হ'ল থ্রেডপুল ব্যবহার করা। এটি কোর হিসাবে একই সংখ্যক থ্রেড থাকা বোধগম্য হতে পারে, তবুও । নেট থ্রেডপুলটিতে প্রসেসরের প্রতি 250 টি পর্যন্ত থ্রেড পাওয়া যায় । তারা কেন এটি করে তা আমি নিশ্চিত নই, তবে আমার অনুমানটি থ্রেডগুলিতে চালানোর জন্য যে কাজগুলি দেওয়া হয় তার আকারের সাথে করা।
সুতরাং: চুরির সময় কোনও খারাপ জিনিস নয় (এবং আসলে চুরি নয়, হয়: এটি সিস্টেমের কাজ করার কথা supposed) থ্রেডগুলি যে ধরণের কাজ করবে তার উপর ভিত্তি করে আপনার মাল্টিথ্রেডেড প্রোগ্রামগুলি লিখুন, যা সিপিইউ নাও হতে পারে -আবদ্ধ. প্রোফাইলিং এবং পরিমাপের উপর ভিত্তি করে আপনার প্রয়োজনীয় থ্রেডগুলির সংখ্যা নির্ধারণ করুন। আপনি থ্রেডগুলির চেয়ে কাজের বা কাজের ক্ষেত্রে চিন্তা করা আরও দরকারী মনে করতে পারেন: কাজের জিনিস লিখুন এবং চালনার জন্য একটি পুলকে দিন। অবশেষে, যদি না আপনার প্রোগ্রামটি সত্যই পারফরম্যান্স-সমালোচনা না করে, খুব বেশি চিন্তা করবেন না :)
কোনও থ্রেড বিদ্যমান থাকার অর্থ সর্বদা এটি সক্রিয়ভাবে চলমান নয়। থ্রেডগুলির অনেকগুলি অ্যাপ্লিকেশন কিছু থ্রেডগুলিকে ঘুমানোর সময় জড়িত থাকে যতক্ষণ না তাদের কিছু করার সময় আসে - উদাহরণস্বরূপ, ব্যবহারকারী ইনপুট থ্রেডকে জাগ্রত করতে, কিছু প্রক্রিয়াজাতকরণ করতে এবং ঘুমাতে ফিরে যেতে।
মূলত, থ্রেডগুলি পৃথক কাজ যা একে অপরের থেকে স্বাধীনভাবে পরিচালনা করতে পারে, অন্য কোনও কাজের অগ্রগতি সম্পর্কে সচেতন হওয়ার দরকার নেই। আপনার একসাথে চালানোর ক্ষমতা থাকার চেয়ে এগুলির আরও কিছু পাওয়া সম্ভব; এমনকি তারা কখনও কখনও একে অপরের পিছনে লাইনে অপেক্ষা করতে হয় এমনকি সুবিধার জন্য এখনও দরকারী।
মুল বক্তব্যটি হ'ল, থ্রেডের গণনা মূল গণনা ছাড়িয়ে গেলে কোনও বাস্তব গতিবেগ না পেয়েও আপনি থ্রেড যুক্তির টুকরো টুকরো টুকরো টানতে পারেন যা পরস্পরের উপর নির্ভরশীল হওয়া উচিত নয়।
এমনকি একটি মাঝারি জটিল অ্যাপ্লিকেশনটিতে, একটি একক থ্রেড ব্যবহার করে সবকিছু করার চেষ্টা করুন আপনার কোডটির 'প্রবাহ' হ্যাশ করে তোলে। একক থ্রেড তার বেশিরভাগ সময় এটির পোলিংয়ে ব্যয় করে, এটি যাচাই করে শর্তাধীন প্রয়োজন হিসাবে রুটিনগুলি কল করে, এবং এটি মিনিটমিয়ার মনোবল ব্যতীত আর কিছু দেখতে পাওয়া শক্ত হয়ে যায়।
কেসগুলির ক্ষেত্রে থ্রেডগুলি উত্সর্গ করতে পারেন এমন ক্ষেত্রে এর সাথে বৈসাদৃশ্য করুন যাতে কোনও পৃথক থ্রেড দেখে আপনি দেখতে পারেন যে থ্রেডটি কী করছে। উদাহরণস্বরূপ, একটি থ্রেড কোনও সকেট থেকে ইনপুটটির অপেক্ষায় অবরুদ্ধ হতে পারে, স্ট্রিমটিকে বার্তাগুলিতে, ফিল্টার বার্তাগুলিতে পার্স করতে পারে এবং যখন কোনও বৈধ বার্তা আসে তখন এটিকে অন্য কোনও কর্মী থ্রেডে ছেড়ে দেয়। শ্রমিক থ্রেড অন্যান্য সংখ্যার উত্স থেকে ইনপুটগুলিতে কাজ করতে পারে। এগুলির প্রত্যেকটির কোড একটি পরিষ্কার, উদ্দেশ্যমূলক প্রবাহ প্রদর্শন করবে, স্পষ্ট করে যাচাই করে না করে যে আর কিছু করার নেই।
কাজটিকে এভাবে বিভাজন করা আপনার অ্যাপ্লিকেশনটিকে অপারেটিং সিস্টেমের উপর নির্ভর করে সিপিইউতে পরবর্তী কী করবেন তা নির্ধারণ করার অনুমতি দেয়, তাই আপনাকে কীভাবে বাধা দিতে পারে এবং কী কী প্রক্রিয়া করার জন্য প্রস্তুত তা আপনার অ্যাপ্লিকেশনটিতে সর্বত্র স্পষ্ট শর্তাধীন চেক করতে হবে না।
যদি কোনও থ্রেড কোনও সংস্থার জন্য অপেক্ষা করে (যেমন কোনও রেজিস্টারে র্যাম থেকে কোনও মান লোড করা, ডিস্ক আই / ও, নেটওয়ার্ক অ্যাক্সেস, একটি নতুন প্রক্রিয়া চালু করা, একটি ডাটাবেস জিজ্ঞাসা করা, বা ব্যবহারকারীর ইনপুটের জন্য অপেক্ষা করা) বিভিন্ন থ্রেড এবং একবার রিসোর্স উপলভ্য হওয়ার পরে প্রথম থ্রেডে ফিরে আসুন। এটি সিপিইউ অলস সময় ব্যয় করার সময় কমায়, কারণ সিপিইউ অলস হয়ে বসে থাকার পরিবর্তে লক্ষ লক্ষ ক্রিয়াকলাপ করতে পারে।
একটি থ্রেড বিবেচনা করুন যা হার্ড ড্রাইভের বাইরে ডেটা পড়তে হবে। 2014 সালে, একটি সাধারণ প্রসেসর কোর 2.5 গিগাহার্টজ এ পরিচালনা করে এবং চক্র প্রতি 4 টি নির্দেশাবলী কার্যকর করতে সক্ষম হতে পারে। 0.4 এনএস এর চক্র সময়ের সাথে, প্রসেসর প্রতি ন্যানোসেকেন্ডে 10 নির্দেশাবলী কার্যকর করতে পারে। সাধারণ যান্ত্রিক হার্ড ড্রাইভের সন্ধানের সময়গুলি প্রায় 10 মিলিসেকেন্ডের মধ্যে রয়েছে, প্রসেসর হার্ড ড্রাইভ থেকে কোনও মান পড়তে সময় লাগে 100 মিলিয়ন নির্দেশাবলী কার্যকর করতে সক্ষম। একটি ছোট ক্যাশে (4 এমবি বাফার) এবং হাইব্রিড ড্রাইভগুলি কয়েক গিগাবাইট স্টোরেজ সহ হার্ড ড্রাইভের সাথে উল্লেখযোগ্য পারফরম্যান্সের উন্নতি হতে পারে, কারণ হাইব্রিড বিভাগ থেকে সিক্যুয়ালি পাঠ বা পড়ার জন্য ডেটা ল্যাটেন্সি দ্রুততার কয়েকটি আদেশ হতে পারে।
একটি প্রসেসরের কোর থ্রেডগুলির মধ্যে স্যুইচ করতে পারে (থ্রেড থামিয়ে দিতে এবং পুনরায় শুরু করার জন্য মূল্য প্রায় 100 টি ঘড়ির চক্র হয়) যখন প্রথম থ্রেড একটি উচ্চ বিলম্বিত ইনপুটটির জন্য অপেক্ষা করে (রেজিস্টারগুলির চেয়ে আরও ব্যয়বহুল কিছু (1 ঘড়ি) এবং র্যাম (5 ন্যানোসেকেন্ড)) এর মধ্যে রয়েছে ডিস্ক আই / ও, নেটওয়ার্ক অ্যাক্সেস (250 মাইলের বিলম্ব), একটি সিডি বা একটি স্লো বাস থেকে ডেটা পড়া, বা একটি ডেটাবেস কল। কোরের চেয়ে বেশি থ্রেড থাকার অর্থ উচ্চ-বিলম্বিত কাজগুলি সমাধান করার সময় দরকারী কাজ করা যায়।
সিপিইউতে একটি থ্রেড শিডিয়ুলার রয়েছে যা প্রতিটি থ্রেডকে অগ্রাধিকার দেয় এবং একটি থ্রেডকে ঘুমাতে দেয়, তারপরে একটি পূর্বনির্ধারিত সময়ের পরে পুনরায় শুরু হয়। থ্রেশিং হ্রাস করা থ্রেড শিডিয়ুলারের কাজ, যা যদি প্রতিটি থ্রেডকে আবার ঘুমানোর আগে মাত্র 100 টি নির্দেশাবলী কার্যকর করা হয়। থ্রেডগুলির স্যুইচিংয়ের ওভারহেড প্রসেসরের কোরটির মোট দরকারী থ্রুপুট হ্রাস করবে।
এই কারণে, আপনি আপনার সমস্যাটি যুক্তিসঙ্গত থ্রেডে বিভক্ত করতে চাইতে পারেন। আপনি যদি ম্যাট্রিক্স গুণন করতে কোড লিখছেন, আউটপুট ম্যাট্রিক্সে প্রতি সেল প্রতি এক থ্রেড তৈরি করা অতিরিক্ত হতে পারে, তবে আউটপুট ম্যাট্রিক্সে সারি প্রতি অথবা থ্রি এন প্রতি সারিতে একটি থ্রেড থ্রেড তৈরি, বিরতি দেওয়া এবং পুনরায় শুরু করার ওভারহেড ব্যয় হ্রাস করতে পারে।
এই কারণেই শাখার পূর্বাভাস গুরুত্বপূর্ণ। আপনার যদি একটি যদি বিবৃতি থাকে যা র্যাম থেকে মান লোড করা প্রয়োজন তবে যদি এর বিবৃতিতে ইতিমধ্যে রেজিস্টারগুলিতে লোড হওয়া মানগুলি ব্যবহার করা হয় তবে শর্তটি মূল্যায়নের আগে প্রসেসর একটি বা উভয় শাখা চালিয়ে যেতে পারে। শর্তটি ফিরে আসার পরে, প্রসেসর সংশ্লিষ্ট শাখার ফলাফল প্রয়োগ করবে এবং অন্যটি বাতিল করবে। এখানে সম্ভাব্য অকেজো কাজ সম্পাদন করা সম্ভবত অন্য কোনও থ্রেডে স্যুইচ করার চেয়ে ভাল, যা থ্র্যাশিংয়ের দিকে নিয়ে যেতে পারে।
যেহেতু আমরা হাই ক্লক-স্পিড সিঙ্গল-কোর প্রসেসরগুলি থেকে মাল্টি-কোর প্রসেসরের দিকে সরিয়েছি, চিপ ডিজাইনটি মরে প্রতি বেশি কোর ক্র্যামিংয়ের দিকে মনোনিবেশ করেছে, কোরগুলির মধ্যে অন-চিপ রিসোর্স ভাগ করে নেওয়া, আরও ভাল শাখার পূর্বাভাস অ্যালগরিদমগুলি, আরও ভাল থ্রেড ওভারহেড পরিবর্তন করে, এবং আরও ভাল থ্রেড সময়সূচী।
উপরোক্ত উত্তরগুলির বেশিরভাগই কর্মক্ষমতা এবং একযোগে পরিচালনার বিষয়ে কথা বলে। আমি একটি ভিন্ন কোণ থেকে এটি যোগাযোগ করতে যাচ্ছি।
আসুন, একটি সরল টার্মিনাল এমুলেশন প্রোগ্রামের ক্ষেত্রে ধরা যাক। আপনাকে নিম্নলিখিত জিনিসগুলি করতে হবে:
(রিয়েল টার্মিনাল এমুলেটরগুলি আপনার প্রদর্শন প্রকারের পাশাপাশি প্রতিপাদ্য সামগ্রীর প্রতিধ্বনি সহ আরও অনেক কিছু করে, তবে আমরা এখনই এটি পেরিয়ে যাব))
নিম্নলিখিত সিউডোকোড অনুসারে দূরবর্তী থেকে পড়ার লুপটি এখন সহজ is
while get-character-from-remote:
print-to-screen character
কীবোর্ড নিরীক্ষণ এবং প্রেরণের জন্য লুপটিও সহজ:
while get-character-from-keyboard:
send-to-remote character
তবে সমস্যাটি হ'ল আপনাকে একসাথে এটি করতে হবে। কোডটি এখন আপনার আরও থ্রেডিং না থাকলে আরও দেখতে এটি দেখতে হবে:
loop:
check-for-remote-character
if remote-character-is-ready:
print-to-screen character
check-for-keyboard-entry
if keyboard-is-ready:
send-to-remote character
যুক্তি, এমনকি এই ইচ্ছাকৃতভাবে সরল উদাহরণেও যে যোগাযোগের বাস্তব-জগত জটিলতা বিবেচনা করে না, যথেষ্ট অস্পষ্ট। থ্রেডিংয়ের সাহায্যে, এমনকি একটি একক কোরতেও দুটি সিউডোকোড লুপগুলি তাদের যুক্তিবিহীন অন্তর্ভুক্ত না করে স্বাধীনভাবে থাকতে পারে can যেহেতু উভয় থ্রেডই বেশিরভাগ আই / ও-আবদ্ধ হবে, তারা সিপিইউতে কোনও ভারী বোঝা চাপায় না, যদিও তারা কঠোরভাবে বলছে, ইন্টিগ্রেটেড লুপের চেয়ে সিপিইউ সংস্থানগুলির বেশি অপচয় হবে।
এখন অবশ্যই বাস্তব-বিশ্বের ব্যবহার উপরের তুলনায় আরও জটিল। আপনি অ্যাপ্লিকেশনটিতে আরও উদ্বেগ যোগ করার সাথে সাথে সংহত লুপের জটিলতা তাত্পর্যপূর্ণভাবে বেড়ে যায়। যুক্তিটি আরও বিভক্ত হয়ে যায় এবং জিনিসগুলি পরিচালনযোগ্য করার জন্য আপনাকে স্টেট মেশিন, করোটিনস এবং এট আল জাতীয় কৌশল ব্যবহার করতে হবে। ব্যবস্থাপনযোগ্য তবে পাঠযোগ্য নয়। থ্রেডিং কোডটি আরও পঠনযোগ্য করে রাখে।
তাহলে আপনি থ্রেডিং কেন ব্যবহার করবেন না?
ঠিক আছে, যদি আপনার কাজগুলি I / O-बाন্ডের পরিবর্তে সিপিইউ-আবদ্ধ হয়, থ্রেডিং আসলে আপনার সিস্টেমকে ধীর করে দেয়। পারফরম্যান্স ক্ষতিগ্রস্থ হবে। অনেক, অনেক ক্ষেত্রে। ("থ্র্যাশিং" একটি সাধারণ সমস্যা যদি আপনি খুব বেশি সিপিইউ-ভিত্তিক থ্রেড ফেলে দেন তবে আপনি নিজেরাই থ্রেডের বিষয়বস্তুগুলি চালানোর চেয়ে সক্রিয় থ্রেডগুলি পরিবর্তন করতে বেশি সময় ব্যয় করতে পারেন না) এছাড়াও, উপরের যুক্তিগুলির অন্যতম কারণ এত সহজ যে আমি খুব ইচ্ছাকৃতভাবে একটি সরল (এবং অবাস্তব) উদাহরণ বেছে নিয়েছি। আপনি যদি স্ক্রিনে টাইপ করা হয়েছে তা যদি প্রতিধ্বনিত করতে চান তবে আপনি ভাগ করে নেওয়া সংস্থানগুলি লকিংয়ের সাথে পরিচিত হওয়ার সাথে সাথে আপনি আঘাতের একটি নতুন জগত পেয়েছেন। শুধুমাত্র একটি ভাগ করা সংস্থান সহ এটি এতটা সমস্যা নয়, তবে আপনার ভাগ করার আরও সংস্থান রয়েছে বলে এটি আরও বড় এবং বড় সমস্যায় পরিণত হতে শুরু করে।
সুতরাং শেষ পর্যন্ত থ্রেডিং অনেকগুলি বিষয়। উদাহরণস্বরূপ, এটি আই / ও-বাউন্ড প্রক্রিয়াগুলিকে আরও প্রতিক্রিয়াশীল করার বিষয়ে (যদিও সামগ্রিকভাবে কম দক্ষ এমনকি) কিছু ইতিমধ্যে বলেছে। এটি লজিককে অনুসরণ করা আরও সহজ করার বিষয়ে (তবে আপনি যদি ভাগ করা রাষ্ট্রকে ছোট করেন তবেই)। এটি প্রচুর পরিমাণে স্টাফ এবং প্রায়শই সিদ্ধান্ত নিতে হবে যদি কেস ভিত্তিতে এর সুবিধাগুলি তার অসুবিধাগুলি অতিক্রম করে।
যদিও আপনি আপনার হার্ডওয়ারের উপর নির্ভর করে গণনার গতি বাড়ানোর জন্য অবশ্যই থ্রেডগুলি ব্যবহার করতে পারেন, তার অন্যতম প্রধান ব্যবহার হ'ল ব্যবহারকারী-বন্ধুত্বের কারণে একযোগে একাধিক জিনিস করা।
উদাহরণস্বরূপ, যদি আপনাকে ব্যাকগ্রাউন্ডে কিছু প্রসেসিং করতে হয় এবং ইউআই ইনপুটটিতে প্রতিক্রিয়াশীল থাকে তবে আপনি থ্রেড ব্যবহার করতে পারেন। থ্রেড ব্যতীত, আপনি যখন কোনও ভারী প্রক্রিয়াকরণ করার চেষ্টা করেছিলেন তখন ব্যবহারকারী ইন্টারফেসটি স্তব্ধ হয়ে যায়।
এই সম্পর্কিত প্রশ্নটিও দেখুন: থ্রেডের জন্য ব্যবহারিক ব্যবহারগুলি
আমি @ কিরিয়ুর এই দৃ with়তার সাথে দৃ strongly়ভাবে একমত নই যে আদর্শ নম্বরটি সিপিইউতে একটি থ্রেড।
এটি এইভাবে চিন্তা করুন: আমাদের কেন মাল্টি-প্রসেসিং অপারেটিং সিস্টেম রয়েছে? বেশিরভাগ কম্পিউটার ইতিহাসের জন্য, প্রায় সমস্ত কম্পিউটারের একটি সিপিইউ ছিল। তবুও 1960 এর দশক থেকে সমস্ত "আসল" কম্পিউটারে মাল্টি-প্রসেসিং (ওরফে মাল্টি-টাস্কিং) অপারেটিং সিস্টেম ছিল।
আপনি একাধিক প্রোগ্রাম চালান যাতে কোনও চলতে পারে তবে অন্যরা আইওর মতো জিনিসগুলির জন্য অবরুদ্ধ থাকে।
এনটি-র আগে উইন্ডোজ সংস্করণগুলি মাল্টি-টাস্কিং ছিল কিনা সে সম্পর্কে আর্গুমেন্টগুলি আলাদা করে রাখুন lets সেই থেকে প্রতিটি আসল ওএসের মাল্টি-টাস্কিং ছিল। কিছু এটি ব্যবহারকারীর কাছে প্রকাশ করে না, তবে এটি সেখানে রয়েছে, সেলফোন রেডিও শুনতে, জিপিএস চিপের সাথে কথা বলা, মাউস ইনপুট গ্রহণ করা ইত্যাদি things
থ্রেডগুলি কেবল এমন কাজ যা কিছুটা দক্ষ efficient কোনও কার্য, প্রক্রিয়া এবং থ্রেডের মধ্যে কোনও মৌলিক পার্থক্য নেই।
একটি সিপিইউ হ'ল নষ্ট করার মতো ভয়ঙ্কর জিনিস, তাই যখন আপনি পারেন তখন এটি ব্যবহারের জন্য প্রচুর পরিমাণে প্রস্তুত।
আমি সম্মত হব যে বেশিরভাগ প্রক্রিয়াগত ভাষা, সি, সি ++, জাভা ইত্যাদি সহ সঠিক থ্রেডের নিরাপদ কোড লেখা অনেক কাজ is আজ বাজারে core টি মূল সিপিইউ রয়েছে এবং ১ core টি মূল সিপিইউ খুব বেশি দূরে নয়, আমি প্রত্যাশা করি যে এই পুরানো ভাষাগুলি থেকে লোকেরা দূরে সরে যাবে, কারণ মাল্টি-থ্রেডিং আরও একটি জটিল প্রয়োজন।
@ ক্যারিওর সাথে মতবিরোধ কেবল আইএমএইচও, বাকিটি সত্য।
এমন কোনও ওয়েব সার্ভারের কল্পনা করুন যা একটি নির্বিচার সংখ্যক অনুরোধগুলি সরবরাহ করতে পারে। আপনাকে অনুরোধগুলি সমান্তরালভাবে পরিবেশন করতে হবে কারণ অন্যথায় প্রতিটি নতুন অনুরোধ অন্য সমস্ত অনুরোধগুলি শেষ না হওয়া পর্যন্ত অপেক্ষা করতে হবে (ইন্টারনেটে প্রতিক্রিয়া প্রেরণ সহ)। এই ক্ষেত্রে, বেশিরভাগ ওয়েব সার্ভারগুলিতে তারা সাধারণত যেভাবে অনুরোধ করে তার চেয়ে কম কম কোর থাকে।
এটি সার্ভারের বিকাশকারীদের পক্ষেও সহজ করে তোলে: আপনাকে কেবল একটি থ্রেড প্রোগ্রাম লিখতে হবে যা একটি অনুরোধ পরিবেশন করে, একাধিক অনুরোধগুলি সংরক্ষণ করার বিষয়ে, আপনার সেটির ক্রমটি অর্ডার করার বিষয়ে আপনাকে ভাবতে হবে না।
অনেক থ্রেড ঘুমিয়ে থাকবে, ব্যবহারকারীর ইনপুট, I / O এবং অন্যান্য ইভেন্টের জন্য অপেক্ষা করছে।
থ্রেডগুলি ইউআই অ্যাপ্লিকেশনগুলিতে প্রতিক্রিয়া জানাতে সহায়তা করতে পারে। অতিরিক্তভাবে, আপনি আপনার কোর থেকে আরও কাজ করতে থ্রেড ব্যবহার করতে পারেন। উদাহরণস্বরূপ, একটি একক কোরতে, আপনার কাছে একটি থ্রেড আইও করছে এবং অন্যটি কিছু গণনা করছে। যদি এটি একক থ্রেডযুক্ত হয় তবে মূলটি আইও সম্পূর্ণ হওয়ার অপেক্ষায় মূলত অলস হতে পারে। এটি একটি সুন্দর উচ্চ স্তরের উদাহরণ, তবে থ্রেডগুলি অবশ্যই আপনার সিপুকে কিছুটা শক্ত করে পাউন্ড করার জন্য ব্যবহার করা যেতে পারে।
একটি প্রসেসর বা সিপিইউ হ'ল ফিজিকাল চিপ যা সিস্টেমে প্লাগ হয়। একটি প্রসেসরের একাধিক কোর থাকতে পারে (একটি কোর হ'ল চিপের অংশ যা নির্দেশাবলী কার্যকর করতে সক্ষম হয়)। একটি কোর অপারেটিং সিস্টেমে একাধিক ভার্চুয়াল প্রসেসর হিসাবে উপস্থিত হতে পারে যদি এটি একসাথে একাধিক থ্রেড চালাতে সক্ষম হয় (একটি থ্রেড নির্দেশাবলীর একক ক্রম)।
একটি প্রক্রিয়া একটি অ্যাপ্লিকেশন জন্য অন্য নাম। সাধারণত, প্রক্রিয়া একে অপরের থেকে পৃথক। যদি একটি প্রক্রিয়া মারা যায়, তবে এটি অন্য প্রক্রিয়াটিকেও মরে যায় না। প্রক্রিয়াগুলি যোগাযোগ করা বা মেমরি বা I / O এর মতো সংস্থানগুলি ভাগ করে নেওয়া সম্ভব।
প্রতিটি প্রক্রিয়া পৃথক ঠিকানার স্থান এবং স্ট্যাক আছে। একটি প্রক্রিয়াতে একাধিক থ্রেড থাকতে পারে, প্রত্যেকে একই সাথে নির্দেশনা কার্যকর করতে সক্ষম। প্রক্রিয়াটির সমস্ত থ্রেড একই ঠিকানা স্থান ভাগ করে দেয় তবে প্রতিটি থ্রেডের নিজস্ব স্ট্যাক থাকবে have
আশা করি এই সংজ্ঞাগুলি এবং এই মূলসূত্রগুলি ব্যবহার করে আরও গবেষণা আপনার বুঝতে সহায়তা করবে।
থ্রেডগুলির আদর্শ ব্যবহার হ'ল প্রকৃতপক্ষে প্রতি এক।
তবে, আপনি যদি একচেটিয়াভাবে অ্যাসিঙ্ক্রোনাস / অ-ব্লকিং আইও ব্যবহার না করেন, তবে আপনার সিপিইউ ব্যবহার করবে না এমন এক পর্যায়ে আইওতে থ্রেড ব্লক হয়ে যাওয়ার সম্ভাবনা রয়েছে।
এছাড়াও, সাধারণ প্রোগ্রামিং ল্যাঙ্গুয়েজগুলি সিপিইউতে 1 টি থ্রেড ব্যবহার করা কিছুটা কঠিন করে তোলে। কনক্যুরেন্সির চারপাশে ডিজাইন করা ভাষা (যেমন এরলং) অতিরিক্ত থ্রেড ব্যবহার না করা সহজ করে তুলতে পারে।
কিছু এপিআই যেভাবে ডিজাইন করা হয়েছে, তাদের আলাদা থ্রেডে (ব্লকিং অপারেশন সহ যে কোনও কিছু) চালানো ছাড়া আপনার আর কোনও উপায় নেই । একটি উদাহরণ পাইথনের এইচটিটিপি লাইব্রেরি (এএফআইকে) হবে।
সাধারণত এটি যদিও খুব বেশি সমস্যা হয় না (এটি যদি সমস্যা হয় তবে ওএস বা এপিআইয়ের বিকল্প অ্যাসিনক্রোনাস অপারেটিং মোড, অর্থাৎ select(2)
:) দিয়ে জাহাজ নেওয়া উচিত , কারণ সম্ভবত এর অর্থ এই যে থ্রেডটি আই / এর অপেক্ষার সময় ঘুমিয়ে থাকবে / হে সমাপ্তি। অন্যদিকে, যদি কিছু ভারী গণনার করছেন, আপনি কি আছে একটি পৃথক থ্রেডে বলতে চেয়ে এটা করা, গুই থ্রেড (যদি না আপনি যদি ম্যানুয়াল মাল্টিপ্লেক্সিং উপভোগ)।
আমি জানি এটি প্রচুর ভাল উত্তর সহ একটি অতি পুরানো প্রশ্ন, তবে আমি বর্তমান পরিবেশে গুরুত্বপূর্ণ এমন কিছু বিষয় উল্লেখ করতে এখানে আছি:
আপনি যদি মাল্টি থ্রেডিংয়ের জন্য কোনও অ্যাপ্লিকেশন ডিজাইন করতে চান তবে আপনার নির্দিষ্ট হার্ডওয়্যার সেটিংয়ের জন্য ডিজাইনি করা উচিত নয়। সিপিইউ প্রযুক্তি কয়েক বছর ধরে বেশ দ্রুত এগিয়ে চলেছে এবং মূল সংখ্যা ক্রমাগত বাড়ছে। আপনি যদি ইচ্ছাকৃতভাবে আপনার অ্যাপ্লিকেশনটি এমনভাবে ডিজাইন করেন যাতে এটিতে কেবল 4 টি থ্রেড ব্যবহার করা হয়, তবে আপনি সম্ভাব্যভাবে নিজেকে অষ্টা-কোর সিস্টেমে সীমাবদ্ধ করছেন (উদাহরণস্বরূপ)। এখন, এমনকি 20-কোর সিস্টেমগুলি বাণিজ্যিকভাবে উপলভ্য, সুতরাং এই জাতীয় নকশা অবশ্যই ভাল চেয়ে বেশি ক্ষতি করছে।
আপনার প্রথম অনুমানের জবাবে: মাল্টি-কোর মেশিনগুলি একই সাথে একক প্রক্রিয়ার একাধিক থ্রেড নয়, একসাথে একাধিক প্রক্রিয়া চালাতে পারে।
আপনার প্রথম প্রশ্নের জবাবে: একাধিক থ্রেডের বিন্দুটি সাধারণত একই সাথে একটি অ্যাপ্লিকেশনের মধ্যে একাধিক কাজ সম্পাদন করে। নেটে ক্লাসিক উদাহরণগুলি হল একটি ইমেল প্রোগ্রাম যা মেল প্রেরণ এবং গ্রহণ করে এবং একটি ওয়েব সার্ভার পেজ অনুরোধ গ্রহণ করে এবং প্রেরণ করে। (নোট করুন যে উইন্ডোজের মতো সিস্টেমকে কেবল একটি থ্রেড বা শুধুমাত্র একটি প্রক্রিয়া চালিত করা হ্রাস করা অসম্ভব। উইন্ডোজ টাস্ক ম্যানেজারটি চালান এবং আপনি সাধারণত সক্রিয় প্রক্রিয়াগুলির একটি দীর্ঘ তালিকা দেখতে পাবেন, যার মধ্যে অনেকগুলি একাধিক থ্রেড চলবে running )
আপনার দ্বিতীয় প্রশ্নের জবাবে: বেশিরভাগ প্রক্রিয়া / থ্রেডগুলি সিপিইউ-আবদ্ধ নয় (অর্থাত্ ক্রমাগত এবং নিরবচ্ছিন্নভাবে চলমান নয়), পরিবর্তে থামুন এবং I / O সমাপ্ত হওয়ার জন্য ঘন ঘন অপেক্ষা করুন। এই অপেক্ষার সময়, অন্যান্য প্রক্রিয়া / থ্রেড ওয়েটিং কোড (এমনকি একটি একক কোর মেশিনে) থেকে "চুরি" ছাড়াই চলতে পারে।
একটি থ্রেড একটি বিমূর্ততা যা আপনাকে অপারেশনের ক্রম হিসাবে কোডটি সহজভাবে লিখতে সক্ষম করে, আনন্দের সাথে অজানা যে কোডটি অন্য কোডের সাথে ফাঁসানো হয়, বা আইওয়ের জন্য অপেক্ষা করা হয়, বা (সম্ভবত কিছুটা সচেতন) অন্য থ্রেডের জন্য অপেক্ষা করে ইভেন্ট বা বার্তা।
মুল বক্তব্যটি হ'ল বিপুল সংখ্যক প্রোগ্রামাররা কীভাবে কোনও রাষ্ট্রীয় মেশিন ডিজাইন করবেন তা বোঝেন না। সবকিছু তার নিজস্ব থ্রেডে রাখতে সক্ষম হওয়ায় প্রোগ্রামারকে কীভাবে বিভিন্ন অগ্রগতিমূলক গণনাগুলির স্থিতিটি দক্ষতার সাথে উপস্থাপন করতে হবে তা চিন্তাভাবনা থেকে মুক্ত করে তোলে যাতে তারা বাধা পেতে পারে এবং পরে আবার চালু করা যায়।
উদাহরণ হিসাবে, ভিডিও সংক্ষেপণ বিবেচনা করুন, একটি খুব সিপিইউ-নিবিড় কাজ। আপনি যদি কোনও গি সরঞ্জাম ব্যবহার করছেন তবে আপনি সম্ভবত চান ইন্টারফেসটি প্রতিক্রিয়াশীল থাকতে পারে (অগ্রগতি দেখান, অনুরোধগুলি বাতিল করতে প্রতিক্রিয়া জানান, উইন্ডো পুনরায় আকারদান ইত্যাদি)। সুতরাং আপনি একবারে বড় ইউনিট (এক বা একাধিক ফ্রেম) প্রসেস করার জন্য আপনার এনকোডার সফটওয়্যারটি ডিজাইন করেন এবং এটি ইউআই থেকে পৃথক করে নিজের থ্রেডে চালান।
অবশ্যই একবার আপনি বুঝতে পারছেন যে অগ্রগতি এনকোডিং রাষ্ট্রটি সংরক্ষণ করতে সক্ষম হওয়াই ভাল হত যাতে আপনি প্রোগ্রামটি পুনরায় চালু করতে বা কোনও উত্স-ক্ষুধার্ত খেলা খেলতে পারেন, আপনি বুঝতে পারেন যে কীভাবে রাষ্ট্রের মেশিনগুলি ডিজাইন করতে হবে তা শিখতে হবে আপনার সূচনা করে। হয় তা হয়, বা আপনি নিজের ওএস-কে হাইবারনেসনের সম্পূর্ণ নতুন সমস্যাটি ইঞ্জিনিয়ার করার সিদ্ধান্ত নিয়েছেন যাতে আপনি পৃথক অ্যাপ্লিকেশনগুলিকে ডিস্কে স্থগিত করতে এবং পুনরায় চালু করতে পারেন ...