থ্রেডস বনাম প্রক্রিয়াগুলি লিনাক্সে


252

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

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


লিনাক্স ২.৪ এর সাথে কি পার্থক্য রয়েছে?
মাউভিচিয়েল

3
লিনাক্স ২.৪ এর অধীনে প্রক্রিয়া এবং থ্রেডের মধ্যে পার্থক্য হ'ল থ্রেডগুলি তাদের রাজ্যের অনেকগুলি অংশ (ঠিকানা স্থান, ফাইল হ্যান্ডলগুলি ইত্যাদি) প্রক্রিয়াগুলির চেয়ে ভাগ করে, যা সাধারণত হয় না। লিনাক্স ২.6 এর অধীনে এনপিটিএল তাদের "থ্রেড গ্রুপগুলি" দিয়ে কিছুটা পরিষ্কার করে দেয় যা উইন 32 এবং সোলারিসে "প্রক্রিয়া" এর মতো কিছুটা।
MarkR

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

1
@ লুটজপ্রચેলেট - একযোগে প্রোগ্রামিং মাল্টি-থ্রেড পাশাপাশি মাল্টি-প্রসেসও হতে পারে। আপনি দেখতে পাচ্ছেন না কেন আপনি সমবর্তী প্রোগ্রামিং কেবলমাত্র একাধিক থ্রেডযুক্ত বলে ধরে নিচ্ছেন। এটি কিছু নির্দিষ্ট ভাষার সীমাবদ্ধতার কারণে হতে পারে তবে সাধারণভাবে এটি উভয়ই হতে পারে।
iankit

2
আমি লুটজকে কেবল সংযুক্ত করেছি যে প্রসারণ বা থ্রেড - যেগুলি বেছে নেওয়া হয়েছে সমবর্তী প্রোগ্রামিংগুলি কঠিন, তবে সেই প্রক্রিয়াগুলি ব্যবহার করে সমবর্তী প্রোগ্রামিং অনেক ক্ষেত্রে সহজেই ডিবাগিংয়ের পক্ষে করে তোলে।
ব্যবহারকারী2692263

উত্তর:


322

লিনাক্স 1-1 থ্রেডিং মডেল ব্যবহার করে, (কার্নেলের সাথে) প্রক্রিয়া এবং থ্রেডের মধ্যে কোনও পার্থক্য নেই - সবকিছু কেবল একটি চলমান কাজ task *

লিনাক্সে, সিস্টেম কলটি cloneভাগ করে নেওয়ার যোগ্য একটি কনফিগার স্তরের সাথে একটি কাজকে ক্লোন করে দেয়:

  • CLONE_FILES: একই ফাইল বর্ণনাকারী টেবিল ভাগ করুন (একটি অনুলিপি তৈরির পরিবর্তে)
  • CLONE_PARENT: নতুন টাস্ক এবং পুরানোের মধ্যে পিতা-মাতার সম্পর্ক স্থাপন করবেন না (অন্যথায়, সন্তানের getppid()= পিতামাতার getpid())
  • CLONE_VM: একই মেমরি স্পেস ভাগ করুন (একটি COW অনুলিপি তৈরির পরিবর্তে )

fork()কল clone(অন্তত শেয়ারিং )এবং pthread_create()কল clone(সবচেয়ে শেয়ারিং )। **

forkpthread_createটেবিলগুলি অনুলিপি করা এবং মেমরির জন্য COW ম্যাপিং তৈরি করার কারণে আইএনআইয়ের চেয়ে কিছুটা বেশি ব্যয় হয় তবে লিনাক্স কার্নেল বিকাশকারীরা সেই ব্যয়গুলি হ্রাস করার চেষ্টা করেছেন (এবং সফল)।

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

প্রকৃতপক্ষে, আপনি যদি একটি মাল্টি-প্রসেসর সিস্টেমে থাকেন তবে ভাগ না করা আসলে কার্য সম্পাদনের পক্ষে উপকারী হতে পারে: যদি প্রতিটি কাজ একটি পৃথক প্রসেসরের উপর চলমান থাকে, তবে ভাগ করা মেমরি সিঙ্ক্রোনাইজ করা ব্যয়বহুল।


সরল। CLONE_THREADসংকেত বিতরণ ভাগ করে তোলে (যা প্রয়োজন CLONE_SIGHAND, যা সংকেত হ্যান্ডলার টেবিল ভাগ করে)।

** সরলীকৃত। উভয়ই আছে SYS_forkএবং SYS_cloneসিস্কলগুলি রয়েছে, তবে কার্নেলের মধ্যে sys_forkএবং sys_cloneউভয়ই একই do_forkফাংশনটির চারপাশে খুব পাতলা র‌্যাপার রয়েছে , যা নিজেই চারপাশে একটি পাতলা মোড়ক copy_process। হ্যাঁ, পদগুলি process, threadএবং taskলিনাক্স কার্নেলের পরিবর্তে পরিবর্তে ব্যবহৃত হয় ...


6
আমি মনে করি আমরা 1 পয়েন্ট মিস করছি। আপনি যদি নিজের ওয়েব সার্ভারের জন্য একাধিক প্রক্রিয়া তৈরি করেন, তবে আপনাকে সকেটটি খোলার জন্য আরও একটি প্রক্রিয়া লিখতে হবে এবং বিভিন্ন থ্রেডে 'কাজ' প্রেরণ করতে হবে। থ্রেডিং একক প্রক্রিয়া একাধিক থ্রেড, পরিষ্কার নকশা উপলব্ধ করে। অনেক পরিস্থিতিতে থ্রেড কেবল প্রাকৃতিক এবং অন্য পরিস্থিতিতে একটি নতুন প্রক্রিয়া ঠিক স্বাভাবিক। সমস্যাটি ধূসর অঞ্চলে পড়লে মহামান্য বর্ণিত অন্যান্য বাণিজ্য বন্ধগুলি গুরুত্বপূর্ণ হয়ে ওঠে।
সৌরভ

26
@ সৌরভ সত্যই নয় আপনি সহজেই করতে পারেন socket, bind, listen, fork, এবং তারপর একাধিক প্রসেস আছে acceptএকই শোনা সকেট উপর সংযোগ। কোনও প্রক্রিয়া ব্যস্ত থাকলে তা গ্রহণ করা বন্ধ করতে পারে এবং কার্নেল আগত সংযোগগুলিকে অন্য কোনও প্রক্রিয়াতে রুট করবে (যদি কেউ শুনছে না, কার্নেলটি listenব্যাকলগের উপর নির্ভর করে সারি বা ড্রপ করবে )। এর চেয়ে কাজের বিতরণে আপনার বেশি নিয়ন্ত্রণ নেই, তবে সাধারণত এটি যথেষ্ট ভাল!
প্রতীকী

2
@ ব্লাডকাউন্ট লিনাক্সের সমস্ত প্রক্রিয়া / থ্রেডগুলি একই প্রক্রিয়া দ্বারা তৈরি করা হয়, যা বিদ্যমান প্রক্রিয়া / থ্রেডকে ক্লোন করে। clone()কোন সংস্থানগুলি ভাগ করা হয়েছে তা নির্ধারণ করার জন্য পতাকা উত্তীর্ণ হয়েছে । একটি কার্য unshare()সময় পরবর্তী যে কোনও সময়ে সংস্থান করতে পারে ।
মুহুর্তের

4
@ কার্তিকবলাগুরু কর্নেলের মধ্যেই task_structপ্রতিটি কাজের জন্য একটি ব্যবস্থা রয়েছে। এটিকে প্রায়শই কার্নেল কোড জুড়ে একটি "প্রক্রিয়া" বলা হয় তবে এটি প্রতিটি চলমান থ্রেডের সাথে মিলে যায়। নেই process_struct; যদি গুলিগুলির একটি গোছা task_structতাদের thread_groupতালিকার সাথে সংযুক্ত থাকে তবে তারা ব্যবহারকারীর ক্ষেত্রে একই "প্রক্রিয়া"। "থ্রেড" গুলিগুলির সামান্য কিছু বিশেষ হ্যান্ডলিং রয়েছে, উদাহরণস্বরূপ সমস্ত ভাইবাল থ্রেড কাঁটাচামচ এবং এক্সিকিউটে বন্ধ করা হয় এবং কেবল "মূল" থ্রেডটি এতে দেখায় ls /proc। প্রতিটি থ্রেড /proc/pidযদিও এর মাধ্যমে তালিকাভুক্ত হয়েছে কিনা তা এর মাধ্যমে অ্যাক্সেসযোগ্য /proc
প্রশংসাপত্র

5
@ কার্তিকবলাগুরু কর্নেল থ্রেড এবং প্রক্রিয়াগুলির মধ্যে আচরণের ধারাবাহিকতা সমর্থন করে; উদাহরণস্বরূপ, clone(CLONE_THREAD | CLONE_VM | CLONE_SIGHAND))আপনাকে একটি নতুন "থ্রেড" দেবে যা ওয়ার্কিং ডিরেক্টরি, ফাইল বা লকগুলি ভাগ করে না, যখন clone(CLONE_FILES | CLONE_FS | CLONE_IO)আপনাকে একটি "প্রক্রিয়া" দেয় would অন্তর্নিহিত সিস্টেম ক্লোনিংয়ের মাধ্যমে কার্য তৈরি করে; fork()এবং pthread_create()কেবল লাইব্রেরির ফাংশন যা clone()আলাদাভাবে আবেদন করে (যেমন আমি এই উত্তরে লিখেছি)।
প্রশংসাপত্র

60

লিনাক্স (এবং প্রকৃতপক্ষে ইউনিক্স) আপনাকে একটি তৃতীয় বিকল্প দেয়।

বিকল্প 1 - প্রক্রিয়া

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

বিকল্প 2 - থ্রেড

একটি স্ট্যান্ডেলোন এক্সিকিউটেবল তৈরি করুন যা একক থ্রেড দিয়ে শুরু হয় এবং কিছু কাজ করার জন্য অতিরিক্ত থ্রেড তৈরি করে

বিকল্প 3 - কাঁটাচামচ

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

যাইহোক, মেমরির পৃষ্ঠাগুলি অনুলিপি করা হয় না, সেগুলি অনুলিপি করে লেখা হয়, তাই সাধারণত আপনি যা ভাবেন তার চেয়ে কম স্মৃতি ব্যবহৃত হয়।

একটি ওয়েব সার্ভার প্রোগ্রাম বিবেচনা করুন যা দুটি পদক্ষেপ নিয়ে গঠিত:

  1. কনফিগারেশন এবং রানটাইম ডেটা পড়ুন
  2. পৃষ্ঠা অনুরোধ পরিবেশন করুন

আপনি যদি থ্রেড ব্যবহার করেন তবে পদক্ষেপ 1 একবার হয়ে যাবে এবং দ্বিতীয় ধাপটি একাধিক থ্রেডে সম্পন্ন হবে। আপনি যদি "traditionalতিহ্যবাহী" প্রক্রিয়াগুলি ব্যবহার করেন তবে প্রতিটি প্রক্রিয়াটির জন্য 1 এবং 2 পদক্ষেপের পুনরাবৃত্তি করা প্রয়োজন এবং কনফিগারেশন এবং রানটাইম ডেটা সদৃশ সঞ্চয় করতে মেমরির প্রয়োজন হবে। যদি আপনি কাঁটাচামচ () ব্যবহার করেন, তবে আপনি একবার পদক্ষেপ 1 এবং তারপরে কাঁটাচামচ () করতে পারেন, রানটাইম ডেটা এবং কনফিগারেশনটি মেমরিতে রেখেছেন, অনিচ্ছুক, অনুলিপি করা হয়নি।

সুতরাং সত্যিই তিনটি পছন্দ আছে।


7
@ কিওয়ার্টি কাঁটাচলা এটি খুব শীতল নয়, এটি সূক্ষ্ম উপায়ে প্রচুর লাইব্রেরিগুলি ভেঙে দেয় (যদি আপনি সেগুলি প্যারেন্ট প্রসেসে ব্যবহার করেন)। এটি অপ্রত্যাশিত আচরণ তৈরি করে যা অভিজ্ঞ প্রোগ্রামারগুলিকেও বিভ্রান্ত করে।
মার্কআর

2
@ মারকআর আপনি কি কিছু উদাহরণ বা একটি লিঙ্ক দিতে পারেন যে কীভাবে ফোর্কিং লাইব্রেরি ভাঙে এবং অপ্রত্যাশিত আচরণ সৃষ্টি করে?
এহতেশ চৌধুরী

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

1
ফোর্ক () সিস্টেম কলটি পসিক্স (যার অর্থ এটি কোনও ইউনিক্স সিস্টেমে উপলব্ধ) দ্বারা নির্দিষ্ট করা হয়েছে, যদি আপনি অন্তর্নিহিত লিনাক্স এপিআই ব্যবহার করেন যা ক্লোন () সিস্টেম কল, তবে আপনার কাছে লিনাক্সে কেবল আরও তিনটি পছন্দ রয়েছে কেবল তিনটির চেয়ে ।
মিথ্যা রায়ান

2
@ মারকআর সকেট ভাগ করে নেওয়ার নকশা করে। তদ্ব্যতীত, প্রক্রিয়াগুলির কোনওটি সকেটে ক্লোজ () কল করার আগে linux.die.net/man/2/shutdown ব্যবহার করে সকেটটি বন্ধ করতে পারে ।
লেলানথ্রান

53

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

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

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


9
অ্যাডামের উত্তর কার্যনির্বাহী ব্রিফিংয়ের পাশাপাশি কাজ করবে। আরও বিশদের জন্য, মার্কআর এবং পূর্বসূরীরা ভাল ব্যাখ্যা সরবরাহ করে। উদাহরণ সহ একটি খুব বিশদ বিবরণ cs.cf.ac.uk/Dave/C/node29.html পাওয়া যেতে পারে তবে এটি অংশে কিছুটা তারিখযুক্ত বলে মনে হচ্ছে।
সাইবারফোনিক

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

আইপিসি ব্যবহার করা শক্ত তবে কেউ যদি "শেয়ার্ড মেমোরি" ব্যবহার করেন তবে কী করবেন?
অভিহোর

11

অন্যরা বিবেচনা নিয়ে আলোচনা করেছেন।

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


9

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

সমসাময়িক লিনাক্সে (২.6.x) থ্রেডের তুলনায় প্রক্রিয়াটির প্রসঙ্গের সুইচ-এর মধ্যে পারফরম্যান্সে খুব বেশি পার্থক্য নেই (থ্রেডের জন্য কেবলমাত্র এমএমইউ স্টাফ অতিরিক্ত)। ভাগ করা ঠিকানা স্থান নিয়ে সমস্যা আছে যার অর্থ একটি থ্রেডের ত্রুটিযুক্ত পয়েন্টার প্যারেন্ট প্রক্রিয়াটির স্মৃতি বা একই ঠিকানার জায়গার মধ্যে অন্য কোনও থ্রেডকে দূষিত করতে পারে।

একটি প্রক্রিয়া এমএমইউ দ্বারা সুরক্ষিত, সুতরাং একটি ত্রুটিযুক্ত পয়েন্টার কেবল একটি সংকেত 11 সৃষ্টি করবে এবং কোনও দুর্নীতি হবে না।

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

আপনি কেন ভাবেন যে লিনাক্সে থ্রেডগুলির এত বড় পারফরম্যান্স লাভ রয়েছে? আপনি কি এই জন্য কোন তথ্য আছে, বা এটি কি একটি মিথ?


1
হ্যাঁ, আমার কাছে কিছু তথ্য আছে। আমি একটি পরীক্ষা চালিয়েছি যা 100,000 প্রক্রিয়া তৈরি করে এবং 100,000 থ্রেড তৈরি করে এমন একটি পরীক্ষা করে। থ্রেড সংস্করণটি প্রায় 9x দ্রুত (প্রক্রিয়াগুলির জন্য 17.38 সেকেন্ড, থ্রেডগুলির জন্য 1.93) দৌড়েছিল। এখন এটি কেবল সৃষ্টির সময় পরীক্ষা করে তবে স্বল্প-কালীন কাজের জন্য সৃষ্টির সময়টি মূল হতে পারে।
ব্যবহারকারী 17918

4
@ ইউজার 17918 - উপরে বর্ণিত সময়গুলি গণনা করার জন্য আপনার দ্বারা ব্যবহৃত কোডটি ভাগ করে নেওয়া কি সম্ভব ..
কোডিংফ্রেইক

একটি বড় ভিন্ন, প্রক্রিয়াগুলির সাথে কার্নেল প্রতিটি প্রক্রিয়াটির জন্য পৃষ্ঠা সারণী তৈরি করে এবং থ্যাডগুলি কেবল একটি পৃষ্ঠার টেবিল ব্যবহার করে, তাই আমার মনে হয় যে থ্রেডগুলি তত দ্রুত হয় প্রক্রিয়াগুলি
c4f4t0r

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

5

আপনার কাজগুলি কতটা দৃly়তার সাথে মিলিত হয়েছে?

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


4

বিষয়গুলিকে আরও জটিল করার জন্য থ্রেড-লোকাল স্টোরেজ এবং ইউনিক্স ভাগ করে নেওয়া মেমরির মতো জিনিস রয়েছে ।

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

ভাগ করা মেমরি আপনাকে (স্পষ্টতই) একাধিক প্রক্রিয়া একই মেমোরিতে অ্যাক্সেস করার পারফরম্যান্স সুবিধা দিতে পারে, তবে প্রসেসগুলি সঠিকভাবে সিঙ্ক্রোনাইজ করার ব্যয় / ঝুঁকিতে। এটি করার একটি উপায় হ'ল একটি প্রক্রিয়া ভাগ করা মেমরিতে একটি ডাটা স্ট্রাকচার তৈরি করে এবং তারপরে traditionalতিহ্যবাহী আন্ত-প্রক্রিয়া যোগাযোগের মাধ্যমে (নামযুক্ত পাইপের মতো) সেই কাঠামোটিতে একটি হ্যান্ডেল প্রেরণ করে।


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

4

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


3

আপনি যা শুনেছেন তার সাথে আমাকে একমত হতে হবে। যখন আমরা আমাদের ক্লাস্টারটিকে ( xhplএবং এ জাতীয়) বেঞ্চমার্ক করি , আমরা সর্বদা থ্রেডগুলির প্রক্রিয়াগুলির সাথে উল্লেখযোগ্যভাবে আরও ভাল পারফরম্যান্স পাই।</anecdote>


3

থ্রেড / প্রক্রিয়াটির মধ্যে সিদ্ধান্ত আপনি কী ব্যবহার করবেন তা তার উপরে কিছুটা নির্ভর করে। প্রক্রিয়াটির সাথে একটি সুবিধা হ'ল এটির একটি পিআইডি রয়েছে এবং পিতামাতাকে ছাড়াই মেরে ফেলা যায়।

ওয়েব সার্ভারের বাস্তব বিশ্বের উদাহরণের জন্য, অ্যাপাচি ১.৩ কেবলমাত্র একাধিক প্রক্রিয়া সমর্থন করে তবে 2.0 তে তারা একটি বিমূর্ততা যুক্ত করেছিল যাতে আপনি উভয়ের মধ্যেই পরিবর্তন করতে পারেন। মন্তব্য বলে মনে হয় করতে সম্মত হন যে প্রসেস আরো জোরালো কিন্তু থ্রেড একটু দিতে পারেন ভাল পারফরম্যান্স বিট (কোথায় জানালা প্রসেসের জন্য কর্মক্ষমতা sucks ছাড়া এবং আপনি শুধুমাত্র থ্রেড ব্যবহার করতে চান)।


2

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


আপনি কোন লাভ বলতে কি বোঝায়? জিইউআই থ্রেডে ভারী গণনা সম্পাদন সম্পর্কে কীভাবে? তাদের সমান্তরাল থ্রেডে সরানো ব্যবহারকারীর অভিজ্ঞতার বিন্দু থেকে অনেক বেশি ভাল হবে, সিপিইউ লোড হওয়া কোনও বিষয় নয়।
olegst

2

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


2

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

"প্রক্রিয়া বা থ্রেড প্রয়োগকারী কোনও অভ্যন্তরীণ কাঠামো নেই, পরিবর্তে একটি স্ট্রাক্ট টাস্ক_স্ট্রাক্ট রয়েছে যা টাস্ক নামে একটি বিমূর্ত শিডিউলিং ইউনিট বর্ণনা করে"

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

লিনাক্স কার্নেল ডকুমেন্টেশনের সম্পূর্ণ ক্রেডিট


-3

আপনার যদি সংস্থানগুলি ভাগ করে নেওয়া দরকার তবে আপনার থ্রেডগুলি ব্যবহার করা উচিত।

থ্রেডগুলির মধ্যে প্রসঙ্গের সুইচগুলি প্রক্রিয়াগুলির মধ্যে প্রসঙ্গের সুইচগুলির তুলনায় অনেক কম ব্যয়বহুল তাও বিবেচনা করুন।

আপনার কাছে যদি করার কোনও ভাল কারণ না থাকে তবে আমি স্পষ্টভাবে পৃথক প্রক্রিয়াগুলির সাথে যাওয়ার কোনও কারণ দেখতে পাই না (সুরক্ষা, প্রমাণিত পারফরম্যান্স পরীক্ষা, ইত্যাদি ...)


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