2012-05-23 10 views
5

निम्न कोड स्निपेट पर विचार करें।वैरिएबल का पता फोर्क() सिस्टम कॉल में संशोधित होने के बाद क्यों रहता है

if (fork() == 0) 
{ 
    a = a + 5; 
    printf("%d, %d \n", a, &a); 
} 
else 
{ 
    a = a - 5; 
    printf ("%d, %d \n", a,& a); 
} 

AFAIK, जब कांटा() किया जाता है, माता पिता की वर्चुअल ऐड्रेस स्पेस बच्चे और दोनों बच्चे & माता पिता साझा करने के लिए एक ही शारीरिक पृष्ठों की नकल की है जब तक उनमें से एक को संशोधित करने की कोशिश करता है। बच्चे & अभिभावक में से एक क्षण एक चर को संशोधित करता है, माता-पिता के भौतिक पृष्ठ को बच्चे के लिए दूसरे पृष्ठ पर कॉपी किया जाता है और भौतिक पृष्ठ निजी रहते हैं। तो, यहां 'ए' का मान बच्चे & अभिभावक में भिन्न है। लेकिन जब बच्चे & माता-पिता में 'ए' के ​​पते के लिए आता है, तो आउटपुट समान होता है। मैं यह समझने में सक्षम नहीं हूं कि भौतिक पृष्ठ भिन्न होने पर भी पता क्यों रहता है।

उत्तर

7

a का पता वास्तविक भौतिक पता नहीं है।

यह एक आभासी पता है।
हार्डवेयर/ओएस परत भौतिक पते पर आभासी पते (आपके आवेदन के लिए अदृश्य रूप से) मानचित्र।

तो पते के समान number हैं, लेकिन वे आपके रैम चिप पर एक ही भौतिक स्मृति को मैप नहीं करते हैं।

पी एस। Printf() का उपयोग करते हुए पता (यानी पॉइंटर) का उपयोग करते समय प्रिंट करें() पी "0 पी"

+0

इसका मतलब है जो भी हम देखते हैं वह आभासी पता है। क्या हम अपने कार्यक्रम के माध्यम से वास्तविक भौतिक पता देख सकते हैं? –

+0

यदि आपको सही (ओएस) उपकरण मिलते हैं। लेकिन सामान्य परिस्थितियों में नहीं। –

+0

उत्तर के लिए धन्यवाद .. –

3

प्रतिक्रिया लगभग आपके प्रश्न में है: a का भौतिक पृष्ठ कॉपी किया गया है (और इस प्रकार मूल प्रक्रिया में समान नहीं है) a संशोधित करने के बाद, लेकिन वर्चुअल एड्रेस (आपके प्रोग्राम द्वारा देखा गया है, &a के माध्यम से) बदलता नहीं है।

वास्तव में यह एक नया मान निर्दिष्ट करते समय a के आभासी पते को बदलने के लिए बहुत अजीब होगा। ,

int *p = &a; 
a = a - 5; 
printf("%d", *p) 

दूसरी पंक्ति पी के बाद अब और a को इंगित नहीं होता एक व्यवहार है कि कोई प्रोग्रामर उम्मीद करेंगे: विचार करें कि क्या होता है, यदि आप पहले a के लिए सूचक रखा था।

कॉपी-ऑन-राइट शारीरिक पृष्ठों के लिए के उपयोग ओएस है कि अपने कार्यक्रम के व्यवहार के लिए अप्रासंगिक है की एक अनुकूलन है: यदि आप विचार कर सकते हैं जब आप कांटा है कि पूरे पता स्थान की नकल की है।

+0

धन्यवाद, यह सहायक था। –