कांटा और निष्पादन कैसे काम करते हैं?


17

मेरे पास बहुत अनुभव नहीं है, बस प्रक्रियाओं में शामिल होने की कोशिश कर रहा हूं कि वे उपयोगकर्ता स्तर से हार्डवेयर की व्याख्या कैसे करते हैं।

इसलिए जब एक कमांड को एक शेल से निकाल दिया जाता है, तो उसे fork()एक बच्चे की प्रक्रिया विरासत में मिलती है और exec()बच्चे की प्रक्रिया को मेमोरी और निष्पादित करता है।

  1. यदि बच्चे की प्रक्रिया में मूल प्रक्रिया (जो मूल प्रक्रिया है) के सभी गुण शामिल हैं, तो इस बच्चे की प्रक्रिया की क्या आवश्यकता है? मूल प्रक्रिया को भी मेमोरी में लोड किया जा सकता था।
  2. क्या यह forkऔर execअवधारणा UNIX में सभी निष्पादन योग्य कार्यक्रम पर लागू होती है? जैसे शेल स्क्रिप्ट के लिए भी या केवल कमांड्स के लिए? क्या यह शेल बिलिन कमांड के लिए भी लागू होता है?
  3. यदि मैं कमांड / स्क्रिप्ट निष्पादित करूँगा, तो लिखने की अवधारणा पर प्रतिलिपि का उपयोग कब किया जाएगा?

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


मैं यह नहीं कहूंगा कि यह एक डुप्लिकेट है, लेकिन मुझे लगता है कि आपके कुछ प्रश्न का उत्तर यहां दिया गया है: unix.stackexchange.com/questions/136637/… और उस एक के शीर्ष पर जुड़े अन्य उत्तर में।
गोल्डीलॉक्स

जवाबों:


22

इसलिए जब एक कमांड को एक शेल से निकाल दिया जाता है, तो कांटा () को एक बच्चे की प्रक्रिया विरासत में मिलती है और निष्पादन () मेमोरी में बच्चे की प्रक्रिया को लोड करता है और निष्पादित करता है।

काफी नहीं। fork()एक समान बच्चे का निर्माण, वर्तमान प्रक्रिया को क्लोन करता है। वर्तमान प्रक्रिया में exec()एक नए प्रोग्राम को लोड करता है , जो मौजूदा को बदल देता है।

मेरी qs है:

यदि बच्चे की प्रक्रिया में मूल प्रक्रिया (जो मूल प्रक्रिया है) के सभी गुण शामिल हैं, तो इस बच्चे की प्रक्रिया की क्या आवश्यकता है? मूल प्रक्रिया को भी मेमोरी में लोड किया जा सकता था।

जरूरत इस बात की है कि मूल प्रक्रिया अभी समाप्त नहीं होना चाहती है; यह एक नई प्रक्रिया को बंद करना चाहता है और एक ही समय में कुछ ऐसा करना चाहता है कि यह आगे भी जारी रहे।

क्या यह कांटा और निष्पादन अवधारणा UNIX में सभी निष्पादन योग्य प्रोग्राम पर लागू होती है? जैसे शेल स्क्रिप्ट के लिए भी या केवल कमांड के लिए? क्या यह शेल बिलिन कमांड के लिए भी लागू होता है?

बाहरी कमांड के लिए, शेल ऐसा करता है fork()कि कमांड एक नई प्रक्रिया में चलता है। बिल्‍ड सीधे शेल द्वारा चलाए जाते हैं। एक और उल्लेखनीय कमांड है exec, जो exec()पहले fork()आईएनजी के बिना बाहरी प्रोग्राम को शेल बताता है । इसका मतलब यह है कि शेल को नए प्रोग्राम के साथ बदल दिया गया है, और इसलिए जब वह बाहर निकलता है, तो उस प्रोग्राम के वापस आने का समय नहीं होता है। यदि आप कहते हैं, exec trueतो /bin/trueआपके शेल को बदल देगा, और तुरंत बाहर निकल जाएगा, जिससे आपके टर्मिनल में कुछ भी नहीं चल रहा है, इसलिए यह बंद हो जाएगा।

जब मैं एक कमांड / स्क्रिप्ट निष्पादित करूँगा तो लिखने की अवधारणा पर कॉपी का उपयोग किया जाता है?

पाषाण युग में, fork()वास्तव में कॉलिंग प्रक्रिया में सभी मेमोरी को नई प्रक्रिया में कॉपी करना था। कॉपी पर राइट एक ऑप्टिमाइज़ेशन है जहां पेज टेबल सेट किए जाते हैं ताकि दोनों प्रक्रिया एक ही मेमोरी को साझा करना शुरू कर दें, और जरूरत पड़ने पर या तो प्रोसेस द्वारा लिखे गए पेज को ही कॉपी किया जाए।


4
"लगभग हर कमांड के लिए, शेल एक फोर्क () करता है ताकि कमांड एक नई प्रक्रिया में चले। यदि वह कमांड एक बिलिन है, तो बच्चे को एक अलग प्रोग्राम को निष्पादित करने की आवश्यकता नहीं है।" अच्छा जवाब है, लेकिन यह हिस्सा संपादित किया जाना चाहिए। बिल्‍डिंग चलाते समय शेल फॉर्क नहीं करता है। यह उन लोगों को सीधे सक्रिय शेल प्रक्रिया में चलाता है। यह एकमात्र तरीका है, जैसे निर्माण cdया readकाम कर सकता है। फोर्किंग की कमी भी बाहरी आदेशों की तुलना में बिल्डरों को बहुत तेज बनाती है।
जॉन कुगेलमैन

6
  1. कुछ कार्यक्रमों के लिए, बाल प्रक्रिया एक काम करती है (एक सीरियल पोर्ट से पढ़ें, टर्मिनल पर लिखें), और मूल प्रक्रिया कुछ और करने के लिए आगे बढ़ती है (टर्मिनल से पढ़ें, सीरियल पोर्ट पर लिखें)। एक और क्लासिक उदाहरण है बच्चे की प्रक्रिया जो कुछ लंबे समय से चल रही गणना की जांच कर रही है। अधिकतर, चाइल्ड प्रोसेस कुछ सेटअप करता है, जैसे डायरेक्टरी बदलना, सिग्नल हैंडलर रीसेट करना या फाइल डिस्क्रिप्टर रीसेट करना, और फिर execve()अलग-अलग कोड के साथ ओवरले करना।
  2. fork()और exec()सभी निष्पादकों पर लागू होते हैं - वास्तव में, argc और argv के साथ, और पाइप, कांटा और निष्पादन अन्य ऑपरेटिंग सिस्टम से Unix को अलग करते हैं। fork()बीएसडी vfork(), प्लान 9 rfork()और लिनक्स ' जैसे कुछ विशेषज्ञताओं या सामान्यताओं का अस्तित्व है clone(), लेकिन प्रिंसिपल वही हैं।
  3. "कॉपी ऑन राइट" उपयोगकर्ता को वास्तव में दिखाई नहीं देता है, यह एक बच्चे की प्रक्रिया बनाने के अनुकूलन के लिए एक तकनीक का अधिक है, और इसके निष्पादन के दौरान। कॉल स्टैक और हीप (मेमोरी malloc(), जिसे स्टैटिक या ग्लोबल स्कोप वैरिएबल के साथ आवंटित किया गया है ) "कॉपी ऑन राइट" हो सकता है। जब एक बच्चे की प्रक्रिया एक के साथ बनाई जाती हैfork()कॉल करें, कर्नेल बच्चे की प्रक्रिया को स्मृति के ठीक उसी पृष्ठ के रूप में स्थापित करेगा, जो माता-पिता की प्रक्रिया के रूप में ढेर और स्टैक के रूप में है। यदि हार्डवेयर (मेमोरी मैनेजमेंट यूनिट) हीप या स्टैक का एक पता लगाता है, तो कर्नेल को मेमोरी का एक नया भौतिक पेज मिलेगा, माता-पिता के पेज को नए पेज में कॉपी करें, और उस नए पेज को चाइल्ड प्रोसेस के स्टैक या हीप में मैप करें। यह एक अनुकूलन का गठन करता है क्योंकि कर्नेल पृष्ठ मैपिंग को स्थापित करने की तुलना में कम समय व्यतीत करता है क्योंकि यह पूरी तरह से बच्चे की प्रक्रिया के लिए स्टैक और हीप को कॉपी करता है।

आपके उत्तर के लिए धन्यवाद ब्रूस। लेकिन इतनी सारी बातें आपने यहां कही हैं जो मेरे सिर पर जा रही हैं। मुझे इन चीजों से बहुत ज्यादा ज्ञान नहीं है..मैं आपके द्वारा बताए गए इन कार्यों को प्राप्त करने की कोशिश करूंगा। बहुत बहुत धन्यवाद..!!
PriB

4
यदि बच्चे की प्रक्रिया में मूल प्रक्रिया (जो मूल प्रक्रिया है) के सभी गुण शामिल हैं, तो इस बच्चे की प्रक्रिया की क्या आवश्यकता है? मूल प्रक्रिया को भी मेमोरी में लोड किया जा सकता था।

इस सवाल का बहुत ही निराशाजनक ढंग से उत्तर दिया गया है कि जल्द से जल्द यूनिक्स कार्यान्वयन पर एक नज़र डालें, जिसे गंभीर मेमोरी बाधाओं के तहत काम करना था और एक समय में मेमोरी / एड्रेस स्पेस में केवल एक निष्पादन प्रक्रिया थी।

मल्टीटास्किंग एक प्रक्रिया को डिस्क से स्वैप करके और एक अलग प्रक्रिया को स्वैप करके प्राप्त किया गया था।

अब forkसिस्टम कॉल लगभग समान था: इसने एक प्रक्रिया को डिस्क पर स्वैप किया, लेकिन किसी अन्य प्रक्रिया को स्वैप करने के बजाय, इसने इन-मेमोरी कॉपी को एक और प्रक्रिया आईडी दिया और वापस आ गया। और इस प्रक्रिया के लिए यह एक उपयुक्त समय था कि execसभी के बाद एक और निष्पादन योग्य में निर्णय लिया जाए ।

fork+ execइस प्रकार वास्तव में स्पॉइंग पर ध्यान देने योग्य ओवरहेड को उकसाया नहीं गया: आपको अपनी प्रक्रिया को वैसे भी डिस्क पर स्वैप करना था, और आपके पास काम करने योग्य स्मृति स्थानों में वैसे भी पुरानी प्रक्रिया छवि थी।

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


2

इसे यथासंभव आसान बनाने के लिए मैं एक सादृश्य का उपयोग करूंगा। चलो एक पाई सेंकना!

हम नुस्खा पुस्तक को पकड़ते हैं, और पढ़ना शुरू करते हैं और एक स्ट्रॉबेरी रबर्ब पाई (मेरा पसंदीदा) पर हाथ से बने क्रस्ट के साथ बस जाते हैं। लगभग हमें जो कुछ भी चाहिए वह अंडे और फलों को छोड़कर रसोई में है, लेकिन जब से हम एक खेत पर रहते हैं और फल मौसम में होता है, यह कोई समस्या नहीं है। समस्या यह है कि ओवन टूट गया है और हर काम करने के लिए पर्याप्त समय नहीं है। क्या मेरे लिए एक से अधिक होना अच्छा नहीं होगा?

कांटा () बचाव के लिए। अब मेरे दो हैं। और पाई क्रस्ट बनाना शुरू करने के लिए हम दोनों रसोई में चले गए। उफ़। इसलिए हम कांटे से वापसी को देखते हैं। मुझे एक बड़ी संख्या मिली वह शून्य हो गया, इसलिए मैं रसोई में जाता हूं जबकि वह चिकन कॉप और बगीचे में जाता है। जैसा कि मैंने ओवन को कांटा (मैं) फिर से चलता हूं, वापसी मूल्य पर गौर करें: बुमेर मुझे शून्य मिला। जब तक मैं टूटे हुए ओवन को नहीं देखता, वह आटे पर चलता रहता है। मैं दरवाजा खोलता हूं, कोई रोशनी नहीं, मैं दरवाजा बंद करता हूं। क्या किसी को पता है कि एक ओवन को कैसे ठीक किया जाए?

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

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