[मैं यहाँ से अपने उत्तर का हिस्सा दोहराऊंगा ।]
सिर्फ एक कमांड क्यों नहीं है जो खरोंच से एक नई प्रक्रिया बनाता है? क्या यह एक ऐसी चीज की नकल करना बेमानी और अक्षम नहीं है जो केवल तुरंत ही प्रतिस्थापित होने वाली है?
वास्तव में, कि शायद कुछ कारणों के लिए कुशल नहीं होगा:
द्वारा उत्पादित "कॉपी" fork()
एक अमूर्त का एक सा है, क्योंकि कर्नेल एक कॉपी-ऑन-राइट सिस्टम का उपयोग करता है ; वास्तव में बनाया जाना है कि सभी एक आभासी स्मृति नक्शा है। यदि कॉपी फिर तुरंत कॉल करता है exec()
, तो अधिकांश डेटा जो कॉपी किया गया होता अगर इसे प्रक्रिया की गतिविधि द्वारा संशोधित किया गया होता, तो वास्तव में कभी भी कॉपी / निर्मित नहीं करना पड़ता क्योंकि प्रक्रिया इसके उपयोग की आवश्यकता के लिए कुछ भी नहीं करती है।
बाल प्रक्रिया के विभिन्न महत्वपूर्ण पहलुओं (उदाहरण के लिए, इसका वातावरण) को व्यक्तिगत रूप से दोहराव या संदर्भ के जटिल विश्लेषण के आधार पर सेट करने की आवश्यकता नहीं होती है, आदि वे बस कॉलिंग प्रक्रिया के समान ही माने जाते हैं, और यह काफी सहज प्रणाली है जिससे हम परिचित हैं।
# 1 को थोड़ा और समझाने के लिए, स्मृति जिसे "कॉपी" किया जाता है, लेकिन बाद में कभी एक्सेस नहीं किया जाता है वास्तव में कभी भी कॉपी नहीं किया जाता है, कम से कम ज्यादातर मामलों में। इस संदर्भ में एक अपवाद हो सकता है यदि आपने एक प्रक्रिया को छोड़ दिया था, तो बच्चे के साथ खुद को बदलने से पहले मूल प्रक्रिया से बाहर निकल गया था exec()
। मैं कहता हूँ हो सकता है अगर वहाँ पर्याप्त मुक्त स्मृति है, क्योंकि माता-पिता के बहुत संचित किया जा सकता है, और मैं किस हद तक इस शोषण किया जाएगा करने के लिए सुनिश्चित (जो ओएस कार्यान्वयन पर निर्भर करेगा) नहीं हूँ।
बेशक, कि सतह पर एक खाली स्लेट का उपयोग करने की तुलना में एक प्रतिलिपि का उपयोग कर अधिक कुशल नहीं बनाता है - "कोरी स्लेट को छोड़कर" शाब्दिक रूप से कुछ भी नहीं है, और इसमें आवंटन शामिल होना चाहिए। सिस्टम में एक सामान्य रिक्त / नई प्रक्रिया टेम्प्लेट हो सकती है जो इसे उसी तरह से कॉपी करती है, 1 लेकिन फिर वह वास्तव में कॉपी-ऑन-राइट फोर्क बनाम कुछ भी नहीं बचाएगी। इसलिए # 1 केवल यह दर्शाता है कि "नई" खाली प्रक्रिया का उपयोग करना अधिक कुशल नहीं होगा।
पॉइंट # 2 यह बताता है कि कांटा का उपयोग करने की संभावना अधिक कुशल क्यों है। एक बच्चे का पर्यावरण उसके माता-पिता से विरासत में मिला है, भले ही यह पूरी तरह से अलग निष्पादन योग्य हो। उदाहरण के लिए, यदि मूल प्रक्रिया एक शेल है, और बच्चा एक वेब ब्राउज़र है, $HOME
तो अभी भी उन दोनों के लिए समान है, लेकिन चूंकि या तो बाद में इसे बदल सकते हैं, ये दो अलग-अलग प्रतियां होनी चाहिए। बच्चे में एक मूल द्वारा निर्मित है fork()
।
1. एक रणनीति जो बहुत शाब्दिक अर्थ नहीं दे सकती है, लेकिन मेरा कहना है कि एक प्रक्रिया बनाने में डिस्क से मेमोरी में छवि की नकल करने से अधिक शामिल है।