থ্রেডগুলি কোড প্রয়োগের ক্ষেত্রে গতি বাড়িয়ে দিতে পারে, সেগুলি কি আসলে দরকার? কোডের প্রতিটি টুকরা কি একক থ্রেড ব্যবহার করে করা যায় বা এমন কিছু আছে যা কেবলমাত্র একাধিক থ্রেড ব্যবহার করে সম্পন্ন করা যায়?
থ্রেডগুলি কোড প্রয়োগের ক্ষেত্রে গতি বাড়িয়ে দিতে পারে, সেগুলি কি আসলে দরকার? কোডের প্রতিটি টুকরা কি একক থ্রেড ব্যবহার করে করা যায় বা এমন কিছু আছে যা কেবলমাত্র একাধিক থ্রেড ব্যবহার করে সম্পন্ন করা যায়?
উত্তর:
প্রথমত, থ্রেডগুলি কোডের সম্পাদনকে গতি দিতে পারে না। তারা দ্রুত কম্পিউটার চালায় না। তারা যা করতে পারে তা হ'ল অন্য সময় নষ্ট হবে এমন সময় ব্যবহার করে কম্পিউটারের দক্ষতা বৃদ্ধি করা। নির্দিষ্ট ধরণের প্রক্রিয়াকরণে এই অপ্টিমাইজেশান দক্ষতা বৃদ্ধি করতে এবং চলমান সময়কে হ্রাস করতে পারে।
সহজ উত্তর হ্যাঁ। আপনি একক থ্রেডে চালানোর জন্য যে কোনও কোড লিখতে পারেন। প্রুফ: একটি একক প্রসেসর সিস্টেম কেবলমাত্র রৈখিক নির্দেশাবলী চালাতে পারে। একাধিক লাইন কার্যকর করা অপারেটিং সিস্টেম প্রসেসিং বাধাগুলি দ্বারা সঞ্চালিত হয়, বর্তমান থ্রেডের রাজ্য সংরক্ষণ করে এবং অন্য একটি শুরু করে।
জটিল উত্তর ... আরও জটিল হয়! একাধিকবার লিনিয়ারগুলির তুলনায় মাল্টিথ্রেডেড প্রোগ্রামগুলি যেহেতু বেশি দক্ষ হতে পারে তার কারণ একটি হার্ডওয়্যার "সমস্যা"। সিপিইউ মেমরি এবং হার্ড স্টোরেজ আইওর চেয়ে আরও দ্রুত গণনা সম্পাদন করতে পারে। সুতরাং, উদাহরণস্বরূপ, একটি "অ্যাড" নির্দেশিকা "ফেচ" এর চেয়ে অনেক বেশি দ্রুত কার্যকর করে। ক্যাশে এবং ডেডিকেটেড প্রোগ্রামের নির্দেশনা আনা (এখানে সঠিক শব্দটির বিষয়ে নিশ্চিত নয়) কিছুটা হলেও এটিকে লড়াই করতে পারে, তবে গতির সমস্যাটি রয়ে গেছে।
থ্রোডিং হ'ল আইও নির্দেশাবলী সম্পূর্ণ হওয়ার সময় সিপিইউ বাউন্ড নির্দেশাবলীর জন্য সিপিইউ ব্যবহার করে এই অমিলের বিরুদ্ধে লড়াইয়ের একটি উপায়। একটি সাধারণ থ্রেড এক্সিকিউশন প্ল্যানটি হ'ল: ডেটা আনুন, ডেটা প্রসেস করুন, ডেটা লিখুন। অনুমান করুন যে আনার এবং লেখাতে 3 চক্র লাগে এবং প্রসেসিংয়ের একটি লাগে, উদাহরণস্বরূপ উদ্দেশ্যে। আপনি দেখতে পাচ্ছেন যে কম্পিউটারটি পড়তে বা লেখার সময়, এটি প্রতিটি 2 টি চক্রের জন্য কিছুই করে না ? স্পষ্টতই এটি অলস হচ্ছে, এবং আমাদের আমাদের অপটিমাইজেশন হুইপ ক্র্যাক করতে হবে!
এই নষ্ট সময়টি ব্যবহার করতে থ্রেডিং ব্যবহার করে আমরা প্রক্রিয়াটি আবার লিখতে পারি:
ইত্যাদি। স্পষ্টতই এটি কিছুটা সংশ্লেষিত উদাহরণ, তবে আপনি দেখতে পাবেন যে কীভাবে এই কৌশলটি সেই সময়টিকে কাজে লাগাতে পারে যা অন্যথায় আইওর জন্য অপেক্ষা করতে ব্যয় করা হবে।
নোট করুন যে উপরে প্রদর্শিত হিসাবে থ্রেডিং কেবল ভারী আইও বাউন্ড প্রক্রিয়াগুলিতে দক্ষতা বাড়িয়ে তুলতে পারে। যদি কোনও প্রোগ্রাম প্রধানত জিনিসগুলি গণনা করে থাকে তবে আমরা আরও বেশি কাজ করতে পারতাম এমন অনেকগুলি "গর্ত" হবে না Also এছাড়াও, থ্রেডগুলির মধ্যে স্যুইচ করার সময় বেশ কয়েকটি নির্দেশাবলীর একটি ওভারহেড রয়েছে। আপনি যদি অনেক বেশি থ্রেড চালান, তবে সিপিইউ এর বেশিরভাগ সময় স্যুইচিংয়ে ব্যয় করবে এবং আসলে সমস্যাটিতে বেশি কাজ করবে না। একে থ্রেশিং বলা হয় ।
এটি একটি একক কোর প্রসেসরের পক্ষে সবথেকে ভাল এবং ভাল তবে বেশিরভাগ আধুনিক প্রসেসরের দুটি বা আরও বেশি কোর থাকে। থ্রেডগুলি এখনও একই উদ্দেশ্যটি পরিবেশন করে - সিপিইউ ব্যবহার সর্বাধিক করে তোলার জন্য, তবে এবার আমাদের একই সময়ে দুটি পৃথক নির্দেশনা চালানোর ক্ষমতা রয়েছে । এই করতে যদিও বহু কোর একটি গুণক দ্বারা সময় চলমান হ্রাস পাওয়া, কারণ কম্পিউটার আসলে মাল্টিটাস্কিং, প্রসঙ্গ সুইচিং নয়।
একাধিক কোর সহ, থ্রেড দুটি কোরের মধ্যে বিভক্ত কাজের একটি পদ্ধতি সরবরাহ করে। উপরেরগুলি এখনও প্রতিটি পৃথক কোরের জন্য প্রযোজ্য যদিও; একটি প্রোগ্রাম যা একটি কোরে দুটি থ্রেড সহ সর্বাধিক দক্ষতা চালায় সম্ভবত সম্ভবত দুটি কোরে প্রায় চারটি থ্রেড সহ সর্বোচ্চ দক্ষতার সাথে সঞ্চালিত হবে। (দক্ষতা এখানে ন্যূনতম এনওপি নির্দেশনা কার্যকরকরণ দ্বারা পরিমাপ করা হয়))
একাধিক কোরে থ্রেড চলমান সমস্যাগুলি (একক কোরের বিপরীতে) সাধারণত হার্ডওয়্যার দ্বারা যত্ন নেওয়া হয়। সিপিইউ নিশ্চিত হবে যে এটি পড়ার / লেখার আগে উপযুক্ত মেমরির অবস্থানগুলি লক করে loc (আমি পড়েছি যে এটি এর জন্য স্মৃতিতে একটি বিশেষ পতাকা বিট ব্যবহার করে তবে এটি বেশ কয়েকটি উপায়ে সম্পন্ন করা যেতে পারে)) উচ্চ স্তরের ভাষাগুলি সহ একটি প্রোগ্রামার হিসাবে আপনাকে দুটি কোরে আরও কিছু করার দরকার নেই একটি সঙ্গে করতে হবে।
টিএল; ডিআর: থ্রেডগুলি বিচ্ছিন্ন হতে পারে কম্পিউটারকে একাধিক কার্য সংশ্লেষের সাথে প্রক্রিয়া করার জন্য। এটি কোনও প্রক্রিয়া যখন কোনও সংস্থার জন্য অপেক্ষা করে থাকে তখন লক না করে উপলভ্য সমস্ত প্রসেসিংয়ের সময়টি ব্যবহার করে কম্পিউটারকে সর্বাধিক দক্ষতায় চালিত করতে দেয়।
একক থ্রেড এমন একাধিক থ্রেড কী করতে পারে?
কিছুই নেই।
সাধারণ প্রমাণ স্কেচ:
নোট, তবে, সেখানে একটি বৃহত্তর অনুমান লুকিয়ে আছে: যথা যে একক থ্রেডের মধ্যে ব্যবহৃত ভাষাটি টুরিং-সম্পূর্ণ।
সুতরাং, আরও আকর্ষণীয় প্রশ্নটি হবে: " নন-টিউরিং-সম্পূর্ণ ভাষায় কেবলমাত্র বহু-থ্রেডিং যুক্ত করা কি এটিকে টুরিং-সম্পূর্ণ করতে পারে?" এবং আমি বিশ্বাস করি, উত্তরটি "হ্যাঁ"।
আসুন মোট কার্যকরী ভাষা গ্রহণ করা যাক। [যারা পরিচিত নন: ফাংশনাল প্রোগ্রামিং যেমন ফাংশন সহ প্রোগ্রামিং করা হয়, মোট ফাংশনাল প্রোগ্রামিং মোট ফাংশন সহ প্রোগ্রামিং হয়।]
মোট ক্রিয়াগত ভাষাসমূহ স্পষ্টত টুরিং-সম্পূর্ণ নয়: তুমি কি একটি TFPL মধ্যে একটি অসীম লুপ লিখতে পারেন (আসলে, যে প্রায় কাছাকাছি সংজ্ঞা "মোট" এর), কিন্তু আপনি করতে পারেন একটি টুরিং মেশিন এ, অতএব সেখানে অন্তত একটি প্রোগ্রাম বিদ্যমান টিএফপিএলে লেখা যায় না তবে কোনও ইউটিএম-এ থাকতে পারে, তাই টিএফপিএলগুলি ইউটিএম-এর চেয়ে কম গণনামূলকভাবে শক্তিশালী।
তবে, আপনি কোনও টিএফপিএলে থ্রেডিং যুক্ত করার সাথে সাথে আপনি অসীম লুপগুলি পাবেন: লুপটির প্রতিটি পুনরাবৃত্তি একটি নতুন থ্রেডে করুন। প্রতিটি স্বতন্ত্র থ্রেড সর্বদা একটি ফলাফল দেয়, সুতরাং এটি মোট, তবে প্রতিটি থ্রেড একটি নতুন থ্রেড তৈরি করে যা পরবর্তী পুনরাবৃত্তিকে কার্যকর করে, বিজ্ঞাপন হিসাবে।
আমি মনে করি এই ভাষা টিউরিং-সম্পূর্ণ হবে।
খুব কমপক্ষে, এটি মূল প্রশ্নের উত্তর দেয়:
একক থ্রেড এমন একাধিক থ্রেড কী করতে পারে?
যদি আপনি একটি ভাষা যা অসীম loops ব্যবহার করতে পারবেন না আছে, তারপর বহু-থ্রেডিং আপনি অসীম loops করার অনুমতি দিয়েছে।
দ্রষ্টব্য, অবশ্যই, থ্রেড তৈরি করা একটি পার্শ্ব-প্রতিক্রিয়া এবং সুতরাং আমাদের বর্ধিত ভাষা কেবল মোট নয়, এটি এমনকি কার্যকরীও নয়।
তত্ত্ব অনুসারে, বহুবিবাহিত প্রোগ্রাম যা কিছু করে তা কেবলমাত্র ধীর গতিতে একক থ্রেডযুক্ত প্রোগ্রামের সাহায্যে করা যেতে পারে।
অনুশীলনে, গতির পার্থক্য এত বড় হতে পারে যে কোনও কাজের জন্য একক থ্রেডেড প্রোগ্রামটি ব্যবহার করার কোনও উপায় নেই। উদাহরণস্বরূপ, যদি আপনার প্রতি ব্যাচের ডেটা প্রসেসিংয়ের কাজটি প্রতি রাতে চলমান থাকে, এবং একটি থ্রেডে শেষ হতে 24 ঘন্টারও বেশি সময় লাগে, আপনার এটি মাল্টিথ্রেড করা ছাড়া অন্য কোনও বিকল্প নেই। (অনুশীলনে, প্রান্তিক দিকটি সম্ভবত আরও কম: ব্যবহারকারীরা সিস্টেমটি আবার ব্যবহার করা শুরু করার আগে প্রায়শই ভোরের মধ্যেই শেষ করা উচিত Also এছাড়াও অন্যান্য কাজগুলিও তাদের উপর নির্ভর করতে পারে, যা একই রাতেই শেষ করতে হবে So সুতরাং উপলব্ধ রানটাইম কয়েক ঘন্টা / মিনিটের মতো কম হতে পারে))
একাধিক থ্রেডে কম্পিউটিংয়ের কাজ করা বিতরণ প্রক্রিয়াজাতকরণের একধরণের; আপনি একাধিক থ্রেডের উপর কাজটি বিতরণ করছেন। বিতরণ প্রক্রিয়াজাতকরণের আরও একটি উদাহরণ (একাধিক থ্রেডের পরিবর্তে একাধিক কম্পিউটার ব্যবহার করা) হচ্ছে এসটিআই স্ক্রিনসভার: একক প্রসেসরে এত পরিমাপের ডেটা ক্রাঞ্চ করা একটি ভয়াবহ সময় নিতে পারে এবং গবেষকরা অবসর গ্রহণের আগে ফলাফলগুলি দেখতে পছন্দ করবেন ;-) তবে তারা এত দিন সুপার কম্পিউটারের ভাড়া নেওয়ার বাজেট নেই, তাই তারা এটিকে সস্তা করার জন্য কয়েক মিলিয়ন পরিবারের পিসির উপর কাজটি বিতরণ করে।
যদিও থ্রেডগুলি অনুক্রমিক গণনা থেকে একটি ছোট পদক্ষেপ বলে মনে হচ্ছে, বাস্তবে, তারা একটি বিশাল পদক্ষেপের প্রতিনিধিত্ব করে। তারা অনুক্রমিক গণনার সর্বাধিক প্রয়োজনীয় এবং আবেদনকারী বৈশিষ্ট্যগুলি বর্জন করে: বোধগম্যতা, অনুমানযোগ্যতা এবং নির্ধারণ। গণনার একটি মডেল হিসাবে থ্রেডগুলি বন্যপ্রাণ নীতিবিরোধী এবং প্রোগ্রামারটির কাজ সেই ননডেটেরিনিজমকে ছাঁটাই করে তোলে।
- থ্রেড সহ সমস্যা (www.eecs.berkeley.edu/Pubs/TechRpts/2006/EECS-2006-1.pdf)।
থ্রেড ব্যবহার করে এমন কিছু কার্যকারিতা সুবিধা রয়েছে যা আপনি একাধিক কোর জুড়ে কাজ বিতরণ করতে পারেন তবে সেগুলি প্রায়শই দুর্দান্ত দামে আসে।
এখানে উল্লিখিত না হওয়া থ্রেডগুলি ব্যবহার করার জন্য একটি ডাউনসাইডগুলি হ'ল রিসোর্স কম্পार्टালাইজেশন হ্রাস যা আপনি একক থ্রেডেড প্রক্রিয়া স্পেসের সাথে পান। উদাহরণস্বরূপ, বলুন যে আপনি কোনও সেগফল্টের ক্ষেত্রে চলেছেন। কোনও কোনও ক্ষেত্রে, একাধিক প্রক্রিয়া প্রয়োগের মাধ্যমে এটি থেকে পুনরুদ্ধার করা সম্ভব হবে যাতে আপনি কেবল দোষী শিশুটিকে মরে যেতে এবং রেসনকে নতুন একটি বাচ্চা করতে দেন। এটি আপাচের প্রিফের্ক ব্যাকএন্ডের ক্ষেত্রে। যখন কোনও httpd উদাহরণটি উদর হয়, তখন আরও খারাপ পরিস্থিতিটি হ'ল সেই প্রক্রিয়াটির জন্য নির্দিষ্ট এইচটিটিপি অনুরোধটি বাদ দেওয়া যেতে পারে তবে অ্যাপাচি একটি নতুন শিশুকে উত্সাহ দেয় এবং প্রায়শই কেবল বিরক্তি প্রকাশ করে সার্ভিস দেওয়া হয় the শেষ ফলাফলটি হ'ল সামগ্রিকভাবে অ্যাপাচি ত্রুটিযুক্ত থ্রেডের সাথে নামানো হয়নি।
এই দৃশ্যের আরেকটি বিবেচনা হ'ল মেমরি ফাঁস। কিছু ক্ষেত্রে রয়েছে যেখানে আপনি থ্রেড ক্র্যাশ করে গ্রেফতার হয়ে পরিচালনা করতে পারেন (ইউএনআইএক্স-এ, কিছু নির্দিষ্ট সংকেতগুলি থেকে উদ্ধার করে - এমনকি সেগফল্ট / এফপিভিলিয়েশনও সম্ভব) তবে সেই ক্ষেত্রেও আপনি সেই থ্রেড দ্বারা বরাদ্দকৃত সমস্ত স্মৃতি ফাঁস করে দিতে পারেন (malloc, নতুন, ইত্যাদি)। সুতরাং আপনি যখন প্রক্রিয়া চালিয়ে যেতে পারেন তখন প্রতিটি ত্রুটি / পুনরুদ্ধারের সাথে এটি সময়ের সাথে আরও বেশি স্মৃতি মেশে। আবার এপাচির মেমরি পুলের ব্যবহারের মতো এটিকে হ্রাস করার কিছুটা উপায় রয়েছে to তবে এটি এখনও মেমরি থেকে রক্ষা করে না যে থ্রেডটি সম্ভবত থ্রেড ব্যবহার করে third
এবং, কিছু লোক যেমন উল্লেখ করেছে, সমকালীন আধ্যাত্মিকতা বোঝা সত্যিই সঠিক হওয়া সম্ভবত সবচেয়ে কঠিন বিষয়। এই সমস্যাটি নিজেই - আপনার সমস্ত কোডের জন্য সাধারণ যুক্তি সঠিকভাবে পাওয়া - এটি একটি বিশাল মাথাব্যথা হতে পারে। রহস্যময় ডেডলকগুলি অদ্ভুত সময়ে ঘটে যাওয়ার প্রবণতা রয়েছে এবং কখনও কখনও এমনকি আপনার প্রোগ্রামটি প্রযোজনা না হওয়া পর্যন্ত হয় না, যা ডিবাগিংকে আরও জটিল করে তোলে। এটিকে যুক্ত করুন যে সিঙ্ক্রোনাইজেশন আদিমতাগুলি প্রায়শই প্ল্যাটফর্মের সাথে বিস্তৃতভাবে পরিবর্তিত হয় (উইন্ডোজ বনাম POSIX), এবং ডিবাগিং প্রায়শই আরও বেশি কঠিন হতে পারে, পাশাপাশি যে কোনও সময়ে জাতি অবস্থার সম্ভাবনা (স্টার্টআপ / আরম্ভকরণ, রানটাইম এবং শাটডাউন), থ্রেড সহ প্রোগ্রামিংয়ের শুরুতে খুব কম দয়া হয়। এমনকি বিশেষজ্ঞদের জন্য, থ্রেডিংয়ের জ্ঞানটি সাধারণভাবে জটিলতা হ্রাস করে না বলে এখনও কিছুটা রহমত নেই। থ্রেডযুক্ত কোডের প্রতিটি লাইন কখনও কখনও প্রোগ্রামের সামগ্রিক জটিলতাটি তাত্পর্যপূর্ণভাবে মিশ্রিত করে এবং লুকানো অচলাবস্থা বা অদ্ভুত জাতি অবস্থার যে কোনও সময় পৃষ্ঠতলে যাওয়ার সম্ভাবনা বাড়িয়ে তোলে। এই জিনিসগুলি বের করার জন্য পরীক্ষার কেসগুলি লেখা খুব কঠিন হতে পারে।
এ কারণেই অ্যাপাচি এবং পোস্টগ্রিএসকিউএল এর মতো কিছু প্রকল্পগুলি বেশিরভাগ অংশ প্রক্রিয়াভিত্তিক। পোস্টগ্রিএসকিউএল প্রতিটি ব্যাকএন্ড থ্রেড পৃথক প্রক্রিয়াতে চালায়। অবশ্যই এটি এখনও সিঙ্ক্রোনাইজেশন এবং জাতি অবস্থার সমস্যাটিকে কমায় না তবে এটি বেশ কিছুটা সুরক্ষা যোগ করে এবং কিছু উপায়ে বিষয়গুলিকে সরল করে তোলে।
একাধিক প্রক্রিয়া প্রতিটি মৃত্যুর একক থ্রেডে চলমান একক প্রক্রিয়াতে চলমান একাধিক থ্রেডের চেয়ে অনেক ভাল। এবং নতুন পিয়ার-টু-পিয়ার কোড যেমন এএমকিউপি (রাবিটএমকিউ, কিপিড, ইত্যাদি) এবং জিরো কিউয়ের আবির্ভাবের সাথে বিভিন্ন প্রক্রিয়া স্পেস এবং এমনকি মেশিন এবং নেটওয়ার্কগুলিতে থ্রেডগুলি বিভক্ত করা অনেক সহজ, জিনিসগুলি খুব সহজ করে তুলেছে। কিন্তু তবুও, এটি কোনও রূপালী বুলেট নয়। মোকাবেলা করার জন্য এখনও জটিলতা রয়েছে। আপনি প্রসেস স্পেস থেকে আপনার কিছু ভেরিয়েবল নেটওয়ার্কে সরিয়ে নিয়েছেন।
মূল কথাটি হ'ল থ্রেডের ডোমেনে প্রবেশের সিদ্ধান্তটি হালকা নয়। একবার আপনি সেই অঞ্চলে প্রবেশ করার পরে, প্রায় তাত্ক্ষণিকভাবে সবকিছু আরও জটিল হয়ে যায় এবং সমস্যাগুলির সম্পূর্ণ নতুন জাতগুলি আপনার জীবনে প্রবেশ করে। এটি মজাদার এবং দুর্দান্ত হতে পারে তবে এটি পারমাণবিক শক্তির মতো - যখন জিনিসগুলি ভুল হয়ে যায়, তখন তারা খারাপভাবে এবং দ্রুত যেতে পারে। আমার মনে আছে বহু বছর আগে সমালোচনামূলক প্রশিক্ষণে একটি ক্লাস নেওয়া এবং তারা লস আলামোসের কিছু বিজ্ঞানী যারা ডাব্লুডাব্লুআইআই-এর পিছনে ল্যাবগুলিতে প্লুটোনিয়াম নিয়ে খেলেছিল তাদের ছবি দেখিয়েছিল। অনেকগুলি এক্সপোজারের ঘটনার বিরুদ্ধে খুব সামান্য বা কোনও সতর্কতা অবলম্বন করেছিল, এবং চোখের পলক - একক উজ্জ্বল, ব্যথাহীন ফ্ল্যাশে, এটি তাদের জন্য শেষ হয়ে যাবে। দিন পরে তারা মারা গিয়েছিল। রিচার্ড ফেনম্যান পরে এটিকে " ড্রাগনের লেজকে সুড়সুড়ি " বলে উল্লেখ করেছিলেন"থ্রেডের সাথে খেলে এটি কী ধরনের হতে পারে (কমপক্ষে আমার পক্ষে যাই হোক না কেন) এটি প্রথমে বরং নিষ্পাপ বলে মনে হয় এবং আপনার দংশনের সময় আপনার মাথা কীভাবে খালি হয়ে যায় তাড়াতাড়ি চুলকান But তবে কমপক্ষে থ্রেড জিতেছে তোমাকে মেরে ফেলব না
প্রথমত, একটি একক থ্রেডযুক্ত অ্যাপ্লিকেশন কখনই কোনও মাল্টি-কোর সিপিইউ বা হাইপার-থ্রেডিংয়ের সুবিধা নেবে না। তবে এমনকি একটি একক কোর, একক থ্রেডেড সিপিইউ মাল্টি-থ্রেডিং করার সুবিধা রয়েছে।
বিকল্পটি বিবেচনা করুন এবং এটি আপনাকে খুশি করে কিনা। মনে করুন আপনার একাধিক কাজ রয়েছে যা একই সাথে চালানো দরকার। উদাহরণস্বরূপ আপনাকে দুটি ভিন্ন সিস্টেমের সাথে যোগাযোগ চালিয়ে যেতে হবে। মাল্টি থ্রেডিং না করে আপনি কীভাবে এটি করবেন? আপনি সম্ভবত আপনার নিজস্ব শিডিয়ুলার তৈরি করতে এবং এটি সম্পাদন করার জন্য প্রয়োজনীয় বিভিন্ন কর্মকে কল করতে দিন। এর অর্থ হ'ল আপনাকে আপনার কাজগুলি অংশগুলিতে বিভক্ত করতে হবে। আপনার সম্ভবত কিছু রিয়েল-টাইম সীমাবদ্ধতাগুলি পূরণ করতে হবে আপনার অবশ্যই নিশ্চিত করতে হবে যে আপনার অংশগুলি খুব বেশি সময় না নেয়। অন্যথায় টাইমার অন্যান্য কাজে মেয়াদ শেষ হয়ে যাবে। এটি কোনও কাজকে বিভক্ত করা আরও কঠিন করে তোলে। নিজেকে পরিচালনা করার জন্য আপনাকে যত বেশি কাজ করতে হবে, আপনাকে আরও বিভাজন করতে হবে এবং আপনার সময়সূচী আরও জটিল হয়ে উঠবে সমস্ত প্রতিবন্ধকতাগুলি পূরণ করতে।
যখন আপনার একাধিক থ্রেড থাকে তখন জীবন আরও সহজ হয়ে যায়। প্রি-ইম্পিভ শিডিয়ুলার যেকোন সময় কোনও থ্রেড থামাতে পারে, তার অবস্থা ধরে রাখতে পারে এবং অন্যটি আবার শুরু করতে পারে। আপনার থ্রেডটির পালা এলে এটি পুনরায় চালু হবে। সুবিধা: আপনার জন্য ইতিমধ্যে একটি শিডিয়ুল লেখার জটিলতা সম্পন্ন হয়েছে এবং আপনাকে আপনার কাজগুলি আলাদা করতে হবে না। এছাড়াও, সময়সূচী প্রক্রিয়াগুলি / থ্রেডগুলি পরিচালনা করতে সক্ষম যা আপনি নিজেরাই অবগত নন। এবং এছাড়াও, যখন কোনও থ্রেডকে কিছু করার দরকার নেই (এটি কোনও ইভেন্টের জন্য অপেক্ষা করছে) এটি কোনও সিপিইউ চক্র গ্রহণ করবে না। আপনি যখন নিজের ডাউন সিঙ্গল-থ্রেড শিডিয়ুলার তৈরি করছেন তখন এটি সম্পাদন করা এত সহজ নয়। (ঘুমানোর জন্য কিছু রাখা এতটা কঠিন নয়, তবে কীভাবে এটি জেগে ওঠে?)
মাল্টি-থ্রেডেড বিকাশের নেতিবাচক দিকটি হ'ল আপনাকে সমঝোতা বিষয়গুলি, লক করার কৌশল এবং এগুলি সম্পর্কে আরও বুঝতে হবে। ত্রুটি-মুক্ত মাল্টি-থ্রেড কোড বিকাশ করা বেশ শক্ত হতে পারে। এবং ডিবাগিং আরও শক্ত হতে পারে।
এমন কি কিছু আছে যা কেবলমাত্র একাধিক থ্রেড ব্যবহার করে সম্পন্ন করা যায়?
হ্যাঁ. আপনি একক থ্রেড সহ একাধিক সিপিইউ বা সিপিইউ কোরে কোড চালাতে পারবেন না।
একাধিক সিপিইউ / কোর ব্যতীত থ্রেডগুলি এখনও কোডটিকে সহজতর করতে পারে যা ধারণামূলকভাবে সমান্তরালভাবে সঞ্চালিত হয় যেমন কোনও সার্ভারে ক্লায়েন্ট হ্যান্ডলিং - তবে আপনি থ্রেড ছাড়াই একই জিনিসটি করতে পারেন।
থ্রেডগুলি কেবল গতি সম্পর্কে নয় তবে সমাবলিকতা সম্পর্কে।
@ পিটারের পরামর্শ অনুসারে যদি আপনার কাছে ব্যাচের অ্যাপ্লিকেশন না থাকে তবে তার পরিবর্তে ডাব্লুপিএফ এর মতো একটি জিইউআই টুলকিট আপনি কীভাবে কেবল একটি থ্রেড দিয়ে ব্যবহারকারী এবং ব্যবসায়িক যুক্তির সাথে যোগাযোগ করতে পারেন?
এছাড়াও, ধরুন আপনি একটি ওয়েব সার্ভার তৈরি করছেন। আপনি কীভাবে একাধিক ব্যবহারকারীর একযোগে কেবল একটি থ্রেড (অন্য কোনও প্রক্রিয়া মনে না করে) পরিবেশন করবেন?
অনেকগুলি পরিস্থিতি রয়েছে যেখানে কেবল একটি থ্রেড সহজ যথেষ্ট নয়। সে কারণেই 50+রও বেশি কোর এবং শত শত থ্রেড সহ ইন্টেল এমআইসি প্রসেসরের মতো সাম্প্রতিক অগ্রগতি হচ্ছে।
হ্যাঁ, সমান্তরাল এবং সমবর্তী প্রোগ্রামিং শক্ত। তবে প্রয়োজনীয়।
মাল্টি-থ্রেডিং দীর্ঘ প্রক্রিয়াজাতকরণ ক্রিয়াকলাপের সময় GUI ইন্টারফেসটিকে এখনও প্রতিক্রিয়াশীল হতে দেয়। মাল্টি-থ্রেডিং ব্যতীত, দীর্ঘ প্রক্রিয়া চলাকালীন ব্যবহারকারী একটি লক করা ফর্মটি দেখতে আটকে থাকবে।
মাল্টি-থ্রেড কোড প্রোগ্রামের যুক্তিকে অচল করে দিতে পারে এবং একক থ্রেডগুলি যেভাবে পারে না সেভাবে বাসি ডেটা অ্যাক্সেস করতে পারে।
থ্রেডস একটি অস্পষ্ট বাগ নিতে পারে এমন একটি গড় প্রোগ্রামার থেকে প্রত্যাশা করা যেতে পারে যে এটি কোনও ডিবাগ করে এটিকে এমন রাজ্যে নিয়ে যেতে পারে যেখানে গল্পগুলির ভাগ্যের কথা বলা হয় যখন এটির প্যান্টগুলির সাথে একই বাগটি ধরতে হবে যখন কোনও সতর্কতা প্রোগ্রামার যখন ঘটছিল ঠিক তখন দেখছিল সঠিক মুহূর্ত
আইও ব্লক করে এমন অ্যাপ্লিকেশনগুলি যেগুলি অন্যান্য ইনপুটগুলিতে (জিইউআই বা অন্যান্য সংযোগগুলি) প্রতিক্রিয়াশীল থাকতে হবে তাদের একক পাঠা যায় না
ব্লক না করে কতটা পড়তে পারে তা দেখতে আইও লাইবটিতে পরীক্ষা করার পদ্ধতিগুলি যুক্ত করা এতে সহায়তা করতে পারে তবে অনেক লাইব্রেরি এ সম্পর্কে কোনও সম্পূর্ণ গ্যারান্টি দেয় না
অনেক ভাল উত্তর তবে আমি নিশ্চিত যে এটির কোনও বাক্যাংশ আমার কাছে যেমনটি ঠিক তেমন নয় - সম্ভবত এটি এটিকে দেখার জন্য অন্যরকম উপায় দেয়:
থ্রেডগুলি কেবলমাত্র প্রোগ্রামিং সরলকরণ যেমন অবজেক্টস বা অভিনেতা বা লুপগুলির জন্য (হ্যাঁ, আপনি লুপগুলি প্রয়োগ করেন এমন কিছু আপনি যদি / গোটো দিয়ে প্রয়োগ করতে পারেন)।
থ্রেড ছাড়া আপনি কেবল একটি রাষ্ট্র ইঞ্জিন প্রয়োগ করেন। আমি এটি অনেকবার করতে হয়েছিল (প্রথমবার আমি এটি করলাম আমি এটির কথাটি কখনও শুনিনি - একটি "স্টেট" ভেরিয়েবল দ্বারা নিয়ন্ত্রিত একটি বড় সুইচ স্টেটমেন্ট তৈরি করেছে)। রাষ্ট্রীয় মেশিনগুলি এখনও বেশ সাধারণ তবে বিরক্তিকর হতে পারে। থ্রেড সহ বয়লারপ্লেটের একটি বিশাল অংশ চলে যায়।
কোনও ভাষা এটির রানটাইম কার্যকরকরণকে মাল্টি-সিপিইউ বন্ধুত্বপূর্ণ অংশে ভেঙে দেওয়া আরও সহজ করে তোলে (তাই অভিনেতারাও করুন, আমি বিশ্বাস করি)।
জাভা সেই সব সিস্টেমে "সবুজ" থ্রেড সরবরাহ করে যেখানে ওএস কোনও থ্রেডিং সমর্থন সরবরাহ করে না। এই ক্ষেত্রে এটি দেখতে আরও সহজ যে এগুলি স্পষ্টত কোনও প্রোগ্রামিং বিমূর্ততা ছাড়া আর কিছুই নয়।
ওএসগুলি সময় স্লাইসিং ধারণাটি ব্যবহার করে যেখানে প্রতিটি থ্রেড চলার সময় হয়ে যায় এবং তারপরে পরাস্ত হয়। থ্রেডিং এখন যেমন দাঁড়িয়েছে তেমন পদ্ধতির প্রতিস্থাপন করতে পারে তবে প্রতিটি অ্যাপ্লিকেশনটিতে আপনার নিজস্ব শিডিয়ুলার লিখতে হবে ওভারকিল। তদুপরি, আপনাকে আই / ও ডিভাইস ইত্যাদির সাথে কাজ করতে হবে। এবং হার্ডওয়্যার দিক থেকে কিছুটা সহায়তা প্রয়োজন, যাতে আপনার শিডিয়ুলারটি চালানোর জন্য আপনি বাধা ফেলা করতে পারেন। মূলত আপনি প্রতিবার একটি নতুন ওএস লিখবেন।
থ্রেডিংয়ে ক্ষেত্রে থ্রেডগুলি I / O এর জন্য অপেক্ষা করে, বা ঘুমাচ্ছে সে ক্ষেত্রে কর্মক্ষমতা উন্নত করতে পারে। এটি আপনাকে দীর্ঘমেয়াদি কার্য সম্পাদন করার সময় প্রতিক্রিয়াশীল ইন্টারফেসগুলি তৈরি করতে এবং প্রক্রিয়াগুলি বন্ধ করার অনুমতি দেয়। এবং এছাড়াও, থ্রেডিং সত্যিকারের মাল্টিকোর সিপিইউগুলিতে জিনিসগুলির উন্নতি করে।
প্রথমত, থ্রেডগুলি একই সময়ে দুটি বা আরও বেশি কিছু করতে পারে (যদি আপনার একাধিক কোর থাকে)। আপনি একাধিক প্রক্রিয়া সহ এটিও করতে পারেন, কিছু কাজ কেবল একাধিক প্রক্রিয়াতে খুব ভাল বিতরণ করে না।
এছাড়াও, কিছু কার্যগুলির মধ্যে এমন ফাঁকা স্থান রয়েছে যা আপনি সহজেই এড়াতে পারবেন না। উদাহরণস্বরূপ, ডিস্কে থাকা কোনও ফাইল থেকে ডেটা পড়া এবং আপনার প্রক্রিয়াটি একই সময়ে অন্য কিছু করাও শক্ত। যদি আপনার কার্যত অগত্যা ডিস্ক থেকে প্রচুর রিডিং ডেটার প্রয়োজন হয় তবে আপনার প্রক্রিয়াটি আপনি যা-ই করেন না কেন ডিস্কের জন্য অপেক্ষা করতে অনেক সময় ব্যয় করবে।
দ্বিতীয়ত, থ্রেডগুলি আপনাকে আপনার কোডের বৃহত পরিমাণে পারফরম্যান্স-সমালোচনা না করে এড়াতে দেয় allow আপনার যদি কেবল একটি একক থ্রেড থাকে তবে কোডের প্রতিটি অংশের পারফরম্যান্স সমালোচিত। যদি এটি অবরুদ্ধ হয় তবে আপনি ডুবে গেছেন - সেই প্রক্রিয়াটি দ্বারা করা কোনও কাজই এগিয়ে অগ্রগতি করতে পারে না। থ্রেড সহ, একটি ব্লক কেবল সেই থ্রেডকে প্রভাবিত করবে এবং অন্যান্য থ্রেডগুলি পাশাপাশি আসতে পারে এবং সেই প্রক্রিয়াটি সম্পন্ন করা দরকার এমন কাজগুলিতে কাজ করতে পারে।
একটি ভাল উদাহরণ হ'ল ত্রুটি হ্যান্ডলিং কোডটি প্রায়শই সম্পাদিত হয়। বলুন কোনও কাজ একটি খুব কদাচিৎ ত্রুটির মুখোমুখি হয় এবং সেই ত্রুটিটি পরিচালনা করার কোডটি মেমোরিতে প্রবেশ করা দরকার। যদি ডিস্কটি ব্যস্ত থাকে, এবং প্রক্রিয়াটির কেবল একটি একক থ্রেড থাকে, ত্রুটিটি পরিচালনা করার কোডটি মেমরিতে লোড না করা পর্যন্ত কোনও অগ্রগতি করা যায় না। এটি ফেটে যাওয়া প্রতিক্রিয়া সৃষ্টি করতে পারে।
আরেকটি উদাহরণ হ'ল যদি আপনাকে খুব কমই ডাটাবেস অনুসন্ধান করতে হয়। আপনি যদি ডাটাবেসটির উত্তর দেওয়ার জন্য অপেক্ষা করেন তবে আপনার কোডটি একটি বিশাল বিলম্বের কারণ হবে। তবে আপনি এই সমস্ত কোডকে অবিচ্ছিন্ন করে তোলার সমস্যায় যেতে চান না কারণ এটি এত বিরল যে আপনাকে এই চেহারাগুলি করতে হবে। এই কাজটি করার জন্য একটি থ্রেড সহ, আপনি উভয় বিশ্বের সেরা পাবেন। এই কাজটি করার জন্য একটি থ্রেড এটি হওয়া উচিত হিসাবে অ-কর্মক্ষমতা সমালোচনা করে।