c - बाल प्रक्रिया और मूल प्रक्रिया के वैरिएबल का पता समान क्यों है




unix fork (2)

पता 'समान' है क्योंकि प्रत्येक प्रक्रिया का अपना वर्चुअल पता स्थान है और सामान्य रूप से समान स्थान पर लोड हो जाएगा। ध्यान दें कि यह स्मृति में भौतिक पता नहीं है यह भी ध्यान रखें कि ऐसी योजनाएं हैं जो जानबूझकर उस स्थान को यादृच्छिक रूप से यादृच्छिक बनाते हैं जिस पर प्रक्रिया को लोड किया जाता है ताकि प्रक्रिया पर हमला / हैक कर सके। उस स्थिति में पता अलग होगा

यहाँ मेरा कोड है

int main()
{
  pid_t pid;
  int y = 3;  
  if ( (pid = fork()) <0 )
   return -1;;

  if( pid == 0 )  /* child */
  {
    printf(" before: %d %p\n", y, &y );
    y *= 10;
    printf("after: %d %p\n", y, &y );
  }
  else /* father */
  {
   sleep(1);
   printf("father: %d %p\n" , y , &y );

  }
  return 0;
}

कार्यक्रम का उत्पादन निम्नलिखित की तरह है:

before: 3 ffbff440
after: 30 ffbff440
father: 3 ffbff440

मेरा प्रश्न यह है कि बच्चे और माता-पिता के वैल्यू का पता क्यों है लेकिन मूल्य अलग है?


क्योंकि यह एक आभासी पता है, भौतिक एक नहीं

प्रत्येक प्रक्रिया को अपना पता स्थान मिलता है (उदाहरण के लिए, एक 32-बिट सिस्टम प्रत्येक प्रक्रिया को पूर्ण 4G श्रेणी के साथ अपना पता स्थान दे सकती है)।

यह स्मृति प्रबंधन इकाई है जो भौतिक पते को वर्चुअल पताओं को मैप करेगा (और पृष्ठ खराब होने पर चीजों को संभालने के लिए यदि पृष्ठों को स्वैप किया जाता है तो उन्हें द्वितीयक भंडारण से वापस खरीदा जाना चाहिए)।

निम्न चित्र में मदद मिल सकती है, प्रत्येक अनुभाग स्मृति के 4K ब्लॉक का प्रतिनिधित्व करता है:

   Process A           Physical Memory      Process B
   +-------+           +-------------+      +-------+
0K |       |---->   0K |  (shared)   | <----|       | 0K
   +-------+           +-------------+      +-------+
4K |       |--+     4K |             | <----|       | 4K
   +-------+  |        +-------------+      +-------+
8K |       |  +->   8K |             |      |       | 8K
   +-------+           +-------------+      +-------+
       |                : : : : : : :           |
       |               +-------------+          |
       |          128K |             | <--------+
       |               +-------------+
       +--------> 132K |             |
                       +-------------+

आप देख सकते हैं, उस चित्र में, आभासी स्मृति पते और भौतिक स्मृति पते (और मेमोरी ब्लॉक को साझा करने के लिए प्रक्रियाओं की संभावना) के बीच डिस्कनेक्ट। बाएं और दाएं पक्ष के नीचे स्थित पते वर्चुअल पतों हैं जो प्रक्रियाओं को देखते हैं।

केंद्रीय ब्लॉक में मौजूद पते वास्तविक भौतिक पते हैं जहां डेटा "वास्तव में" है, और एमएमयू मैपिंग को संभालता है।

fork (और exec ) की गहरी व्याख्या के लिए, आप इस उत्तर को भी देखना चाह सकते हैं।





copy-on-write