2010-02-01 12 views
5

विभिन्न कार्यक्रमों पर आरएसएस से अधिक होने की कोशिश करने वाले प्रोग्राम का एक टुकड़ा चलाते समय मैं पूरी तरह से अलग व्यवहार देखता हूं। कोड कुछ ऐसा है:मॉलोक विभिन्न मशीनों पर अलग-अलग व्यवहार करता है

... 
    char** s = (char**)malloc(10000*sizeof(char*)); 

    for (i = 0; i < 10000; i++){ 
    s[i] = (char*)malloc(1000*1000*sizeof(char)); 
    if (s[i] == NULL) { 
     printf("cannot allocate memory for s[%d]",i); 
     exit(1); 
    } 
    } 

    int j = 0; 
    while(1){ 
    for (i = 0; i < 10000; i++){ 
     for (j = 0; j < 1000*1000; j++) { 
     s[i][j] = 1; 
     } 
     if ((i % 100) == 0) printf("i = %d\n", i); 
    } 
    } 
    for (i = 0; i < 10000; i++) 
    free(s[i]); 
    free(s); 
... 

उपरोक्त कोड मॉलोक का उपयोग करके लगभग 10 जीबी मेमोरी आवंटित करने का प्रयास करता है। पहली दो मशीनों ने मैंने इस कोड को लिनक्स कर्नेल 2.6 पर चलाने की कोशिश की और आखिरी वाला लिनक्स कर्नेल 2.4 चलाता है। यहां इन मशीनों पर देखे गए व्यवहार हैं:

मशीन 1: मेमोरी ओवरकमिट का उपयोग करके स्मृति आवंटित की जाती है, लेकिन जब लूप में मेमोरी स्थानों को मान निर्दिष्ट करते हैं, तो यह केवल आरएसएस की अनुमति के रूप में आवंटित करता है। इस प्रकार ओओएम किलर प्रक्रिया को मारता है जब मैं = 3800 मुद्रित होता हूं जो इस मशीन के लगभग 4 जीबी मेमोरी है।

मशीन 2: मेमोरी ओवरकमिट का उपयोग करके स्मृति आवंटित की जाती है और जबकि लूप हमेशा के लिए चला जाता है, वर्चुअल मेमोरी से पृष्ठों को आवंटित करता है। I = 3800 मुद्रित होने के बाद प्रक्रिया धीमी हो जाती है जो सामान्य है।

मशीन 3: इस मशीन में केवल 2 जीबी मेमोरी है। स्मृति भी आवंटित नहीं किया जा सकता है। ऐसा लगता है कि ओवर प्रतिबद्धता सेट नहीं है या कर्नेल 2.4 malloc का उपयोग कर आभासी मशीन पृष्ठों आवंटित करने का समर्थन नहीं करता है! इस प्रकार लूप के लिए पहले में यह i = 2138

के लिए स्मृति आवंटित करते समय बाहर निकलता है मेरी वांछित कार्रवाई मशीन 2 में होती है। क्या किसी को पता है कि ओएस को मॉलोक का उपयोग करके वर्चुअल मेमोरी पेज आवंटित करने और पेजिंग शुरू करने की अनुमति देने के लिए कौन सी (कर्नेल?) विकल्प सेट करना होगा, जबकि आवश्यक मेमोरी आरएसएस से अधिक हो?

धन्यवाद

+1

पहले आवंटन के 'if (s! = NULL) 'कहां है? –

+0

व्यक्तिगत वरीयता: 'char ** s = (char **) malloc (10000 * sizeof (char *)) के बजाय;' और 's [i] = (char *) malloc (10000 * sizeof (char)); 'मैं 'char ** s = malloc (10000 * आकार * एस) करूँगा;' और 's [i] = malloc (10000 * आकार ** **);'। इस तरह, यदि भविष्य में 'char **' से 'wchar_t ** 'में' '' परिवर्तन होता है, तो आपके सभी' malloc 'कॉल आवश्यकतानुसार अनुकूलित होंगे। आम तौर पर, कास्टिंग में 'malloc() 'का रिटर्न वैल्यू जरूरी नहीं है, और कुछ (जैसे स्वयं) को एक बुरा विचार माना जाता है क्योंकि यह रखरखाव में बाधा डालता है। –

+0

वास्तुकला? x86_64? –

उत्तर

5

आप एक 32-बिट मशीन पर 100GB आवंटित और नियमित रूप से संकेत दिए गए, जो कि आपके कोड का उपयोग करने लगता है का उपयोग कर इसे संबोधित करने के लिए सक्षम नहीं होगा। तथ्य यह है कि मशीन 1 प्रक्रिया को समाप्त करता है जब यह लगभग 4 जीबी और मशीन 2 हिट करता है, यह दृढ़ता से सुझाव नहीं देता है कि मशीन 2 64-बिट ओएस चला रहा है।

+0

मैंने अपने मूल संदेश में एक गलती की जिसे मैंने संपादित और तय किया। यदि आप कोड देखते हैं तो यह केवल 10 जीबी मेमोरी के लिए अनुरोध कर रहा है और 100 जीबी नहीं है। किसी भी तरह, दोनों मशीन 1 और 2 64-बिट ओएस चल रहे हैं। इन दोनों को समान माना जाना चाहिए क्योंकि उनके हार्डवेयर बिल्कुल वही हैं और समान रूप से कॉन्फ़िगर किए गए हैं। – Pirooz

संबंधित मुद्दे