क्या कांटा () लिनक्स में पूरी प्रक्रिया को तुरंत कॉपी करता है?


30

एक fork()सिस्टम कॉल क्लोन एक बच्चे की प्रक्रिया को चलाने की प्रक्रिया से करता है। दो प्रक्रियाएं उनके पीआईडी ​​को छोड़कर समान हैं।

स्वाभाविक रूप से, अगर प्रक्रियाएं केवल लिखने के बजाय अपने ढेर से पढ़ रही हैं, तो ढेर की नकल करना स्मृति का एक बड़ा अपशिष्ट होगा।

क्या पूरी प्रक्रिया को कॉपी किया गया है? क्या इसे इस तरह से अनुकूलित किया जाता है कि केवल लेखन एक ढेर की प्रतिलिपि को ट्रिगर करता है?

जवाबों:


19

लिखने पर mmap / copy का उपयोग करके की संपूर्णताfork() लागू की जाती है।

यह न केवल ढेर को प्रभावित करता है, बल्कि पुस्तकालयों, स्टैक, बीएसएस क्षेत्रों को भी साझा करता है।

जो, संयोग से, इसका मतलब है कि कांटा एक अत्यंत हल्का ऑपरेशन है, जब तक कि परिणामस्वरूप 2 प्रक्रियाएं (माता-पिता और बच्चे) वास्तव में मेमोरी रेंज में लिखना शुरू नहीं करते हैं। यह विशेषता कांटा-बमों की सुस्ती के लिए एक प्रमुख योगदानकर्ता है - आप पृष्ठ प्रतिकृति और विभेदन के साथ कर्नेल के अतिभारित होने से पहले कई प्रक्रियाओं को समाप्त कर देते हैं।

आपको आधुनिक OS में एक ऑपरेशन का एक उदाहरण खोजने के लिए मुश्किल से दबाया जाएगा जहां कर्नेल एक हार्ड कॉपी करता है (डिवाइस ड्राइवर अपवाद रहा है) - यह वीएम कार्यक्षमता को नियोजित करने के लिए अभी तक बहुत आसान और अधिक कुशल है।

यहां तक execve()कि अनिवार्य रूप से "कृपया एमएमपी बाइनरी / ld.so / whatnot, उसके बाद निष्पादित" - और वीएम रैम और निष्पादन के लिए प्रक्रिया के वास्तविक लोडिंग को संभालता है। स्थानीय अनइंस्टाल्यूटेड वैरिएबल 'शून्य-पृष्ठ' से मिमीपेड किए जा रहे हैं - विशेष रीड-ओनली कॉपी-ऑन-राइट पेज जिसमें जीरो हैं, स्थानीय इनिशियलाइज्ड वैरिएबल अंत में मिमीपेड (कॉपी-ऑन-राइट, फिर से) बाइनरी फाइल से ही होते हैं। आदि।


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

24

लिनक्स कर्नेल कॉपी-ऑन-राइट को लागू करता है जब fork()कहा जाता है। जब syscall निष्पादित किया जाता है, तो माता-पिता और बच्चे के हिस्से वाले पृष्ठ केवल-पढ़ने के लिए चिह्नित होते हैं।

यदि रीड-ओनली पेज पर कोई लेखन किया जाता है, तो इसे कॉपी किया जाता है, क्योंकि मेमोरी अब दो प्रक्रियाओं के बीच समान नहीं है। इसलिए, यदि केवल रीड-ऑपरेशन का प्रदर्शन किया जा रहा है, तो पृष्ठों को बिल्कुल भी कॉपी नहीं किया जाएगा।


1
+1 धन्यवाद! 1. क्या आप संदर्भ लिंक प्रदान कर सकते हैं? 2. क्या ढेर पूरी तरह से, या भागों में कॉपी किया गया है?
एडम मटन

4
2. - पेजों में: कर्नेल को "हीप" के बारे में बहुत कम समझ है - कर्नेल के लिए, यह केवल मिमीपेड निजी पृष्ठों का एक गुच्छा है, जो कि libc आवंटनकर्ता कृपया के रूप में संभालते हैं।
qdot

क्या यह वास्तव में एक कांटा-बम जरूरी है? यह मुझे लगता है कि वर्तमान प्रक्रिया को धन्यवाद देने के बजाय, यह कोड उसी प्रोग्राम के अधिक उदाहरण बनाएगा जो fork()कॉल के बाद अगले निर्देश के बजाय स्टार्ट से निष्पादित करते हैं।
शेरेरेबल्क

@mmk FYI करें, मैं आपके "दिलचस्प पक्ष-नोट:" से काफी आश्चर्यचकित था और इसलिए मैंने देखने के लिए (लिनक्स 3.2.0 पर) परीक्षण किया, और यह सच प्रतीत नहीं होता है। मैंने /proc/self/pagemapपरीक्षण के उद्देश्य के लिए भौतिक पृष्ठ मैपिंग के लिए आभासी पते का निर्धारण किया । जैसा कि मुझे उम्मीद थी, अगर ग्रैंड-चाइल्ड और केवल ग्रैंड-चाइल्ड साझा पेज लिखते हैं, तो माता-पिता और मूल बच्चे इसे साझा करना जारी रखते हैं। एक निजी प्रति के साथ केवल भव्य बच्चे ही समाप्त होते हैं।
सेलडा

@Celada। हम्म। मैंने इसे कहीं पढ़ा था, और मुझे यह याद नहीं है कि यह जिस कर्नेल संस्करण का जिक्र कर रहा था (शायद कोई पुराना है?), इसलिए, यह अब मान्य नहीं हो सकता है।
एमएमके

10

लिनक्स कॉपी-ऑन-राइट लिखता है। के रूप में forkएक नई प्रक्रिया बनाता है, आवंटित पृष्ठों केवल पढ़ने के रूप में चिह्नित और माता पिता और बच्चे के बीच साझा कर रहे हैं। जब दोनों में से कोई एक पृष्ठ को संशोधित करने का प्रयास करता है, तो पृष्ठ की प्रतिलिपि बनाने और पृष्ठ तालिका को उचित रूप से समायोजित करने के परिणामस्वरूप एक पृष्ठ दोष उत्पन्न होता है।

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