একটি "কর্টিন" এবং "থ্রেড" এর মধ্যে পার্থক্য?


উত্তর:


122

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

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


188

প্রথম পড়ুন: সমান্তরাল বনাম সমান্তরালতা - পার্থক্য কী?

ইন্টারক্ল্যাভড এক্সিকিউশন প্রদানের জন্য কার্যগুলির পৃথকীকরণ হ'ল সংক্ষিপ্তকরণ। সমান্তরালতা হ'ল গতি বাড়ানোর জন্য একাধিক কাজের একযোগে সম্পাদন। - https://github.com/servo/servo/wiki/Design

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

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

থ্রেডগুলির বিপরীতে, যা প্রাক-উদ্দীপক, কর্টিন স্যুইচগুলি সমবায় হয় (যখন একটি স্যুইচ ঘটবে তখন প্রোগ্রামার নিয়ন্ত্রণ করে)। কার্নেটিন সুইচগুলির সাথে কার্নেল জড়িত নয়। - http://www.boost.org/doc/libs/1_55_0/libs/coroutine/doc/html/coroutine/overview.html

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

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

একটি একক প্রসেসর মেশিনে, থ্রেডগুলি সময়ভিত্তিক এবং প্রিম্প্ট করা হয় (দ্রুত পরিবর্তন করা হয়) লিনাক্সে ডিফল্ট টাইমলাইসটি 100 মিমি) যা তাদের একযোগে করে তোলে। তবে এগুলি সমান্তরালে চালানো যাবে না (একসাথে), যেহেতু একক কোর প্রসেসর একবারে কেবল একটি জিনিস চালাতে পারে।

Coroutines এবং / অথবা জেনারেটর সমবায় ফাংশন প্রয়োগ করতে ব্যবহার করা যেতে পারে। কার্নেল থ্রেডগুলিতে চালিত হওয়ার পরিবর্তে এবং অপারেটিং সিস্টেমের দ্বারা নির্ধারিত হওয়ার পরে, তারা প্রোগ্রামার দ্বারা নির্ধারিত অন্যান্য ফাংশনগুলিতে ফলন বা শেষ না হওয়া অবধি একক থ্রেডে চালিত হয়। পাইথন এবং ECMAScript 6 এর মতো জেনারেটর সহ ভাষাগুলি কর্টিনগুলি তৈরি করতে ব্যবহার করা যেতে পারে। অ্যাসিঙ্ক / অপেক্ষার (সি #, পাইথন, ইসিএমএসক্রিপ্ট 7, মরিচে দেখা যায়) হ'ল জেনারেটর ফাংশনগুলির শীর্ষে নির্মিত একটি বিমূর্ততা যা ফিউচার / প্রতিশ্রুতি দেয়।

কিছু প্রেক্ষিতে, coroutines stackful ফাংশন পড়ুন যখন পারে জেনারেটর stackless ফাংশন উল্লেখ করতে পারে।

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

উদাহরণস্বরূপ, জাভাতে " সবুজ থ্রেড " ছিল; এগুলি থ্রেডগুলি ছিল যা অন্তর্নিহিত অপারেটিং সিস্টেমের কার্নেল থ্রেডগুলির পরিবর্তে জাভা ভার্চুয়াল মেশিন (জেভিএম) দ্বারা নির্ধারিত হয়েছিল। এগুলি সমান্তরালভাবে চালিত হয় না বা একাধিক প্রসেসর / কোরগুলির সুবিধা গ্রহণ করে না - যেহেতু এর জন্য নেটিভ থ্রেডের প্রয়োজন হবে! যেহেতু তারা ওএস দ্বারা নির্ধারিত ছিল না, তারা কার্নেল থ্রেডের চেয়ে বেশি কর্টিনগুলির মতো ছিল। সবুজ থ্রেডগুলি যা জাভা ব্যবহার করা হয়েছিল যতক্ষণ না জাভা 1.2 তে প্রবর্তিত হয়েছিল।

থ্রেডগুলি সম্পদ গ্রহণ করে। জেভিএম-এ, প্রতিটি থ্রেডের নিজস্ব স্ট্যাক থাকে, সাধারণত 1MB আকারের। 64 কে হ'ল জেভিএম-তে প্রতিটি থ্রেডের জন্য অনুমোদিত স্ট্যাক স্পেসের সর্বনিম্ন পরিমাণ। থ্রেড স্ট্যাকের আকারটি JVM এর জন্য কমান্ড লাইনে কনফিগার করা যেতে পারে। নাম সত্ত্বেও, থ্রেডগুলি নিখরচায় নয়, প্রতিটি থ্রেডের মতো নিজস্ব ব্যবহারের সংস্থান যেমন থ্রেড-লোকাল স্টোরেজ (যদি থাকে) এবং থ্রেড শিডিয়ুলিং / কনটেক্সট-স্যুইচিং / সিপিইউ ক্যাশে অবৈধকরণের প্রয়োজন হয়। এটি কর্টিনগুলি অত্যন্ত কার্যসম্পর্কিত অ্যাপ্লিকেশনগুলির জন্য পারফরম্যান্সের জন্য জনপ্রিয় হওয়ার কারণটির একটি অংশ।

ম্যাক ওএস কেবল একটি প্রক্রিয়াটিকে প্রায় 2000 থ্রেড বরাদ্দ করতে দেয় এবং লিনাক্স প্রতি থ্রেডে 8 এমবি স্ট্যাক বরাদ্দ করে এবং কেবলমাত্র বহু থ্রেডের জন্য অনুমতি দেবে যা শারীরিক র‍্যামের সাথে উপযুক্ত হবে।

অতএব, থ্রেডগুলি সবচেয়ে ভারী ওজন (মেমরির ব্যবহার এবং প্রসঙ্গ-স্যুইচিং সময়ের ক্ষেত্রে), তারপরে কর্টাইনগুলি এবং অবশেষে জেনারেটরগুলি সবচেয়ে হালকা ওজন।


2
+1, তবে এই উত্তরটি কিছু উল্লেখ থেকে উপকৃত হতে পারে।
কোজিরো

1
সবুজ থ্রেডগুলি কর্টিনগুলির চেয়ে কিছু আলাদা। তারা না? এমনকি তন্তুগুলির মধ্যে কিছু পার্থক্য রয়েছে। দেখতে programmers.stackexchange.com/questions/254140/...

112

প্রায় 7 বছর দেরীতে, তবে এখানে উত্তরগুলি সহ-রুটিন বনাম থ্রেডের কিছু প্রসঙ্গ অনুপস্থিত। কেন কর্টাইনগুলি ইদানীং এত মনোযোগ পাচ্ছে এবং আমি কখন থ্রেডগুলির সাথে তুলনা করব ?

প্রথমত যদি কর্টিনগুলি একই সাথে চালিত হয় (কখনও কখনও সমান্তরালে হয় না ) তবে কেন কেউ তাদের থ্রেডের চেয়ে পছন্দ করবে?

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

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

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

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

আপনার রুটিনগুলি এখন একে অপরের মধ্যে পূর্ব নির্ধারিত পয়েন্টগুলির মধ্যে স্যুইচ করে আপনি এখন ভাগ করে নেওয়া ডেটা স্ট্রাকচারগুলিতে লক করা এড়াতে পারবেন (কারণ আপনি আপনার কোডটি কোনও সমালোচনামূলক বিভাগের মাঝখানে অন্য কোনও কর্টিনে স্যুইচ করতে বলবেন না)

আরেকটি সুবিধা হ'ল মেমরির ব্যবহার অনেক কম। থ্রেডযুক্ত-মডেলটির সাথে প্রতিটি থ্রেডের নিজস্ব স্ট্যাক বরাদ্দ করা দরকার, এবং সুতরাং আপনার মেমরির ব্যবহার আপনার থ্রেডের সংখ্যার সাথে রৈখিকভাবে বৃদ্ধি পাবে। সহ-রুটিনগুলির সাথে, আপনার যে স্মৃতি ব্যবহারের সাথে রুটিনের সংখ্যা রয়েছে তার সরাসরি সম্পর্ক নেই।

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


2
যখন আমরা কোনও ব্লকিং অপারেশনের মুখোমুখি হই তখন কর্টাইনগুলিতে অন্য কোনও কার্যে স্যুইচিং কীভাবে করা যায়?
নার্সিস ডুডিউ সিয়েউ

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

@ মার্টিনকোননি আপনার সাম্প্রতিক পদ্ধতির সাথে সাম্প্রতিক সি ++ থ্রেডস টিএস কি মেনে চলছে?
নিকস 21

সুতরাং অবশেষে একটি আধুনিক প্রোগ্রামিং ভাষার উভয়ই কর্টিন / ফাইবারগুলির প্রয়োজন হবে দক্ষতার জন্য একটি সিপিইউ কোর ব্যবহারের জন্য যেমন আইও এবং থ্রেডসের মতো অ-গননা-ভারী ক্রিয়াকলাপ গতি অর্জনের জন্য বহু কোরে সিপিইউ নিবিড় ক্রিয়াকে সমান্তরাল করে তো?
মহাত্মা_ফাতাল_অরর

19

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

অনেক থ্রেড বাস্তবায়ন আসলে কর্টিনগুলির মতো।


9

এটি আপনি যে ভাষাটি ব্যবহার করছেন তার উপর নির্ভর করে। উদাহরণস্বরূপ লুয়ায় তারা একই জিনিস (একটি ভেরিয়েবলের ধরণের কর্টিন বলা হয় thread)।

সাধারণত যদিও কর্টাইনগুলি স্বেচ্ছাসেবী উত্পাদনশীলতা প্রয়োগ করে (আপনি) প্রোগ্রামার কোথায় কোথায় yield, অর্থাৎ অন্য কোনও রুটিনের নিয়ন্ত্রণ দেয় তা স্থির করে।

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


0

আলোচনার জন্য 12 বছর দেরি হলেও একটি কর্টিনের নামটির ব্যাখ্যা রয়েছে। কর্টিনকে কো এবং রুটিনে পচে যেতে পারে।

এই প্রসঙ্গে একটি রুটিন কেবল ক্রিয়াকলাপ / ক্রিয়াকলাপ এবং একটি ক্রমাগত সঞ্চালন / প্রক্রিয়াজাতকরণের দ্বারা ক্রিয়াকলাপের ক্রম নির্দিষ্টভাবে একই নির্দিষ্ট ক্রমে নির্ধারিত হয়।

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

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

একটি জিনিস সত্য নয় যে সহ-রুটিনগুলি একই সাথে কার্যকর করা যায় না এবং বর্ণের পরিস্থিতি ঘটতে পারে না। এটি কো-রুটিনগুলি চলছে এমন সিস্টেমে নির্ভর করে এবং সহ-রুটিনগুলি চিত্রকরণ করা সহজ।

সহ-রুটিনগুলি কীভাবে তাদের স্থগিত করে তা বিবেচ্য নয়। উইন্ডোতে ফিরে 3.1 ইন্ট 03 কোনও প্রোগ্রামের মধ্যে বোনা ছিল (বা সেখানে রাখা উচিত ছিল) এবং সি # তে আমরা ফলন যোগ করি।

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