कांटा और धागे के बीच अंतर क्या है?


जवाबों:


94

एक कांटा आपको एक बिल्कुल नई प्रक्रिया देता है, जो समान कोड सेगमेंट के साथ वर्तमान प्रक्रिया की एक प्रति है। जैसे-जैसे मेमोरी इमेज बदलती है (आम तौर पर यह दो प्रक्रियाओं के अलग-अलग व्यवहार के कारण होता है) आपको मेमोरी इमेज (कॉपी पर राइट) का एक पृथक्करण प्राप्त होता है, हालांकि निष्पादन योग्य कोड समान रहता है। जब तक वे कुछ इंटर प्रोसेस कम्युनिकेशन (IPC) आदिम का उपयोग नहीं करते, तब तक मेमोरी मेमोरी साझा नहीं करते हैं ।

एक प्रक्रिया के कई सूत्र हो सकते हैं, प्रत्येक प्रक्रिया के समान संदर्भ में समानांतर में क्रियान्वित हो सकते हैं। मेमोरी और अन्य संसाधनों को थ्रेड्स के बीच साझा किया जाता है, इसलिए साझा डेटा को कुछ आदिम और सिंक्रनाइज़ेशन ऑब्जेक्ट्स (जैसे म्यूटेक्स , कंडीशन वैरिएबल और सेमाफोर ) के माध्यम से एक्सेस किया जाना चाहिए जो आपको डेटा भ्रष्टाचार से बचने की अनुमति देते हैं।


3
आप शायद "वर्तमान प्रक्रिया की प्रतिलिपि" को बाल प्रक्रिया के रूप में संदर्भित करना चाहते हैं।

1
पाठ खंड को अक्सर (वस्तुतः) साझा किया जाता है और यहां तक ​​कि डेटा खंड को कॉपी-ऑन-राइट भी किया जा सकता है।
जेई कतार


76

कांटा

फोर्क और कुछ नहीं बल्कि एक नई प्रक्रिया है जो बिल्कुल पुरानी या मूल प्रक्रिया की तरह दिखती है लेकिन फिर भी यह एक अलग प्रक्रिया है जिसमें अलग-अलग आईडी होती है और अपनी मेमोरी होती है। मूल प्रक्रिया बच्चे के लिए एक अलग पता स्थान बनाती है। माता-पिता और बच्चे की प्रक्रिया दोनों के पास समान कोड सेगमेंट है, लेकिन एक-दूसरे से स्वतंत्र रूप से निष्पादित होते हैं।

जब आप यूनिक्स / लिनक्स में शेल पर कमांड चलाते हैं, तो फोर्किंग का सबसे सरल उदाहरण है। जब भी कोई उपयोगकर्ता एक आदेश जारी करता है, शेल एक बच्चे की प्रक्रिया की तलाश करता है और कार्य किया जाता है।

जब एक फोर्क सिस्टम कॉल जारी किया जाता है, तो मूल प्रक्रिया के अनुरूप सभी पृष्ठों की एक प्रति बनाई जाती है, जिसे चाइल्ड प्रक्रिया के लिए OS द्वारा एक अलग मेमोरी लोकेशन में लोड किया जाता है, लेकिन कुछ मामलों में, इसकी आवश्यकता नहीं होती है। जैसे 'निष्पादित' सिस्टम कॉल में, मूल प्रक्रिया पृष्ठों को कॉपी करने की आवश्यकता नहीं होती है, क्योंकि निष्पादित प्रक्रिया मूल प्रक्रिया के पते के स्थान को बदल देती है।

जाली के बारे में ध्यान देने योग्य कुछ बातें हैं:

  • बच्चे की प्रक्रिया की अपनी विशिष्ट प्रक्रिया आईडी होगी।
  • बच्चे की प्रक्रिया के पास अभिभावक की फाइल डिस्क्रिप्टर की अपनी प्रति होगी।
  • मूल प्रक्रिया द्वारा निर्धारित फ़ाइल ताले को बाल प्रक्रिया द्वारा विरासत में नहीं लिया जाएगा।
  • मूल प्रक्रिया में खुलने वाले कोई भी शब्द बच्चे की प्रक्रिया में भी खुले होंगे।
  • बाल प्रक्रिया में अभिभावक की संदेश कतार के विवरणों की अपनी प्रति होगी।
  • बच्चे का अपना पता स्थान और मेमोरी होगा।

धागे

थ्रेड्स लाइट वेट प्रोसेस (LWPs) हैं। परंपरागत रूप से, थ्रेड बाकी (डेटा, स्टैक, आई / ओ, सिग्नल) युक्त प्रक्रिया के साथ सिर्फ एक सीपीयू (और कुछ अन्य न्यूनतम राज्य) है। थ्रेड्स को "forking" की तुलना में कम ओवरहेड की आवश्यकता होती है या एक नई प्रक्रिया को जन्म देती है क्योंकि सिस्टम प्रक्रिया के लिए एक नई प्रणाली वर्चुअल मेमोरी स्पेस और वातावरण को इनिशियलाइज़ नहीं करता है। मल्टीप्रोसेसर सिस्टम पर सबसे प्रभावी जहां प्रक्रिया प्रवाह को किसी अन्य प्रोसेसर पर चलाने के लिए निर्धारित किया जा सकता है, इस प्रकार समानांतर या वितरित प्रसंस्करण के माध्यम से गति प्राप्त कर सकते हैं, लाभ भी एकतरफा सिस्टम पर पाए जाते हैं जो I / O में विलंबता का शोषण करते हैं और अन्य सिस्टम फ़ंक्शन प्रक्रिया को रोक सकते हैं निष्पादन।

एक ही प्रक्रिया में धागे साझा करते हैं:

  • प्रक्रिया निर्देश
  • सबसे अधिक डेटा
  • खुली फाइलें (विवरणकर्ता)
  • सिग्नल और सिग्नल हैंडलर
  • वर्तमान कार्यशील निर्देशिका
  • उपयोगकर्ता और समूह आईडी

अधिक विवरण यहां पाया जा सकता है


2
एक प्रक्रिया के कई सूत्र हो सकते हैं। यदि प्रक्रिया में थ्रेड्स में से एक कांटा कहता है, तो क्या कांटे की प्रक्रिया में पूरी तरह से डुप्लिकेट मेमोरी है, लेकिन नई प्रक्रिया में केवल कॉलिंग थ्रेड है?
माइकल


29

Dacav का जवाब उत्कृष्ट है, मैं बस यह जोड़ना चाहता था कि सभी थ्रेडिंग मॉडल आपको सही मल्टी-प्रोसेसिंग नहीं देते हैं।

उदाहरण के लिए, रूबी का डिफ़ॉल्ट थ्रेडिंग कार्यान्वयन सही OS / कर्नेल थ्रेड का उपयोग नहीं करता है। इसके बजाय यह एक कर्नेल थ्रेड / प्रक्रिया के भीतर थ्रेड ऑब्जेक्ट्स के बीच स्विच करके कई थ्रेड्स की नकल करता है।

यह मल्टीप्रोसेसर / मल्टी-कोर सिस्टम पर महत्वपूर्ण है, क्योंकि इस प्रकार के हल्के धागे केवल एक ही कोर पर चल सकते हैं - आपको कई थ्रेड होने से प्रदर्शन को बढ़ावा देने के तरीके में बहुत कुछ नहीं मिलता है।

दूसरी जगह इससे फर्क पड़ता है जब एक थ्रेड ब्लॉक (I / O पर प्रतीक्षा करना या ड्राइवर के IOCTL को कॉल करना), सभी थ्रेड ब्लॉक।

यह आजकल बहुत आम नहीं है - अधिकांश थ्रेडिंग कार्यान्वयन कर्नेल थ्रेड्स का उपयोग करते हैं जो इन मुद्दों से ग्रस्त नहीं हैं - लेकिन पूर्णता के लिए इसके लायक होना।

इसके विपरीत, कांटा आपको एक और प्रक्रिया प्रदान करता है जो मूल भौतिक प्रक्रिया को निष्पादित करते समय एक और भौतिक सीपीयू पर एक साथ चलाने योग्य है। कुछ लोग आईपीसी को अपने ऐप के लिए अधिक उपयुक्त पाते हैं, अन्य लोग थ्रेडिंग पसंद करते हैं।

गुड लक और मजा करें! मल्टी-थ्रेडिंग चुनौतीपूर्ण और पुरस्कृत दोनों है।


7
एक तंत्रिका को मारने के लिए +1: "सभी थ्रेडिंग आपको सच्चा मल्टीप्रोसेसिंग नहीं देते हैं"
Dacav

5

थ्रेड्स फ़ंक्शन समानांतर में चलाए जाते हैं, कांटा माता-पिता की विरासत के साथ एक नई प्रक्रिया है। थ्रेड्स समानांतर में एक कार्य को निष्पादित करने के लिए अच्छे हैं, जबकि कांटे स्वतंत्र प्रक्रिया हैं, जो एक साथ भी चल रहे हैं। थ्रेड्स में दौड़ की स्थिति होती है और अर्ध-छिद्रों और तालों या म्यूटेक्स को नियंत्रित करता है, कांटे और धागे दोनों में पाइप का उपयोग किया जा सकता है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.