2013-05-03 4 views
33

मैंने अपने अनुप्रयोगों में पहले थ्रेडिंग का उपयोग किया है और इसकी अवधारणाओं को अच्छी तरह से जानते हैं, लेकिन हाल ही में मेरे ऑपरेटिंग सिस्टम व्याख्यान में मैं फोर्क() में आया था। जो थ्रेडिंग के समान कुछ है।फोर्किंग बनाम थ्रेडिंग

  1. कांटा लेकिन एक नई प्रक्रिया है कि पुराने या अभिभावक प्रक्रिया की तरह वास्तव में लग रहा है, लेकिन अभी भी यह अलग प्रक्रिया के साथ एक अलग प्रक्रिया है कुछ भी नहीं है:

    मैं उन्हें और मैं के बीच की खोज अंतर गूगल कि पता चला आईडी और इसकी अपनी याददाश्त है।

  2. धागे हल्के वजन प्रक्रिया है जिसके लेकिन, कम भूमि के ऊपर

है अभी भी मेरे मन में कुछ सवाल हैं।

  1. आपको थ्रेडिंग और उपाध्यक्ष पर फोर्क() कब पसंद करना चाहिए?
  2. यदि मैं एक बच्चे के रूप में बाहरी एप्लिकेशन को कॉल करना चाहता हूं, तो क्या मुझे इसे करने के लिए कांटा() या धागे का उपयोग करना चाहिए?
  3. Google खोज करते समय मैंने लोगों को यह कहते हुए पाया कि एक थ्रेड के अंदर एक कांटा() को कॉल करना बुरा बात है। जब लोग समान चीजें करते हैं तो लोग थ्रेड के अंदर एक कांटा() क्यों कॉल करना चाहते हैं?
  4. क्या यह सच है कि कांटा() मल्टीप्रोसेसर सिस्टम का लाभ नहीं ले सकता क्योंकि माता-पिता और बाल प्रक्रिया एक साथ नहीं चलती है?
+10

प्वाइंट 4 झूठी है: 'fork'ed प्रक्रियाओं स्पष्ट रूप से मल्टी कोर हार्डवेयर का लाभ लेने, क्योंकि लगभग हर प्रक्रिया में कुछ' fork' द्वारा शुरू किया जाता है और कर्नेल अनुसूचक उन्हें उचित डिस्पैच कई सीपीयू के लिए। ** अधिक के लिए http://advancedlinuxprogramming.com/** पढ़ें। –

उत्तर

27

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

विशेष रूप से अपने प्रश्नों के:

जब आप सूत्रण और उपाध्यक्ष कविता के ऊपर फोर्क() को प्राथमिकता देनी चाहिए?

एक यूनिक्स प्रणाली पर जहाँ आप सिर्फ एक कार्यकर्ता instantiating, या आप अलग प्रक्रियाओं का अंतर्निहित सुरक्षा सैंडबॉक्सिंग चाहते तुलना में कहीं अधिक जटिल कार्य कर रहे हैं।

अगर मैं एक बच्चे के रूप में बाहरी अनुप्रयोग को कॉल करना चाहता हूं, तो क्या मुझे इसे करने के लिए कांटा() या धागे का उपयोग करना चाहिए?

यदि बच्चा समान कोड के साथ माता-पिता के लिए एक समान कार्य करेगा, तो कांटा का उपयोग करें। छोटे उप-कार्य के लिए धागे का उपयोग करें। अलग-अलग बाहरी प्रक्रियाओं के लिए न तो उपयोग करें, बस उन्हें उचित API कॉल के साथ कॉल करें।

Google खोज करते समय मुझे लोगों ने कहा कि एक धागे के अंदर एक कांटा() को कॉल करना बुरा बात है। जब लोग समान चीजें करते हैं तो लोग थ्रेड के अंदर एक कांटा() क्यों कॉल करना चाहते हैं?

पूरी तरह से सुनिश्चित नहीं है, लेकिन मुझे लगता है कि यह एक प्रक्रिया को डुप्लिकेट करने के लिए कम्प्यूटेशनल रूप से महंगा है और बहुत सारे सबथ्रेड हैं।

क्या यह सच है कि कांटा() मल्टीप्रोसेसर सिस्टम का लाभ नहीं ले सकता क्योंकि माता-पिता और बाल प्रक्रिया एक साथ नहीं चलती है?

यह गलत है, कांटा एक नई प्रक्रिया बनाता है जो तब ओएस कार्य शेड्यूलर में प्रक्रियाओं के लिए उपलब्ध सभी सुविधाओं का लाभ उठाता है।

+1

यूनिक्स पर, बाहरी प्रोग्राम का आह्वान करने के लिए उचित एपीआई निष्पादन के बाद कांटा है (अतिरिक्त विवरणों के साथ मैं यहां छोड़ रहा हूं)। कुछ विशेष मामलों के लिए, सरल विकल्प होते हैं (मुख्य रूप से पॉपन)। – ibid

5

fork() प्रक्रिया की एक नई प्रतिलिपि बनाता है, जैसा कि आपने नोट किया है। ऊपर उल्लिखित नहीं है exec() कॉल जो अक्सर अनुसरण करता है। यह मौजूदा प्रक्रिया को एक नई प्रक्रिया (एक नया निष्पादन योग्य) के साथ बदलता है और इस तरह, fork()/exec() पुराने प्रक्रिया से एक नई प्रक्रिया को बढ़ाने का मानक माध्यम है।

उदा। इस प्रकार आपका खोल कमांड लाइन से एक प्रक्रिया का आह्वान करेगा। आप अपनी प्रक्रिया निर्दिष्ट करते हैं (ls, कहें) और खोल कांटे और फिर ls निष्पादित करता है।

ध्यान दें कि यह थ्रेडिंग से बहुत अलग स्तर पर चल रहा है। थ्रेडिंग निष्पादन अंतराल प्रक्रिया की कई पंक्तियों को चलाता है। फोर्किंग नई प्रक्रियाओं का निर्माण करने का माध्यम है।

13

एक फोर्क प्रक्रिया को भारी वजन प्रक्रिया कहा जाता है, जबकि एक थ्रेडेड प्रक्रिया को हल्के वजन की प्रक्रिया कहा जाता है।

  1. एक काँटेदार प्रक्रिया एक बच्चे की प्रक्रिया जबकि एक थ्रेडेड प्रक्रिया एक भाई कहा जाता है माना जाता है:

    निम्नलिखित उन दोनों के बीच अंतर कर रहे हैं।

  2. फोर्कड प्रक्रिया पैरेंट प्रक्रिया के साथ कोड, डेटा, स्टैक इत्यादि जैसे संसाधनों को साझा नहीं करती है, जबकि एक थ्रेडेड प्रक्रिया कोड साझा कर सकती है लेकिन इसका अपना ढेर होता है।
  3. प्रक्रिया स्विचिंग ओएस की मदद की आवश्यकता है लेकिन स्विचिंग यह
  4. कई प्रक्रियाओं बनाना आवश्यक नहीं है, जबकि कई धागा बनाने कम संसाधन गहन कार्य
  5. प्रत्येक प्रक्रिया स्वतंत्र रूप से चला सकते हैं, जबकि एक धागा पढ़ सकते है एक संसाधन गहन कार्य है थ्रेड/एक और धागे डेटा लिखें। थ्रेड और इस प्रक्रिया lecture enter image description here
संबंधित मुद्दे