जैसा कि अन्य लोगों ने सही ढंग से बताया है, एक प्रक्रिया द्वारा उपयोग की जाने वाली वास्तविक मेमोरी पर एक हैंडल प्राप्त करना कठिन है, जो साझा क्षेत्रों और mmap'ed फ़ाइलों और whatnot के साथ है।
यदि आप एक प्रयोगकर्ता हैं, तो आप वेलग्रिंड और मासिफ चला सकते हैं । यह आकस्मिक उपयोगकर्ता के लिए थोड़ा भारी हो सकता है लेकिन आपको समय के साथ किसी एप्लिकेशन के मेमोरी व्यवहार का अंदाजा हो जाएगा। यदि एक आवेदन मॉलोक () की वास्तव में इसकी आवश्यकता है तो यह आपको एक प्रक्रिया के वास्तविक गतिशील स्मृति उपयोग का एक अच्छा प्रतिनिधित्व देगा। लेकिन यह प्रयोग "जहर" हो सकता है।
मामलों को जटिल करने के लिए, लिनक्स आपको अपनी मेमोरी को ओवरकम करने की अनुमति देता है । जब आप मैलोच () मेमोरी करते हैं, तो आप मेमोरी का उपभोग करने के लिए अपना इरादा बता रहे हैं। लेकिन आवंटन वास्तव में तब तक नहीं होता है जब तक आप अपने आवंटित "रैम" के एक नए पृष्ठ में एक बाइट नहीं लिखते हैं। आप इस तरह से एक छोटे सी कार्यक्रम लिखने और चलाने के द्वारा खुद को साबित कर सकते हैं:
// test.c
#include <malloc.h>
#include <stdio.h>
#include <unistd.h>
int main() {
void *p;
sleep(5)
p = malloc(16ULL*1024*1024*1024);
printf("p = %p\n", p);
sleep(30);
return 0;
}
# Shell:
cc test.c -o test && ./test &
top -p $!
16GB से कम रैम वाली मशीन पर इसे चलाएं और वॉयला!, आपने सिर्फ 16GB मेमोरी का स्कोर किया है। (नहीं वास्तव में नहीं)।
नोटिस में top
आप "VIRT" को 16.004G के रूप में देखते हैं लेकिन% MEM 0.0 है
इसे फिर से वेलग्रिंड से चलाएं:
# Shell:
valgrind --tool=massif ./test &
sleep 36
ms_print massif.out.$! | head -n 30
और मासिफ कहते हैं "सभी योगों का योग () = 16 जीबी"। इसलिए यह बहुत दिलचस्प नहीं है।
लेकिन, यदि आप एक पर में चलाते हैं तो समझदार प्रक्रिया:
# Shell:
rm test test.o
valgrind --tool=massif cc test.c -o test &
sleep 3
ms_print massif.out.$! | head -n 30
--------------------------------------------------------------------------------
Command: cc test.c -o test
Massif arguments: (none)
ms_print arguments: massif.out.23988
--------------------------------------------------------------------------------
KB
77.33^ :
| #:
| :@::@:#:
| :::::@@::@:#:
| @:: :::@@::@:#:
| ::::@:: :::@@::@:#:
| ::@:::@:::::@:: :::@@::@:#:
| @::@:::@:::::@:: :::@@::@:#:
| @::@:::@:::::@:: :::@@::@:#:
| :@@@@@@@@@@@@@@@@@@@@:@::@:::@:::::@:: :::@@::@:#:
| :@@ :@::@:::@:::::@:: :::@@::@:#:
| :@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| :::::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| ::::::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
| ::::::::@::::@@:@@ :@::@:::@:::::@:: :::@@::@:#:
0 +----------------------------------------------------------------------->Mi
0 1.140
और यहां हम देखते हैं (बहुत अनुभवजन्य और बहुत अधिक आत्मविश्वास के साथ) कि संकलक ने ढेर का 77KB आवंटित किया।
सिर्फ ढेर उपयोग पाने के लिए इतनी मेहनत क्यों करें? क्योंकि सभी साझा किए गए ऑब्जेक्ट और टेक्स्ट सेक्शन जो एक प्रक्रिया का उपयोग करते हैं (इस उदाहरण में, संकलक) बहुत दिलचस्प नहीं हैं। वे एक प्रक्रिया के लिए निरंतर ओवरहेड हैं। वास्तव में, प्रक्रिया के बाद के आक्रमण लगभग "मुक्त" के लिए आते हैं।
इसके अलावा, निम्नलिखित की तुलना करें और इसके विपरीत करें:
MMAP () 1GB फ़ाइल। आपका VMSize 1 + GB होगा। लेकिन आप रेजिडेंट सेट साइज़ केवल उस फ़ाइल के भाग होंगे, जिसके कारण आपको उस क्षेत्र में एक पॉइंटर (dereferencing द्वारा) पृष्ठांकित करने का कारण बना। और यदि आप पूरी फाइल को "पढ़" लेते हैं, तब, जब तक आप अंत तक नहीं पहुंच जाते, तब तक कर्नेल ने पहले ही शुरुआत को रोक दिया होगा (यह करना आसान है क्योंकि कर्नेल को पता है कि उन पृष्ठों को फिर से कैसे / कहाँ से बदलना है अगर फिर से शुरू किया गया हो )। या तो मामले में, न तो VMSize और न ही RSS आपकी मेमोरी "उपयोग" का एक अच्छा संकेतक है। आपने वास्तव में कुछ भी नहीं किया है।
इसके विपरीत, मल्लोक () और स्मृति के बहुत से स्पर्श - जब तक कि आपकी स्मृति डिस्क पर स्वैप नहीं हो जाती। तो आपकी आवंटित मेमोरी अब आपके RSS से अधिक हो गई है। यहां, आपका VMSize आपको कुछ बताना शुरू कर सकता है (आपकी प्रक्रिया वास्तव में आपके रैम में रहने की तुलना में अधिक स्मृति का मालिक है)। लेकिन अभी भी वीएम के बीच अंतर करना मुश्किल है जो साझा किए गए पृष्ठ और वीएम है जो डेटा स्वैप किया गया है।
यह वह जगह है जहाँ वेलग्रिंड / मासिफ दिलचस्प हो जाता है। यह आपको दिखाता है कि आपने जानबूझकर क्या आवंटित किया है (आपके पृष्ठों की स्थिति की परवाह किए बिना)।
htop
लेखक के एक जवाब को उसी दिन साझा करना चाहिए जैसा कि मैंने दूसरे दिन किया था ... स्मृति के उपयोग की गणना कैसे करें / proc / meminfo (जैसे htop) से