डिफ़ॉल्ट प्रक्रिया निर्माण तंत्र कांटा क्यों है?


46

UNIX प्रणाली प्रक्रिया निर्माण, कांटा () के लिए कॉल करती है, मूल प्रक्रिया की प्रतिलिपि बनाकर एक बच्चे की प्रक्रिया बनाती है। मेरी समझ यह है कि चाइल्ड प्रोसेस की मेमोरी स्पेस (टेक्स्ट सेगमेंट सहित) को बदलने के लिए निष्पादन () को कॉल करने के बाद लगभग हमेशा इसका पालन किया जाता है। माता-पिता की स्मृति स्थान को कांटे में कॉपी करना () मुझे हमेशा बेकार लगता था (हालांकि मुझे एहसास है कि कचरे को मेमोरी सेगमेंट को कॉपी-ऑन-राइट करके बनाया जा सकता है इसलिए केवल पॉइंटर्स कॉपी किए जाते हैं)। वैसे भी, क्या किसी को पता है कि प्रक्रिया के निर्माण के लिए इस दोहराव दृष्टिकोण की आवश्यकता क्यों है?


3
ध्यान दें कि fork(2)लिनक्स के तहत मैन पेज कहता है: Under Linux, fork() is implemented using copy-on-write pages, so the only penalty that it incurs is the time and memory required to duplicate the parent's page tables, and to create a unique task structure for the child. मैं कल्पना करता हूं (लेकिन कुछ के लिए नहीं जानता) कि यह अन्य आधुनिक यूनिक्स स्वादों के लिए मामला है।
लार्क्स

4
मूल, पीडीपी -11 यूनिक्स वास्तव में, एक कांटे की प्रक्रिया के सभी बाइट्स की नकल करता था: लेकिन इसमें केवल 64Kb निष्पादन योग्य, और अधिकांश 64Kb डेटा था, इसलिए यह 1975 में भी बहुत बड़ा बोझ नहीं था। लगभग 1990 के बाद से हर किसी को कॉपी-ऑन-राइट टेक्स्ट सेगमेंट मिला है, इसलिए हर एक और यूनिक्स-ए-जैसे का अनुमान है, इसलिए मुझे भी यकीन नहीं है कि किताबें और लेख "कांटे के साथ प्रदर्शन समस्या" का प्रचार क्यों करते हैं।
ब्रूस एडिगर

आजकल, फोर्क को समान रूप से vfork ( openbsd.org/cgi-bin/… ) पर लागू किया जाता है । यह कुशल है, चिंता मत करो।
अकी

यह भी ध्यान दें कि बहुत सारे उपयोग हैं जहां आप कांटे के बाद निष्पादित नहीं करते हैं (या कम से कम, तुरंत निष्पादित नहीं करता है): पाइप और वेब सर्वर के बारे में सोचें।
jfg956

तुम बात धीमी हो सकती है। लेकिन जैसा कि @cjm कहता है कि वैकल्पिक Microsoft CreateProcess का उपयोग करता है, उन्हें थ्रेड्स को जल्दी से लागू करना होगा (हो सकता है कि वे केवल उसी चीज़ का नेतृत्व करें), क्योंकि CreateProcess धीमा है। (उन्हें भी थ्रेड्स की आवश्यकता थी क्योंकि selectटूट गया था, लेकिन यह एक और कहानी है)।
ctrl-alt-delor

जवाबों:


57

यह इंटरफ़ेस को सरल बनाने के लिए है। करने के लिए वैकल्पिक forkऔर execविंडोज 'की तरह कुछ होगा CreateProcess कार्य करते हैं। ध्यान दें कि कितने पैरामीटर CreateProcessहैं, और उनमें से कई अधिक मापदंडों के साथ संरचना हैं। ऐसा इसलिए है क्योंकि नई प्रक्रिया के बारे में आप जो कुछ भी नियंत्रित करना चाहते हैं उसे पारित करना होगा CreateProcess। वास्तव में, CreateProcessपर्याप्त पैरामीटर नहीं है, इसलिए Microsoft को CreateProcessAsUser और CreateProcessWithLogonW को जोड़ना पड़ा ।

fork/execमॉडल के साथ , आपको उन सभी मापदंडों की आवश्यकता नहीं है। इसके बजाय, प्रक्रिया की कुछ विशेषताओं को संरक्षित किया जाता है exec। यह आपको अनुमति देता है fork, फिर जो भी प्रक्रिया विशेषताएँ आप चाहते हैं उन्हें बदल दें (उन्हीं कार्यों का उपयोग करें जिन्हें आप सामान्य रूप से उपयोग करेंगे), और फिर exec । लिनक्स में, forkकोई पैरामीटर नहीं है, और execveइसमें केवल 3 हैं: चलाने के लिए प्रोग्राम, इसे देने के लिए कमांड लाइन, और इसका वातावरण। (अन्य execकार्य भी हैं, लेकिन वे execveसामान्य उपयोग के मामलों को सरल बनाने के लिए सी लाइब्रेरी द्वारा उपलब्ध कराए गए रैपर हैं।)

आप एक अलग वर्तमान निर्देशिका के साथ एक प्रक्रिया शुरू करना चाहते हैं: fork, chdir, exec

यदि आप stdin / stdout को पुनर्निर्देशित करना चाहते हैं:, forkबंद / खुली हुई फाइलें exec,।

आप स्विच उन करना चाहते हैं: fork, setuid, exec

इन सभी चीजों को आवश्यकतानुसार जोड़ा जा सकता है। किसी प्रक्रिया विशेषता के एक नए प्रकार के साथ आता है, तो आप को बदलने की जरूरत नहीं है forkऔर exec

जैसा कि उल्लेख किया गया है, अधिकांश आधुनिक यूनिक्स कॉपी-ऑन-राइट का उपयोग करते हैं, इसलिए forkमहत्वपूर्ण ओवरहेड शामिल नहीं है।


16
बहुत बढ़िया स्पष्टीकरण। "जो लोग UNIX को नहीं समझते हैं, वे इसे खराब करने के लिए निंदा करते हैं।" - हेनरी स्पेंसर
काइल जोन्स 19

1
धन्यवाद! क्या आपके पास संदर्भ है, किसी भी संयोग से?
एलेन स्पार्टस

1
@ अकी, नहीं, CreateProcess () वस्तुतः एक नई प्रक्रिया बनाता है और इसे खरोंच से बनाता है, कोई फोर्किंग नहीं।
Psusi

2
लेकिन Unix में कहीं CreateProcess () तो नहीं होना चाहिए? अन्यथा बहुत पहली प्रक्रिया कैसे बनती है? एक पौराणिक निर्माता भगवान के विपरीत, पहली प्रक्रिया कुछ भी नहीं से खुद को कांटा () नहीं कर सकती है। ;-)
स्टीवन सोमवार

2
@StevenMonday, हाँ, लेकिन यह कर्नेल के आरंभीकरण कोड में है और बाहरी रूप से सुलभ नहीं है। यह उन सभी मापदंडों की आवश्यकता नहीं है क्योंकि लगभग सब कुछ हार्डकोड है। यह केवल प्रक्रिया ID 1, उर्फ ​​init प्रक्रिया बना सकता है। उसके बाद, प्रक्रिया केवल फोर्किंग द्वारा बनाई जाती है।
cjm

5

सीजेएम के उत्तर के अनुपालन में, एकल यूनिक्स विनिर्देश नाम के एक फ़ंक्शन को परिभाषित करता है vfork()। यह फ़ंक्शन कांटे की तरह काम करता है, सिवाय इसके कि कांटे की प्रक्रिया में अपरिभाषित व्यवहार होता है अगर यह एक निष्पादक फेमिली फ़ंक्शन को कॉल करने या कॉल करने के अलावा कुछ भी करता है _exit()

इस प्रकार परिभाषित व्यवहार के साथ बहुत अधिक उपयोग केवल है:

pid_t ret = vfork();
if(ret == 0)
{
    exec(...);
    _exit(EXIT_FAILURE); //in case exec failed for any reason.
}

तो क्या करता vforkहै? यह एक सस्ती है fork। कॉपी-ऑन-राइट के बिना कार्यान्वयन में, परिणामी प्रक्रिया मूल प्रक्रिया (इसलिए अपरिभाषित व्यवहार) के साथ मेमोरी स्पेस साझा करेगी। कॉपी-ऑन-राइट के साथ कार्यान्वयन में, इसके vforkसमान होने की अनुमति है fork(), क्योंकि कॉपी-ऑन-राइट कार्यान्वयन तेजी से होते हैं।

वैकल्पिक posix_spawnफ़ंक्शन (और एक posix_spawnpफ़ंक्शन) भी है जो सीधे एक नई प्रक्रिया बना सकता है। (यह भी उन्हें एक पुस्तकालय कॉल उपयोग करने के साथ लागू करने के लिए अनुमति है forkऔर exec, और एक उदाहरण दिया गया प्रदान की जाती है।)

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