फोर्क (सिस्टम कॉल)

From Vigyanwiki

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

अवलोकन

मल्टीटास्किंग ऑपरेटिंग सिस्टम में, प्रोसेस (चल रहे प्रोग्राम) को नई प्रोसेस बनाने के लिए अन्य प्रोग्राम चलाने के लिए एक तरीके की आवश्यकता होती है। फोर्क और इसके प्रकार सामान्यतः यूनिक्स जैसी प्रणालियों में ऐसा करने का एकमात्र तरीका है। प्रक्रिया के लिए एक अलग प्रोग्राम का निष्पादन प्रारम्भ करने के लिए यह पहले स्वयं की एक प्रति बनाने के लिए फोर्क करता है। कॉपी जिसे चाइल्ड प्रोसेस कहा जाता है, दूसरे प्रोग्राम के साथ स्वयं को ओवरले करने के लिए निष्पादन (सिस्टम कॉल) सिस्टम कॉल को कॉल करती है और यह दूसरे के पक्ष में अपने पूर्व प्रोग्राम का निष्पादन बंद कर देती है।

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

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

इतिहास

1962 में प्रकाशित मेल्विन कॉनवे द्वारा ए मल्टीप्रोसेसर सिस्टम डिज़ाइन में एक फोर्क अवधारणा के प्रारम्भिक संदर्भों में से एक दिखाई दिया।[1] कॉनवे के पेपर ने प्रोजेक्ट जिन्न टाइम-शेयरिंग सिस्‍टम में फोर्क के एल. पीटर डिस्‍टक्‍यू द्वारा कार्यान्‍वयन को प्रेरित किया, जहां केन थॉम्पसन द्वारा इसका प्रारम्भ विशेष उपस्थिति के लिए अवधारणा को उधार लिया गया था।[2] अनुसंधान यूनिक्स में[3][4] फोर्क बाद में पॉज़िक्स में एक मानक इंटरफ़ेस बन गया।[5]


संचार

चाइल्ड प्रक्रिया अपने पैरेंट के फाइल डिस्क्रिप्टर की एक प्रति के साथ प्रारम्भ होती है।[5] इंटरप्रोसेस कम्युनिकेशन के लिए, मूल प्रक्रिया प्रायः एक या कई पाइप (कंप्यूटर विज्ञान) बनाती है, और फिर फोर्किंग के बाद प्रक्रियाएं उन पाइपों के सिरों को बंद कर देंगी जिनकी उन्हें आवश्यकता नहीं है।[6]


वेरिएंट

वी फोर्क

वी फोर्क समान कॉलिंग कन्वेंशन और समान शब्दार्थ के साथ फोर्क का एक प्रकार है, लेकिन इसे केवल प्रतिबंधित स्थितियों में उपयोग किया जाता है। यह यूनिक्स के बर्कले सॉफ्टवेयर वितरण संस्करण वर्चुअल मेमोरी का समर्थन करने वाले पहले यूनिक्स में उत्पन्न हुआ[7][8][9]। इसे पॉज़िक्स द्वारा मानकीकृत किया गया था, जिसने वी फोर्क को फोर्क के समान ही व्यवहार करने की अनुमति दी थी, लेकिन 2004 के संस्करण में इसे अप्रचलित चिह्नित किया गया था।[10] और बाद के संस्करणों में स्पॉन (कंप्यूटिंग) पॉज़िक्स स्पॉन फ़ंक्शंस (जो सामान्यतः वी फोर्क के माध्यम से कार्यान्वित किया जाता है) द्वारा प्रतिस्थापित किया गया था।

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

यूनिक्स प्रणाली वी ने सिस्टम वीआर 4 प्रस्तुत करने से पहले इस फ़ंक्शन कॉल का समर्थन नहीं किया था,[citation needed] क्योंकि इसके कारण होने वाली स्मृति साझाकरण त्रुटि-प्रवण है:

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

— मौरिस जे. बौच[11]

इसी तरह, वी फोर्क के लिए लाइनक्स मैन पेज दृढ़ता से इसके उपयोग को हतोत्साहित करता है:[7][failed verification][discuss]

यह दुर्भाग्य की बात है कि लिनक्स ने इस स्पेक्टर को अतीत से पुनर्जीवित किया। बीएसडी मैन पेज बताता है: "उचित सिस्टम साझाकरण तंत्र लागू होने पर यह सिस्टम कॉल समाप्त हो जाएगा। उपयोगकर्ताओं को वी फोर्क() की मेमोरी शेयरिंग सेमेन्टिक्स पर निर्भर नहीं होना चाहिए क्योंकि यह उस स्थिति में यह फोर्क (2) का पर्याय बन जाएगा। "

इसके साथ अन्य समस्याएं vfork गतिशील लिंकिंग के साथ इंटरेक्शन के कारण मल्टी-थ्रेडेड प्रोग्राम में उत्पन्न होने वाले गतिरोध सम्मिलित हैं।[12]मल्टी-थ्रेडेड के प्रतिस्थापन के रूप में vfork इंटरफ़ेस, पॉज़िक्स ने प्रस्तुत posix_spawn कार्यों का समुदाय जो फोर्क और निष्पादन के कार्यों को जोड़ता है। इन कार्यों को लाइब्रेरी fork दिनचर्या के रूप में लागू किया जा सकता है, जैसा लाइनक्स में किया जाता है,[12] या के संदर्भ में vfork बेहतर प्रदर्शन के लिए, जैसा सोलारिस में किया जाता है,[12][13] लेकिन पॉज़िक्स विनिर्देश नोट करता है कि उन्हें सिस्टम कॉल के रूप में डिज़ाइन किया गया था, विशेष रूप से विवश हार्डवेयर और रीयल-टाइम कंप्यूटिंग रीयल-टाइम सिस्टम पर चलने वाले ऑपरेटिंग सिस्टम के लिए कार्यों को जोड़ता है।[14] जबकि 4.4बीएसडी कार्यान्वयन ने वी फोर्क कार्यान्वयन से छुटकारा पा लिया, जिससे वी फोर्क का व्यवहार फोर्क के समान हो गया, इसे बाद में प्रदर्शन कारणों से नेटबीएसडी ऑपरेटिंग सिस्टम में बहाल कर दिया गया।[8] कुछ एम्बेडेड ऑपरेटिंग सिस्टम जैसे कि यूसीलाइनक्स फोर्क को छोड़ देते हैं और केवल वी फोर्क को लागू करते हैं, क्योंकि उन्हें उन उपकरणों पर काम करने की आवश्यकता होती है जहां मेमोरी मैनेजमेंट यूनिट की कमी के कारण कॉपी-ऑन-राइट लागू करना असंभव है।

आरफोर्क

यूनिक्स के डिजाइनरों द्वारा बनाई गई बेल लैब्स ऑपरेटिंग सिस्टम की योजना 9 में फोर्क सम्मिलित है, लेकिन आरफोर्क नामक एक संस्करण भी है, जो एड्रेस स्पेस सहित पैरेंट और चाइल्ड की प्रक्रियाओं के बीच संसाधनों के ठीक-ठाक साझा करने की अनुमति देता है (कॉल स्टैक सेगमेंट को छोड़कर, जो प्रत्येक प्रक्रिया के लिए अद्वितीय है), पर्यावरण चर और फाइलसिस्टम नेमस्पेस;[15] यह इसे प्रक्रियाओं और उनके भीतर थ्रेड (कंप्यूटर विज्ञान) दोनों के निर्माण के लिए एक एकीकृत इंटरफ़ेस बनाता है।[16] फ्रीबीएसडी दोनों[17] और आईआरआईएक्स ने योजना 9 से आर फोर्क सिस्टम कॉल को अपनाया, बाद में इसे स्प्रॉक नाम दिया गया।[18]

क्लोन

clone लिनक्स कर्नेल में एक सिस्टम कॉल है जो एक चाइल्ड प्रोसेस बनाता है जो अपने निष्पादन संदर्भ (कंप्यूटिंग) के कुछ हिस्सों को पैरेंट के साथ साझा कर सकता है। फ्रीबीएसडी के आर फोर्क और आईआरआईएक्स के स्पोक की तरह, लाइनक्स का क्लोन प्लान 9 के आर फोर्क से प्रेरित था और इसका उपयोग थ्रेड्स को लागू करने के लिए किया जा सकता है (हालाँकि एप्लिकेशन प्रोग्रामर सामान्यतः उच्च-स्तरीय इंटरफ़ेस जैसे पथ्रेडस, क्लोन के शीर्ष पर कार्यान्वित) का उपयोग करेंगे। प्लान 9 और आईआरआईएक्स से अलग स्टैक सुविधा को छोड़ दिया गया है क्योंकि (लिनस टोरवाल्ड्स के अनुसार) यह बहुत अधिक ओवरहेड का कारण बनता है।[18]


अन्य ऑपरेटिंग सिस्टम में फोर्किंग

ओपन वीएमएस ऑपरेटिंग सिस्टम (1977) के मूल डिजाइन में, फोर्किंग के रूप में नई प्रक्रिया के लिए कुछ विशिष्ट पतों की सामग्री के बाद के उत्परिवर्तन के साथ एक कॉपी संगणिकीय संक्रिया को जोखिम भरा माना जाता था।[citation needed] वर्तमान प्रक्रिया स्थिति में त्रुटियां चाइल्ड प्रक्रिया में कॉपी की जा सकती हैं। यहां, प्रक्रिया स्पॉनिंग के रूपक का उपयोग किया जाता है: नई प्रक्रिया के मेमोरी लेआउट के प्रत्येक घटक को खरोंच से नवनिर्मित किया जाता है। स्पॉन (कंप्यूटिंग) रूपक को बाद में माइक्रोसॉफ्ट ऑपरेटिंग सिस्टम (1993) में अपनाया गया।

वीएम/सीएमएस (ओपनएक्सटेंशन) का पॉज़िक्स-संगतता घटक फोर्क का एक बहुत ही सीमित कार्यान्वयन प्रदान करता है, जिसमें चाइल्ड को निष्पादित करते समय पैरेंट को निलंबित कर दिया जाता है, और चाइल्ड और पैरेंट एक ही एड्रेस स्पेस साझा करते हैं।[19] यह अनिवार्य रूप से एक फोर्क के रूप में लेबल किया गया एक वी फोर्क है। (यह केवल सीएमएस गेस्ट ऑपरेटिंग सिस्टम पर लागू होता है; अन्य वीएम गेस्ट ऑपरेटिंग सिस्टम, जैसे लाइनक्स, मानक फ़ोर्क कार्यक्षमता प्रदान करते हैं।)

आवेदन उपयोग

हेलो, वर्ल्ड! का निम्न संस्करण! प्रोग्राम यांत्रिकी को प्रदर्शित करता है, fork सी (प्रोग्रामिंग भाषा) प्रोग्रामिंग भाषा में सिस्टम कॉल प्रोग्राम दो प्रक्रियाओं में बंट जाता है, प्रत्येक यह तय करता है कि फोर्क सिस्टम कॉल के रिटर्न वैल्यू के आधार पर वे किस कार्यक्षमता का प्रदर्शन करते हैं। हेडर फाइल जैसे बॉयलरप्लेट कोड को छोड़ दिया गया है।

int main(void)
{
    pid_t pid = fork();

    if (pid == -1) {
        perror("fork failed");
        exit(EXIT_FAILURE);
    }
    else if (pid == 0) {
        printf("Hello from the child process!\n");
        _exit(EXIT_SUCCESS);
    }
    else {
        int status;
        (void)waitpid(pid, &status, 0);
    }
    return EXIT_SUCCESS;
}

इस प्रकार इस प्रोग्राम का एक विच्छेदन है।

   pid_t pid = fork();

में पहला स्टेटमेंट main कॉल करता है, fork निष्पादन को दो प्रक्रियाओं में विभाजित करने के लिए सिस्टम कॉल का रिटर्न वैल्यू fork प्रकार के एक चर में दर्ज किया गया है, pid_t, जो प्रक्रिया पहचानकर्ताओं (पीआईडी) के लिए पॉज़िक्स प्रकार है।

    if (pid == -1) {
        perror("fork failed");
        exit(EXIT_FAILURE);
    }

माइनस वन एक त्रुटि को इंगित करता है, fork: कोई नई प्रक्रिया नहीं बनाई गई थी, इसलिए एक त्रुटि संदेश प्रिंट हुआ है।

अगर fork सफल रहा, तो अब दो प्रक्रियाएँ हैं, दोनों main क्रियान्वित कर रही हैं, main उस बिंदु से कार्य करें जहां fork रिटर्न हुआ। प्रक्रियाओं को अलग-अलग कार्य करने के लिए, प्रोग्राम को रिटर्न वैल्यू पर ब्रांच (कंप्यूटर साइंस) करना चाहिए, fork यह निर्धारित करने के लिए कि क्या यह चाइल्ड प्रोसेस या पैरेंट प्रोसेस के रूप में निष्पादित हो रहा है।

   else if (pid == 0) {
      printf("Hello from the child process!\n");
      _exit(EXIT_SUCCESS);
   }

चाइल्ड प्रक्रिया में, वापसी मान शून्य के रूप में प्रकट होता है (जो एक अमान्य प्रक्रिया पहचानकर्ता है)। चाइल्ड प्रक्रिया वांछित ग्रीटिंग संदेश प्रिंट करती है, फिर बाहर निकलती है। (तकनीकी कारणों से, पॉज़िक्स {{mono|_exit}सी मानक के स्थान पर} यहां फ़ंक्शन exit का उपयोग किया जाना चाहिए।)

   else {
      int status;
      (void)waitpid(pid, &status, 0);
   }

दूसरी प्रक्रिया पैरेंट से प्राप्त करता है, fork चाइल्ड की प्रक्रिया पहचानकर्ता, जो सदैव एक सकारात्मक संख्या होती है। मूल प्रक्रिया इस पहचानकर्ता को पास करती है, waitpid चाइल्ड के बाहर निकलने तक निष्पादन को निलंबित करने के लिए सिस्टम कॉल को पास करती है। जब ऐसा हो जाता है, तो पैरेंट निष्पादन फिर से प्रारम्भ करते हैं और इसके माध्यम से return स्टेटमेंट द्वारा बाहर निकल जाते हैं।

यह भी देखें







संदर्भ

  1. Nyman, Linus (25 August 2016). "फोर्क और जॉइन के इतिहास पर नोट्स". IEEE Annals of the History of Computing. 38 (3): 84–87. doi:10.1109/MAHC.2016.34.
  2. "s3.s from Research UNIX". GitHub. 1970.
  3. Ken Thompson and Dennis Ritchie (3 November 1971). "एसवाईएस फोर्क (द्वितीय)" (PDF). UNIX Programmer's Manual. Bell Laboratories.
  4. Ritchie, Dennis M.; Thompson, Ken (July 1978). "UNIX टाइम-शेयरिंग सिस्टम" (PDF). Bell System Tech. J. AT&T. 57 (6): 1905–1929. doi:10.1002/j.1538-7305.1978.tb02136.x. Retrieved 22 April 2014.
  5. 5.0 5.1 fork – System Interfaces Reference, The Single UNIX Specification, Version 4 from The Open Group
  6. pipe – System Interfaces Reference, The Single UNIX Specification, Version 4 from The Open Group
  7. 7.0 7.1 vfork(2) – Linux Programmer's Manual – System Calls
  8. 8.0 8.1 "NetBSD Documentation: Why implement traditional vfork()". NetBSD Project. Retrieved 16 October 2013.
  9. "vfork(2)". UNIX Programmer's Manual, Virtual VAX-11 Version. University of California, Berkeley. December 1979.
  10. 10.0 10.1 10.2 vfork – System Interfaces Reference, The Single UNIX Specification, Version 3 from The Open Group
  11. Bach, Maurice J. (1986). The Design of The UNIX Operating System. Prentice–Hall. pp. 291–292. Bibcode:1986duos.book.....B.
  12. 12.0 12.1 12.2 Nakhimovsky, Greg (May 2006). "एप्लिकेशन सबप्रोसेस बनाने के लिए मेमोरी उपयोग को कम करना". Oracle Technology Network. Oracle Corporation. Archived from the original on Sep 22, 2019.
  13. The OpenSolaris posix_spawn() implementation
  14. posix_spawn – System Interfaces Reference, The Single UNIX Specification, Version 4 from The Open Group
  15. fork(2) – Plan 9 Programmer's Manual, Volume 1
  16. intro(2) – Plan 9 Programmer's Manual, Volume 1
  17. rfork(2) – FreeBSD System Calls Manual
  18. 18.0 18.1 Torvalds, Linus (1999). "लिनक्स का किनारा". Open Sources: Voices from the Open Source Revolution. O'Reilly. ISBN 978-1-56592-582-3.
  19. "z/VM > z/VM 6.2.0 > Application Programming > z/VM V6R2 OpenExtensions POSIX Conformance Document > POSIX.1 Conformance Document > Section 3. Process Primitives > 3.1 Process Creation and Execution > 3.1.1 Process Creation". IBM. Retrieved April 21, 2015.