पर प्रक्रियाओं और धागे के बीच भेद this answer पर पढ़ने के बाद और रॉबर्ट लव द्वारा "लिनक्स कर्नेल डेवलपमेंट" और बाद में, clone()
सिस्टम कॉल पर, मैंने पाया कि लिनक्स में प्रक्रियाएं और धागे कर्नेल के लिए लगभग अलग-अलग हैं । उनके बीच कुछ बदलाव हैं (उद्धृत एसओ प्रश्न में "अधिक साझाकरण" या "कम साझाकरण" होने के रूप में चर्चा की गई), लेकिन मेरे पास अभी तक कुछ प्रश्नों का उत्तर देने के लिए अभी भी कुछ प्रश्न हैं।लिनक्स
मैंने हाल ही में कुछ पॉज़िक्स धागे से जुड़े कार्यक्रम पर काम किया और इस आधार पर प्रयोग करने का फैसला किया। एक प्रक्रिया पर जो दो धागे बनाता है, पाठ्यक्रम के सभी धागे pthread_self()
, द्वारा द्वारा getpid()
द्वारा अनन्य मूल्य प्राप्त करते हैं।
एक नमूना कार्यक्रम मेरे द्वारा बनाए गए इस प्रकार है:
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include <unistd.h>
#include <pthread.h>
void* threadMethod(void* arg)
{
int intArg = (int) *((int*) arg);
int32_t pid = getpid();
uint64_t pti = pthread_self();
printf("[Thread %d] getpid() = %d\n", intArg, pid);
printf("[Thread %d] pthread_self() = %lu\n", intArg, pti);
}
int main()
{
pthread_t threads[2];
int thread1 = 1;
if ((pthread_create(&threads[0], NULL, threadMethod, (void*) &thread1))
!= 0)
{
fprintf(stderr, "pthread_create: error\n");
exit(EXIT_FAILURE);
}
int thread2 = 2;
if ((pthread_create(&threads[1], NULL, threadMethod, (void*) &thread2))
!= 0)
{
fprintf(stderr, "pthread_create: error\n");
exit(EXIT_FAILURE);
}
int32_t pid = getpid();
uint64_t pti = pthread_self();
printf("[Process] getpid() = %d\n", pid);
printf("[Process] pthread_self() = %lu\n", pti);
if ((pthread_join(threads[0], NULL)) != 0)
{
fprintf(stderr, "Could not join thread 1\n");
exit(EXIT_FAILURE);
}
if ((pthread_join(threads[1], NULL)) != 0)
{
fprintf(stderr, "Could not join thread 2\n");
exit(EXIT_FAILURE);
}
return 0;
}
(यह [gcc -pthread -o thread_test thread_test.c
] 64-बिट फेडोरा को संकलित किया गया; pthread_t
<bits/pthreadtypes.h>
से प्राप्त के लिए इस्तेमाल किया 64-बिट प्रकार की वजह से, कोड नाबालिग की आवश्यकता होगी परिवर्तन 32-बिट संस्करणों पर संकलित करने के लिए)
उत्पादन मैं इस प्रकार है:।
[[email protected] ~]$ ./thread_test
[Process] getpid() = 28549
[Process] pthread_self() = 140050170017568
[Thread 2] getpid() = 28549
[Thread 2] pthread_self() = 140050161620736
[Thread 1] getpid() = 28549
[Thread 1] pthread_self() = 140050170013440
[[email protected] ~]$
schedu का उपयोग करके ler gdb
में ताला लगा, मैं कार्यक्रम और उसके धागे जिंदा रख सकते हैं तो मैं पर कब्जा कर सकते हैं क्या top
कहते हैं, जो, सिर्फ दिखा प्रक्रियाओं, है:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28602 bean 20 0 15272 1112 820 R 0.4 0.0 0:00.63 top
2036 bean 20 0 108m 1868 1412 S 0.0 0.0 0:00.11 bash
28547 bean 20 0 231m 16m 7676 S 0.0 0.4 0:01.56 gdb
28549 bean 20 0 22688 340 248 t 0.0 0.0 0:00.26 thread_test
28561 bean 20 0 107m 1712 1356 S 0.0 0.0 0:00.07 bash
और जब धागे दिखा रहा है, का कहना है:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28617 bean 20 0 15272 1116 820 R 47.2 0.0 0:00.08 top
2036 bean 20 0 108m 1868 1412 S 0.0 0.0 0:00.11 bash
28547 bean 20 0 231m 16m 7676 S 0.0 0.4 0:01.56 gdb
28549 bean 20 0 22688 340 248 t 0.0 0.0 0:00.26 thread_test
28552 bean 20 0 22688 340 248 t 0.0 0.0 0:00.00 thread_test
28553 bean 20 0 22688 340 248 t 0.0 0.0 0:00.00 thread_test
28561 bean 20 0 107m 1860 1432 S 0.0 0.0 0:00.08 bash
ऐसा लगता है कि प्रोग्राम, या शायद कर्नेल, प्रक्रियाओं के विपरीत धागे को परिभाषित करने का एक अलग तरीका है। top
के अनुसार प्रत्येक धागे का अपना पीआईडी होता है - क्यों?
'क्लोन() 'यह है कि लिनक्स दोनों धागे और' कांटा()' को कैसे लागू करता है। यह सब मायने रखता है कि पीआईडी से बात करने से सिग्नल पास हो जाएगा जो हर किसी को जानना चाहिए। यदि कर्नेल धागे को अतिरिक्त आईडी निर्दिष्ट करता है, तो यह आपका कोई भी व्यवसाय नहीं है और इससे प्रभावित नहीं होता है कि आप अपनी प्रक्रियाओं से कैसे बात करते हैं। –
अच्छा [लिंक] (http://opensourceforgeeks.blogspot.in/2014/03/processes-and-threads-in-linux.html) के माध्यम से जाने के लिए। –
"* लिनक्स में प्रक्रियाओं और धागे कर्नेल के लिए अलग-अलग हैं (लगभग) * उम्म, वास्तव में सच नहीं है। लिनक्स कर्नेल कैसे काम करता है, यह प्रक्रियाओं और धागे दोनों के बारे में सच है कि आप लगभग कुछ भी नहीं कह सकते हैं। वीएम के विचार का मालिक है? केवल प्रक्रियाओं। निर्धारित किया जा सकता है? केवल धागे एक फाइल डिस्क्रिप्टर टेबल है? केवल प्रक्रियाओं। प्राथमिकता है? केवल धागे और इसलिए लाइन पर नीचे। –