থ্রেডগুলি একই পিআইডি ভাগ করে নিলে কীভাবে তাদের সনাক্ত করা যায়?


101

লিনাক্সে থ্রেড প্রয়োগের সাথে সম্পর্কিত আমার একটি প্রশ্ন রয়েছে।

লিনাক্সের সুস্পষ্ট থ্রেড সমর্থন নেই। ইউজার স্পেসে আমরা থ্রেড তৈরির জন্য থ্রেড লাইব্রেরি (এনপিটিএলের মতো) ব্যবহার করতে পারি। এখন আমরা যদি এনপিটিএল ব্যবহার করি তবে এটি 1: 1 ম্যাপিং সমর্থন করে।

কার্নেল clone()থ্রেড প্রয়োগ করতে ফাংশনটি ব্যবহার করবে ।

ধরুন আমি 4 টি থ্রেড তৈরি করেছি। তারপরে এর অর্থ হবে:

  • 4 হবে task_struct
  • এর ভিতরে task_struct, ক্লোন করার পক্ষে যুক্তি অনুসারে সংস্থানগুলি সংস্থান করার বিধান থাকবে (CLONE_VM | CLONE_FS | CLONE_FILES | CLONE_SIGHAND)

এখন আমার নীচের প্রশ্নগুলি রয়েছে:

  1. 4 টি থ্রেডের কি একই পিআইডি থাকবে? যদি কেউ বিশদভাবে বলতে পারেন, পিআইডি কীভাবে ভাগ করা হয়।
  2. বিভিন্ন থ্রেডগুলি কীভাবে চিহ্নিত করা যায়; কিছু টিআইডি (থ্রেড আইডি) ধারণা আছে?

উত্তর:


282

চারটি থ্রেডের একই পিআইডি থাকবে তবে কেবল উপরের থেকে দেখা হবে viewed কি আপনি (ক ব্যবহারকারী হিসাবে) একটি PID কল কি কার্নেল (নীচের থেকে খুঁজছি) একটি PID আহ্বান নয়।

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

সরলতার সাথে, যখন একটি নতুন প্রক্রিয়া তৈরি করা হয়, এটি একটি থ্রেড হিসাবে উপস্থিত হয় যেখানে পিআইডি এবং টিজিআইডি উভয়ই একই (নতুন) সংখ্যা।

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

এইভাবে, কার্নেল সুখের সাথে থ্রেডগুলি নির্ধারণ করতে পারে যে তারা কোন প্রক্রিয়াধীন তার থেকে পৃথক, যখন প্রক্রিয়াগুলি (থ্রেড গ্রুপ আইডি) আপনাকে জানানো হয়।

নিম্নলিখিত থ্রেডের শ্রেণিবিন্যাস সাহায্য করতে পারে (ক) :

                      USER VIEW
 <-- PID 43 --> <----------------- PID 42 ----------------->
                     +---------+
                     | process |
                    _| pid=42  |_
                  _/ | tgid=42 | \_ (new thread) _
       _ (fork) _/   +---------+                  \
      /                                        +---------+
+---------+                                    | process |
| process |                                    | pid=44  |
| pid=43  |                                    | tgid=42 |
| tgid=43 |                                    +---------+
+---------+
 <-- PID 43 --> <--------- PID 42 --------> <--- PID 44 --->
                     KERNEL VIEW

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


(ক) আমার চিত্তাকর্ষক গ্রাফিকাল দক্ষতা দেখে বিস্মিত হওয়া :-)


20
অবগতির জন্য, getpid()আয় tgid: asmlinkage long sys_getpid(void) { return current->tgid;}, যেমন দেখানো www.makelinux.com/
ডিউক

6
@ ডুক - বাহ, সুতরাং আমি কোনও gettgid(2)ফাংশন খুঁজে পাইনি । এবং getpid()টিআইডি (থ্রেডের "পিআইডি") ফিরিয়ে দেবে না, এবং সেখানেই gettid(2)আসে This
টমাসজ গ্যান্ডোর

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

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

গ্রুপ আইডি পেতে '' getpgrp ''
Pengcheng

2

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

দ্রষ্টব্য: এটি আমার কার্নেল ২.6.৩6 এর স্মরণ থেকে। বর্তমান কার্নেল সংস্করণগুলিতে আমার কাজ I / O স্তরটিতে রয়েছে তাই আমি জানি না যে এর পরে পরিবর্তন হয়েছে কিনা।


লিনাক্স ২.৪-এর একটি ব্যাখ্যা এখানে আপনি দরকারী ইউনিক্স.স্ট্যাকেক্সেঞ্জাও.এ
64৪64663

-6

লিনাক্স fork()প্রসেসটির নকল করার প্রথাগত কার্যকারিতা সহ সিস্টেম কল সরবরাহ করে। লিনাক্স clone()সিস্টেম কল ব্যবহার করে থ্রেড তৈরির ক্ষমতাও সরবরাহ করে তবে লিনাক্স প্রক্রিয়া এবং থ্রেডের মধ্যে পার্থক্য করে না।

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