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


65

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

যাইহোক, আমি একটি বিন্দুতে পৌঁছে গিয়েছিলাম যখন এটি আমার লিনাক্স শেল আউটপুটে যা উত্পাদন করে তা থেকে আলাদা হয়। পৃষ্ঠায় 92 (দর্শকের 116), অধ্যায় 4.5 জিএনইউ / লিনাক্স থ্রেড বাস্তবায়ন এই বিবৃতিটি সহ অনুচ্ছেদে শুরু হবে:

জিএনইউ / লিনাক্সে পসিক্স থ্রেডের প্রয়োগ অনেকগুলি ইউএনআইএক্স-এর মতো সিস্টেমে গুরুত্বপূর্ণভাবে থ্রেড প্রয়োগের থেকে পৃথক: জিএনইউ / লিনাক্সে, থ্রেডগুলি প্রক্রিয়া হিসাবে প্রয়োগ করা হয়।

এটি একটি মূল পয়েন্টের মতো বলে মনে হচ্ছে এবং পরে এটি একটি সি কোড সহ চিত্রিত হয়েছে। বইয়ের আউটপুটটি হ'ল:

main thread pid is 14608
child thread pid is 14610

এবং আমার উবুন্টুতে 16.04 এ:

main thread pid is 3615
child thread pid is 3615

ps আউটপুট এটি সমর্থন করে।

আমার ধারণা 2001 ও এখনকার মধ্যে অবশ্যই কিছু পরিবর্তন হয়েছে।

পরের পৃষ্ঠায় পরবর্তী সাবচ্যাপ্টার, 4.5.1 সিগন্যাল হ্যান্ডলিং, পূর্ববর্তী বিবৃতিতে তৈরি করে:

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

এবং দেখে মনে হচ্ছে এটি পরে আরও বইটিতে গুরুত্বপূর্ণ হবে be এখানে কি চলছে কেউ ব্যাখ্যা করতে পারেন?

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

এটি সি কোড:

#include <pthread.h>
#include <stdio.h>
#include <unistd.h>

void* thread_function (void* arg)
{
    fprintf (stderr, "child thread pid is %d\n", (int) getpid ());
    /* Spin forever. */
    while (1);
    return NULL;
}

int main ()
{
    pthread_t thread;
    fprintf (stderr, "main thread pid is %d\n", (int) getpid ());
    pthread_create (&thread, NULL, &thread_function, NULL);
    /* Spin forever. */
    while (1);
    return 0;
}

1
আপনার বিভ্রান্তির উত্স কী তা আমি পাই না। থ্রেডগুলি তাদের পিতামাতার সাথে ঠিকানা স্থান ভাগ করে নেওয়ার প্রক্রিয়া হিসাবে প্রয়োগ করা হয়।
জোহান ম্যারেইন

2
@ জোহানমায়রেন তবে থ্রেড পিডস কেন সমান?
টমাসজ

আহ, এখন দেখছি। হ্যাঁ, সত্যিই কিছু পরিবর্তন হয়েছে। @ ইলক্কাচুর উত্তর দেখুন।
জোহান ম্যারেইন

5
থ্রেডগুলি এখনও প্রক্রিয়া হিসাবে প্রয়োগ করা হয় - তবে এখন থ্রেড গ্রুপ আইডিgetpid বলা হবে এবং আপনার ব্যবহার করা প্রয়োজন এমন কোনও প্রক্রিয়ার জন্য একটি অনন্য আইডি পেতে এখন ফেরত দেয় । তবে, কার্নেল ব্যতীত, বেশিরভাগ লোক এবং সরঞ্জাম একটি থ্রেড গ্রুপকে একটি প্রক্রিয়া বলবে এবং অন্যান্য সিস্টেমের সাথে সঙ্গতি রাখার জন্য কোনও প্রক্রিয়াটিকে একটি থ্রেড বলে। gettid
ব্যবহারকারী 253751

আসলে তা না. একটি প্রক্রিয়া নিজস্ব মেমরি এবং ফাইল বর্ণনাকারী, এটি একটি থ্রেড কখনো বলা হয়, এমনটি হবে আছে মধ্যে অন্যান্য সিস্টেমের সঙ্গে সামঞ্জস্যপূর্ণ।
পুনরায় পোস্টার

উত্তর:


50

আমি মনে করি clone(2)ম্যান পৃষ্ঠার এই অংশটি পার্থক্যটি পরিষ্কার করতে পারে। পিআইডি:

CLONE_THREAD (যেহেতু লিনাক্স ২.৪.০-পরীক্ষা ৮)
CLONE_THREAD সেট করা থাকলে, শিশুটিকে কলিং প্রক্রিয়া হিসাবে একই থ্রেড গ্রুপে রাখা হয়।
একক পিআইডি ভাগ করে এমন থ্রেডের সেটগুলির পসিক্স থ্রেড ধারণাকে সমর্থন করার জন্য লিনাক্স ২.৪ এ থ্রেড গোষ্ঠীগুলি ছিল এমন একটি বৈশিষ্ট্য। অভ্যন্তরীণভাবে, এই ভাগ করা পিআইডি হ'ল থ্রেড গ্রুপের জন্য তথাকথিত থ্রেড গ্রুপ সনাক্তকারী (টিজিআইডি)) যেহেতু লিনাক্স ২.৪, গেটপিডে কল করা (২) কলারের টিজিআইডি ফিরিয়ে দেয়।

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

পুরানো বাস্তবায়নের ক্ষেত্রে সিগন্যাল হ্যান্ডলিং ছিল আরেকটি সমস্যাযুক্ত ক্ষেত্র, এটি কাগজে আরও বিস্তারিতভাবে বর্ণনা করা হয়েছে @ ফুফ তাদের উত্তরে উল্লেখ করে ।

মন্তব্যে উল্লিখিত হিসাবে, লিনাক্স 2.4 বইটি একই বছর 2001 সালে প্রকাশিত হয়েছিল, সুতরাং সংবাদটি যে মুদ্রণটি পায় নি অবাক হওয়ার কিছু নেই।


2
পৃথক প্রক্রিয়াগুলি যা কিছু ভাগ করা সংস্থান যেমন ভার্চুয়াল মেমরি বা ফাইল বিবরণকারী হিসাবে ঘটতে পারে। লিনাক্স থ্রেডগুলি কীভাবে কাজ করে তা এখনও বেশ কার্যকর, আপনি উল্লেখ করেছেন যে বিষয়গুলি পরিষ্কার করা হয়েছে with আমি বলব যে কার্নেল "থ্রেড" বা "প্রক্রিয়াগুলি" তে ব্যবহৃত শিডিয়ুলিং ইউনিটগুলি কল করা সত্যিই অপ্রাসঙ্গিক। তারা লিনাক্সকে কেবল "প্রক্রিয়া" নামে ডাকা শুরু করার অর্থ এই নয় যে কেবল তারা এখন রয়েছে।
অ্যান্ড্রু হেনেল

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

@ টমাস নোট করুন যে এই উত্তরটি লিনাক্স এখন কীভাবে কাজ করে তা ব্যাখ্যা করে। ইলকচু ইঙ্গিত হিসাবে, বইটি লেখার সময় এটি ভিন্নভাবে কাজ করেছিল। FooF এর উত্তর ব্যাখ্যা করে যে সেই সময়ে লিনাক্স কীভাবে কাজ করেছিল।
গিলস

38

আপনি ঠিকই বলেছেন, "2001 ও এখনকার মধ্যে অবশ্যই কিছু পরিবর্তন হয়েছে"। আপনি যে বইটি পড়ছেন বইটি লিনাক্সের উপর পসিক্স থ্রেডগুলির প্রথম historicalতিহাসিক প্রয়োগ হিসাবে লিনাক্সথ্রেডস নামে পরিচিত হয়েছে ( কিছুটির জন্য উইকিপিডিয়া নিবন্ধও দেখুন ) describes

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

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

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

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


22

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

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

সুতরাং দেখা যাচ্ছে যে সাম্প্রতিক কার্নেলের একটি পৃথক টিআইডি রয়েছে যা অনুসন্ধান করা যেতে পারে, এটি থ্রেডগুলির জন্য পৃথক, উপরের মূল () থ্রেড_ফংশান () এর প্রত্যেকটিতে এটি দেখানোর জন্য একটি উপযুক্ত কোড স্নিপেটটি হ'ল:

    long tid = syscall(SYS_gettid);
    printf("%ld\n", tid);

সুতরাং এটির সাথে পুরো কোডটি হ'ল:

#include <pthread.h>                                                                                                                                          
#include <stdio.h>                                                                                                                                            
#include <unistd.h>                                                                                                                                           
#include <syscall.h>                                                                                                                                          

void* thread_function (void* arg)                                                                                                                             
{                                                                                                                                                             
    long tid = syscall(SYS_gettid);                                                                                                                           
    printf("child thread TID is %ld\n", tid);                                                                                                                 
    fprintf (stderr, "child thread pid is %d\n", (int) getpid ());                                                                                            
    /* Spin forever. */                                                                                                                                       
    while (1);                                                                                                                                                
    return NULL;                                                                                                                                              
}                                                                                                                                                             

int main ()                                                                                                                                                   
{                                                                                                                                               
    pthread_t thread;                                                                               
    long tid = syscall(SYS_gettid);     
    printf("main TID is %ld\n", tid);                                                                                             
    fprintf (stderr, "main thread pid is %d\n", (int) getpid ());                                                    
    pthread_create (&thread, NULL, &thread_function, NULL);                                           
    /* Spin forever. */                                                                                                                                       
    while (1);                                                                                                                                                
    return 0;                                                                                                                                                 
} 

এর একটি উদাহরণ আউটপুট প্রদান:

main TID is 17963
main thread pid is 17963
thread TID is 17964
child thread pid is 17963

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

8

মূলত, আপনার বইয়ের তথ্যগুলি historতিহাসিকভাবে সঠিক, কারণ লিনাক্সের থ্রেডগুলির লজ্জাজনকভাবে খারাপ প্রয়োগের ইতিহাস। এসও সম্পর্কিত একটি প্রশ্নের উত্তরে আমার এই উত্তরও আপনার প্রশ্নের উত্তর হিসাবে কাজ করে:

https://stackoverflow.com/questions/9154671/distinction-between-processes-and-threads-in-linux/9154725#9154725

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

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

অন্যদিকে, "প্রক্রিয়া" এর POSIX অর্থে কোন পিআইডি হিসাবে বিবেচিত হয়, তাকে কার্নেলের একটি "থ্রেড গ্রুপ আইডি" বা "টিজিআইডি" বলা হয়। প্রতিটি প্রক্রিয়াতে তাদের নিজস্ব টিআইডি (কার্নেল পিআইডি) দিয়ে এক বা একাধিক থ্রেড (কার্নেল প্রসেস) থাকে, তবে সমস্ত একই টিজিআইডি ভাগ করে, যা প্রারম্ভিক থ্রেডের টিআইডি (কার্নেল পিআইডি) সমান main

যখন topআপনি থ্রেড দেখায়, এটা TIDs (কার্নেল PIDs), না PIDs (কার্নেল TGIDs) দেখাচ্ছে, এবং এই কারণেই প্রতিটি থ্রেড একটি পৃথক এক হয়েছে।

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


8

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

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

যদিও লিনাক্স ২.৪ টিজিআইডি প্রয়োগ করে, এটি বেশিরভাগ ক্ষেত্রে কেবল সম্পদ অ্যাকাউন্টের সুবিধার জন্য। অনেক ব্যবহারকারী এবং ব্যবহারকারীস্পেস টুল একসাথে সম্পর্কিত কাজগুলিকে একত্রে সক্ষম করতে এবং তাদের সংস্থান ব্যবহারের সাথে একসাথে রিপোর্ট করতে সক্ষম বলে কার্যকর মনে করে।

লিনাক্সে কার্যাদি বাস্তবায়ন ইউজারস্পেস সরঞ্জাম দ্বারা উপস্থাপিত প্রক্রিয়া এবং থ্রেড ওয়ার্ল্ড ভিউয়ের চেয়ে অনেক বেশি তরল।


কাগজ @FooF লিঙ্ক যেখানে কার্নেল পৃথক সত্বা হিসাবে প্রসেস ও থ্রেড (যেমন সংকেত হ্যান্ডলিং এবং Exec ()) বিবেচনা করতে হয়েছে পয়েন্ট একটি সংখ্যা বর্ণনা করে, তাই এটি পড়ার পর, আমি সত্যিই না বলতে হবে আছে যে "কোন ধরনের লিনাক্স কার্নেলের মধ্যে প্রক্রিয়া বা থ্রেড হিসাবে জিনিস ""
ইল্কাচ্চু

5

লিনাস টোরভাল্ডস ১৯৯ 1996 সালে একটি কার্নেল মেইলিং তালিকার পোস্টে বলেছিলেন যে "উভয় থ্রেড এবং প্রক্রিয়াগুলি 'মৃত্যুদণ্ডের প্রসঙ্গ' হিসাবে বিবেচিত হয়", এটি "সেই সিওইর রাজ্যের সমস্ত অংশের একত্রিত .... এটি সিপিইউয়ের মতো জিনিস অন্তর্ভুক্ত করে রাজ্য, এমএমইউ রাষ্ট্র, অনুমতি এবং বিভিন্ন যোগাযোগের রাজ্য (ফাইলগুলি, সিগন্যাল হ্যান্ডলারগুলি ইত্যাদি) ""

// simple program to create threads that simply sleep
// compile in debian jessie with apt-get install build-essential
// and then g++ -O4 -Wall -std=c++0x -pthread threads2.cpp -o threads2
#include <string>
#include <iostream>
#include <thread>
#include <chrono>

// how many seconds will the threads sleep for?
#define SLEEPTIME 100
// how many threads should I start?
#define NUM_THREADS 25

using namespace std;

// The function we want to execute on the new thread.
void threadSleeper(int threadid){
    // output what number thread we've created
    cout << "task: " << threadid << "\n";
    // take a nap and sleep for a while
    std::this_thread::sleep_for(std::chrono::seconds(SLEEPTIME));
}

void main(){
    // create an array of thread handles
    thread threadArr[NUM_THREADS];
    for(int i=0;i<NUM_THREADS;i++){
        // spawn the threads
        threadArr[i]=thread(threadSleeper, i);
    }
    for(int i=0;i<NUM_THREADS;i++){
        // wait for the threads to finish
        threadArr[i].join();
    }
    // program done
    cout << "Done\n";
    return;
}

আপনি দেখতে পাচ্ছেন যে এই প্রোগ্রামটি একবারে 25 টি থ্রেড ছড়িয়ে দেবে, যার প্রত্যেকটি 100 সেকেন্ডের জন্য ঘুমাবে এবং তারপরে আবার মূল প্রোগ্রামে যোগদান করবে। সমস্ত 25 টি থ্রেড প্রোগ্রামটিতে যোগদানের পরে, প্রোগ্রামটি হয়ে গেছে এবং প্রস্থান করবে।

ব্যবহার করে topআপনি "থ্রেড 2" প্রোগ্রামের 25 টি উদাহরণ দেখতে সক্ষম হবেন। তবে অপহরণের বোরিং। এর আউটপুটটি ps auwxআরও কম আকর্ষণীয় ... তবে কিন্ত আকর্ষণীয় ps -eLfহয়ে ওঠে।

UID        PID  PPID   LWP  C NLWP STIME TTY          TIME CMD
debian     689   687   689  0    1 14:52 ?        00:00:00 sshd: debian@pts/0  
debian     690   689   690  0    1 14:52 pts/0    00:00:00 -bash
debian    6217   690  6217  0    1 15:04 pts/0    00:00:00 screen
debian    6218  6217  6218  0    1 15:04 ?        00:00:00 SCREEN
debian    6219  6218  6219  0    1 15:04 pts/1    00:00:00 /bin/bash
debian    6226  6218  6226  0    1 15:04 pts/2    00:00:00 /bin/bash
debian    6232  6219  6232  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6233  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6234  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6235  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6236  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6237  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6238  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6239  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6240  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6241  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6242  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6243  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6244  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6245  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6246  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6247  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6248  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6249  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6250  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6251  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6252  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6253  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6254  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6255  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6256  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6232  6219  6257  0   26 15:04 pts/1    00:00:00 ./threads2
debian    6260  6226  6260  0    1 15:04 pts/2    00:00:00 ps -eLf

আপনি thread2প্রোগ্রামটি তৈরি করেছেন এমন 26 টি CoE গুলি এখানে দেখতে পাবেন । তারা সকলেই একই প্রক্রিয়া আইডি (পিআইডি) এবং প্যারেন্ট প্রসেস আইডি (পিপিআইডি) ভাগ করে তবে প্রত্যেকের আলাদা আলাদা এলডাব্লুপি আইডি থাকে (হালকা ওজন প্রক্রিয়া), এবং এলডাব্লুপি (এনএলডাব্লুপি) এর সংখ্যা 26 টি সিই রয়েছে তা নির্দেশ করে - মূল প্রোগ্রাম এবং 25 থ্রেড এটি দ্বারা প্রসারিত।


সঠিক, একটি থ্রেড হ'ল একটি লাইটওয়েট প্রক্রিয়া (এলডাব্লুপি)
এফএমপির্মফি

3

লিনাক্স প্রসেস এবং থ্রেড একই জিনিস এক ধরনের হয় । বলতে কোনটি তারা একই সিস্টেম কল দিয়ে তৈরি করা হয়: clone

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

লিনাক্সে থ্রেড এবং অবজেক্টগুলি কী ঘনিষ্ঠ করে তোলে তা হ'ল unshareসিস্টেম কল। ভাগ করা হিসাবে শুরু হওয়া কার্নেল অবজেক্টগুলি থ্রেড তৈরির পরে ভাগ করা যায় না। সুতরাং, উদাহরণস্বরূপ, একই প্রক্রিয়াটির দুটি থ্রেড থাকতে পারে যার আলাদা ফাইল বর্ণনাকারী স্থান রয়েছে (থ্রেডগুলি তৈরি হওয়ার পরে ফাইল বর্ণনাকারীদের ভাগ করে নেওয়ার মাধ্যমে)। unshareউভয় থ্রেডে কল করে এবং তারপরে সমস্ত ফাইল বন্ধ করে এবং উভয় থ্রেডে নতুন ফাইল, পাইপ বা বস্তু খোলার মাধ্যমে আপনি নিজে এটি পরীক্ষা করতে পারেন । তারপরে সন্ধান করুন /proc/your_proc_fd/task/*/fdএবং আপনি দেখতে পাবেন যে প্রতিটি task(যা আপনি থ্রেড হিসাবে তৈরি করেছেন) এর আলাদা আলাদা এফডি থাকবে।

প্রকৃতপক্ষে, নতুন থ্রেড এবং নতুন প্রক্রিয়াগুলির উভয়ই গ্রন্থাগার রুটিন যা cloneনীচের দিকে কল করে এবং সর্বাধিক নির্মিত প্রসেস-থ্রেড-টেক্সামজিগ (অর্থাত্‍ task) কলিং প্রক্রিয়া / থ্রেডের সাথে ভাগ করে নেবে এমন কোন কার্নেল বস্তুটি নির্দিষ্ট করে ।

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