विकिपीडिया के अनुसार (जो गलत हो सकता है)
जब एक कांटा () सिस्टम कॉल जारी किया जाता है, तो मूल प्रक्रिया के अनुरूप सभी पृष्ठों की एक प्रति बनाई जाती है, जिसे चाइल्ड प्रक्रिया के लिए ओएस द्वारा एक अलग मेमोरी लोकेशन में लोड किया जाता है। लेकिन कुछ खास मामलों में इसकी जरूरत नहीं है। उस स्थिति पर विचार करें जब कोई बच्चा एक "
exec
" सिस्टम कॉल निष्पादित करता है (जिसका उपयोग किसी C प्रोग्राम के भीतर से किसी निष्पादन योग्य फ़ाइल को निष्पादित करने के लिए किया जाता है) या इसके तुरंत बाद बाहर निकलता हैfork()
। जब बच्चे को माता-पिता की प्रक्रिया के लिए एक कमांड निष्पादित करने की आवश्यकता होती है, तो माता-पिता की प्रक्रिया के पृष्ठों को कॉपी करने की कोई आवश्यकता नहीं होती है, क्योंकि प्रक्रियाexec
का पता स्थान को बदल देता है जो इसे निष्पादित करने के लिए कमांड के साथ लागू करता है।ऐसे मामलों में, कॉपी-ऑन-राइट (COW) नामक तकनीक का उपयोग किया जाता है। इस तकनीक के साथ, जब एक कांटा होता है, तो माता-पिता की प्रक्रिया के पृष्ठ बच्चे की प्रक्रिया के लिए कॉपी नहीं किए जाते हैं। इसके बजाय, पृष्ठ बच्चे और मूल प्रक्रिया के बीच साझा किए जाते हैं। जब भी कोई प्रक्रिया (माता-पिता या बच्चा) किसी पृष्ठ को संशोधित करता है, तो उस प्रक्रिया (माता-पिता या बच्चे) के लिए अकेले उस विशेष पृष्ठ की एक अलग प्रतिलिपि बनाई जाती है जिसने संशोधन किया। यह प्रक्रिया भविष्य के सभी संदर्भों में साझा की बजाय नए कॉपी किए गए पृष्ठ का उपयोग करेगी। अन्य प्रक्रिया (जो साझा पृष्ठ को संशोधित नहीं करती है) पृष्ठ की मूल प्रतिलिपि का उपयोग करना जारी रखती है (जो अब साझा नहीं है)। इस तकनीक को कॉपी-ऑन-राइट कहा जाता है क्योंकि पेज को कॉपी किया जाता है जब कोई प्रक्रिया इसे लिखती है।
ऐसा लगता है कि जब कोई भी प्रक्रिया पृष्ठ को लिखने की कोशिश करती है तो पृष्ठ की एक नई प्रति आवंटित हो जाती है और उस प्रक्रिया को आवंटित कर दिया जाता है जिससे पृष्ठ दोष उत्पन्न होता है। मूल पृष्ठ को बाद में चिह्नित किया जाता है।
मेरा सवाल यह है कि अगर fork()
किसी प्रक्रिया को साझा पृष्ठ पर लिखने का प्रयास करने से पहले कई बार बुलाया जाता है तो क्या होता है ?
pmap -XX PID
या के साथ सत्यापित कर सकते हैं cat /proc/PID/smap
।