जब एक प्रक्रिया कांटे इसकी आभासी या निवासी स्मृति की प्रतिलिपि बनाई जाती है?


12

लिनक्स में नई प्रक्रियाएँ बनाने का मानक तरीका यह है कि मूल प्रक्रिया की मेमोरी फ़ुटप्रिंट की प्रतिलिपि बनाई जाती है और जिसे तब तक बच्चे की प्रक्रिया का वातावरण execvकहा जाता है।

हम किस मेमोरी फ़ुटप्रिंट के बारे में बात कर रहे हैं, वर्चुअल (जो अनुरोध की गई प्रक्रिया है) या निवासी एक (वास्तव में क्या उपयोग किया जा रहा है)?

प्रेरणा: मेरे पास सीमित स्वैप स्थान के साथ एक उपकरण है और आभासी और निवासी मेमोरी पदचिह्न के बीच एक बड़ा अंतर है। स्मृति की कमी के कारण एप्लिकेशन कांटा नहीं कर सकता है और यह देखना चाहेगा कि आभासी पदचिह्न आकार को कम करने की कोशिश में मदद मिलेगी या नहीं।

जवाबों:


12

आधुनिक प्रणालियों में कोई भी मेमोरी वास्तव में सिर्फ इसलिए कॉपी नहीं की जाती है क्योंकि फोर्क सिस्टम कॉल का उपयोग किया जाता है। यह सब केवल पृष्ठ तालिका में पढ़ा गया है, जैसे कि कर्नेल कोड में ट्रैप लिखने का पहला प्रयास होगा। केवल एक बार लिखने की पहली प्रक्रिया में ही नकल की कोशिश होगी।

इसे कॉपी-ऑन-राइट के रूप में जाना जाता है।

हालाँकि इसके लिए प्रतिबद्ध पते की जगह पर नज़र रखना आवश्यक हो सकता है। यदि कर्नेल को किसी पृष्ठ को कॉपी करने के समय कोई मेमोरी या स्वैप उपलब्ध नहीं है, तो उसे मेमोरी को मुक्त करने के लिए कुछ प्रक्रिया को मारना होगा। यह हमेशा वांछनीय नहीं होता है, इसलिए कर्नेल ने कितनी स्मृति के लिए यह ट्रैक करना संभव है।

यदि कर्नेल उपलब्ध मेमोरी + स्वैप से अधिक के लिए प्रतिबद्ध होगा, तो यह फोर्क कॉल करने के प्रयास पर एक त्रुटि कोड दे सकता है। यदि पर्याप्त उपलब्ध हो तो कांटा कांटा के बाद दोनों प्रक्रियाओं के लिए माता-पिता के पूर्ण आभासी आकार के लिए प्रतिबद्ध होगा।


1
If enough is available the kernel will commit to the full virtual size of the parent for both processes after the fork.हाँ धन्यवाद। मतलब है कि सीमित मेमोरी (रैम और स्वैप) वाले वातावरण में प्रक्रिया के आभासी पदचिह्न को कम करने से कांटा नहीं होने के मुद्दे को हल किया जा सकता है।
TheMeaningfulEngineer

1
@ एलन हां। यदि forkअपर्याप्त स्मृति का संकेत करने वाले त्रुटि संदेश के साथ विफल हो जाता है। फिर फोर्किंग से पहले प्रक्रिया के वर्चुअल मेमोरी उपयोग को कम करने में मदद मिल सकती है।
कैस्परल्ड

5

चिंता न करें, यह एक आलसी कॉपी (कॉपी-ऑन-राइट) बनाता है। दोनों प्रक्रियाओं के वर्चुअल मेमोरी एड्रेस शुरुआत में एक ही पेज की ओर इशारा करते हैं, लेकिन जब कांटे की प्रक्रिया इसे संशोधित करने की कोशिश करती है, तो यह वास्तव में पेज की एक भौतिक प्रतिलिपि बनाता है (तब से, वह पेज आपकी रैम में दो स्थानों पर रहता है)।

खबरदार, रिपोर्ट किए गए मेमोरी फुटप्रिंट्स में से कोई भी वास्तव में आपको नहीं बताता है कि प्रक्रिया कितनी रैम का उपयोग कर रही है। स्वैपिंग, मेमोरी शेयरिंग और वर्चुअल मेमोरी के साथ अन्य मुद्दों के कारण, यह सुनिश्चित करना असंभव है। मेमोरी स्पेस के कुछ हिस्सों को लाइब्रेरीज़ (जहाँ उन्हें गिनना है?) साझा किया जाता है, कुछ गैर-रैम मेमोरी (अन्य हार्डवेयर डिवाइस) को संदर्भित करते हैं, कुछ को वर्तमान में स्वैप किया जाता है, कुछ को अभी तक कॉपी नहीं किया गया है (कॉपी-ऑन-राइट) और जल्द ही। इसे पढ़ें:

https://lwn.net/Articles/642202/


5

कर्नेल सेटिंग है

/ Proc / sys / VM / overcommit_memory

उत्कृष्ट लेख से उद्धरण :

Since 2.5.30 the values are: 0 (default): as before: guess about how much  
overcommitment is reasonable, 1: never refuse any malloc(), 2: be precise 
about the overcommit - never commit a virtual address space larger than swap 
space plus a fraction overcommit_ratio of the physical memory. Here 
/proc/sys/vm/overcommit_ratio (by default 50) is another user-settable 
parameter. It is possible to set overcommit_ratio to values larger than 100. 
(See also Documentation/vm/overcommit-accounting.)

यह कांटे के साथ-साथ नियमित मालॉक पर भी लागू होता है। यानी अगर आप इसे 0 पर सेट करते हैं, तो फोर्क को कॉपी पर लिख दिया जाएगा। कॉपी ऑन राइट का मतलब है कि एक बार ऐप के फोर्क हो जाने के बाद, यह दोनों प्रतियां मेमोरी पेजेज चाइल्ड का उपयोग करेंगी या मूल मेमोरी को बदलना शुरू कर देंगी।

अधिकांश वितरणों में मुझे पता है कि ओवरकमिटी 0. है, लेकिन यदि आप इसे 2 पर सेट करते हैं, तो सभी मेमोरी पेज पूरी तरह से वास्तविक मेमोरी द्वारा समर्थित होंगे और कुछ मामलों में उच्च मेमोरी दबाव में अधिक स्थिर होगा, लेकिन कुछ प्रोग्राम (मैंने गिट का सामना किया) जो भरोसा करते हैं overcommits में विफल हो जाएगा।

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