2012-05-16 8 views
9

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

तो मेरा सवाल यह है कि यदि प्रतिलिपि लिखने पर लागू किया गया है, तो क्या बच्चे का उपयोग करने वाली स्मृति की मात्रा को जानने का कोई तरीका है जो मुख्य प्रक्रिया के साथ साझा नहीं किया जाता है? दूसरे शब्दों में, अगर कोई बाल प्रक्रिया वास्तव में उपयोग करती है, तो यह कुछ पढ़ने वाली कॉल से माता-पिता मेमोरी का उपयोग करती है?

शीर्ष, या पीएस कमांड केवल बच्चे की कुल मात्रा को याद करेंगे। (यानी यह मानते हुए कि स्मृति या सूचक में डेटा बच्चे द्वारा प्रतिलिपि बनाई गई है।)

क्या वास्तव में CoW semantics द्वारा उपयोग किए जाने वाले डेटा की मात्रा प्राप्त करने का कोई तरीका है?

मैं /proc/[pid]/smaps के माध्यम से Aix और Mat द्वारा सुझाए गए अनुसार गया, लेकिन मुझे जो कुछ मिला वह बहुत खाली स्मैश फ़ाइलें थी। tail -n 5 */smaps | less और ओ/पी है कि मैं मिल गया

==> 1012/smaps <== 

==> 1074/smaps <== 

==> 10/smaps <== 

==> 1148/smaps <== 

==> 11862/smaps <== 

==> 11/smaps <== 

==> 1355/smaps <== 

==> 1356/smaps <== 

==> 1357/smaps <== 

==> 1358/smaps <== 

==> 1361/smaps <== 

==> 13/smaps <== 

==> 14900/smaps <== 

==> 14/smaps <== 

==> 1501/smaps <== 

==> 15/smaps <== 

==> 1684/smaps <== 

==> 1685/smaps <== 

==> 16/smaps <== 

==> 17772/smaps <== 

==> 17827/smaps <== 

==> 17/smaps <== 

==> 18490/smaps <== 

==> 18/smaps <== 

==> 1932/smaps <== 

==> 1934/smaps <== 

==> 19863/smaps <== 

==> 19/smaps <== 

==> 1/smaps <== 

==> 20125/smaps <== 

==> 20126/smaps <== 

==> 20127/smaps <== 

==> 20128/smaps <== 

==> 20129/smaps <== 

==> 20134/smaps <== 

==> 20135/smaps <== 

==> 20811/smaps <== 

==> 20868/smaps <== 

==> 20/smaps <== 

==> 21116/smaps <== 

==> 21774/smaps <== 

==> 21/smaps <== 

==> 22393/smaps <== 

==> 22394/smaps <== 

==> 22395/smaps <== 

==> 22398/smaps <== 

==> 22639/smaps <== 

==> 22824/smaps <== 

==> 22/smaps <== 

==> 23009/smaps <== 

==> 23058/smaps <== 

==> 23059/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 23835/smaps <== 

==> 23961/smaps <== 

==> 23962/smaps <== 

==> 23963/smaps <== 

==> 23964/smaps <== 

==> 23/smaps <== 

==> 24180/smaps <== 

==> 24268/smaps <== 

==> 24467/smaps <== 

==> 24/smaps <== 

==> 252/smaps <== 

==> 25352/smaps <== 

==> 25435/smaps <== 

==> 25/smaps <== 

==> 26465/smaps <== 

==> 26/smaps <== 

==> 27884/smaps <== 

==> 27/smaps <== 

==> 28/smaps <== 

==> 29/smaps <== 

==> 2/smaps <== 

==> 303/smaps <== 

==> 30/smaps <== 

==> 316/smaps <== 

==> 31/smaps <== 

==> 32074/smaps <== 

==> 32076/smaps <== 

==> 32112/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 32116/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 322/smaps <== 

==> 32466/smaps <== 

==> 32467/smaps <== 

==> 32/smaps <== 

==> 33/smaps <== 

==> 34/smaps <== 

==> 37/smaps <== 

==> 38/smaps <== 

==> 3991/smaps <== 

==> 3992/smaps <== 

==> 39/smaps <== 

==> 3/smaps <== 

==> 4005/smaps <== 

==> 4006/smaps <== 

==> 4007/smaps <== 

==> 4008/smaps <== 

==> 4009/smaps <== 

==> 4010/smaps <== 

==> 4018/smaps <== 

==> 4029/smaps <== 

==> 4038/smaps <== 

==> 4044/smaps <== 

==> 4045/smaps <== 

==> 4046/smaps <== 

==> 4053/smaps <== 

==> 4054/smaps <== 

==> 4055/smaps <== 

==> 40/smaps <== 

==> 41/smaps <== 

==> 42/smaps <== 

==> 4339/smaps <== 

==> 435/smaps <== 

==> 436/smaps <== 

==> 43/smaps <== 

==> 44/smaps <== 

==> 45/smaps <== 

==> 46/smaps <== 

==> 47/smaps <== 

==> 48/smaps <== 

==> 49/smaps <== 

==> 4/smaps <== 

==> 50/smaps <== 

==> 51/smaps <== 

==> 52/smaps <== 

==> 53/smaps <== 

==> 54/smaps <== 

==> 55/smaps <== 

==> 56/smaps <== 

==> 57/smaps <== 

==> 58/smaps <== 

==> 5988/smaps <== 

==> 59/smaps <== 

==> 5/smaps <== 

==> 6058/smaps <== 

==> 6059/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

==> 60/smaps <== 

==> 61/smaps <== 

==> 62/smaps <== 

==> 63/smaps <== 

==> 64/smaps <== 

==> 65/smaps <== 

==> 66/smaps <== 

==> 67/smaps <== 

==> 68/smaps <== 

==> 69/smaps <== 

==> 6/smaps <== 

==> 70/smaps <== 

==> 71/smaps <== 

==> 72/smaps <== 

==> 73/smaps <== 

==> 74/smaps <== 

==> 771/smaps <== 

==> 77/smaps <== 

==> 782/smaps <== 

==> 78/smaps <== 

==> 79/smaps <== 

==> 7/smaps <== 

==> 80/smaps <== 

==> 814/smaps <== 

==> 819/smaps <== 

==> 81/smaps <== 

==> 82/smaps <== 

==> 83/smaps <== 

==> 84/smaps <== 

==> 8654/smaps <== 

==> 8655/smaps <== 

==> 8656/smaps <== 

==> 892/smaps <== 

==> 8/smaps <== 

==> 949/smaps <== 

==> 950/smaps <== 

==> 9/smaps <== 

==> self/smaps <== 
Private_Dirty:   0 kB 
Referenced:   0 kB 
Swap:     0 kB 
KernelPageSize:  4 kB 
MMUPageSize:   4 kB 

तो क्या मैं अब क्या करना चाहिए था: मैं जो फ़ाइलों उन में डेटा है खोजने के लिए इस आदेश की कोशिश की? मेरे पास ऐसी प्रक्रियाएं हैं जिनके पास खाली धुएं हैं जो चल रहे हैं। मैं उन पिड की धुंध कैसे प्राप्त करूं?

+1

ऑपरेटिंग सिस्टम पर निर्भर करता है। लिनक्स? – Mat

+0

हाँ ओएस लिनक्स है। –

+4

http://unix.stackexchange.com/questions/33381/getting-information-about-a-process-memory-usage-from-proc-pid-smaps आपको रुचि हो सकती है – Mat

उत्तर

5

मैं एक उपकरण है कि आप इस जानकारी देना होगा के बारे में पता नहीं है, लेकिन आप शायद इस /proc/[pid]/smaps के आधार पर गणना कर सकते हैं:

/proc/[pid]/smaps (since Linux 2.6.14) 
      This file shows memory consumption for each of the process’s mappings. 
      For each of mappings there is a series of lines such as the following: 

       08048000-080bc000 r-xp 00000000 03:02 13130  /bin/bash 
       Size:    464 kB 
       Rss:    424 kB 
       Shared_Clean:  424 kB 
       Shared_Dirty:   0 kB 
       Private_Clean:  0 kB 
       Private_Dirty:  0 kB 

      The first of these lines shows the same information as is displayed for 
      the mapping in /proc/[pid]/maps. The remaining lines show the size of 
      the mapping, the amount of the mapping that is currently resident in RAM, 
      the number of clean and dirty shared pages in the mapping, and the number 
      of clean and dirty private pages in the mapping. 

जानकारी के लिए, Getting information about a process' memory usage from /proc/pid/smaps देखते हैं।

+0

क्या आप कृपया मुझे/proc/pid/map/smaps से एक और विकल्प बता सकते हैं क्योंकि दोनों फाइलें खाली हैं .. –

+0

@ प्रसंथमधवन: वे आपकी प्रक्रियाओं के लिए भी खाली हैं? – NPE

+0

yup। सब खाली हैं। मेरा प्रश्न देखें यह smaps दिखाता है लेकिन नक्शे भी वही है .. –