2011-06-13 10 views
6

संबंधित कोड:तो मॉलोक किसी भी syscall का आह्वान नहीं करता है?

write(-1, "test", sizeof("test")); 
    void * p = malloc(1024); 
    void * p2 = malloc(510); 
    write(-1, "hi", sizeof("hi")); 

संबंधित strace उत्पादन:

write(4294967295, "test\0", 5)   = -1 EBADF (Bad file descriptor) 
brk(0)         = 0x601000 
brk(0x622000)       = 0x622000 
write(4294967295, "hi\0", 3)   = -1 EBADF (Bad file descriptor) 

मैं हैरान इतनी कम स्तर आपरेशन syscall शामिल नहीं करता है?

+2

मुझे समझ नहीं आता कि तुम क्या कह रहे हैं की बड़ी मात्रा में आवंटित करने के लिए चाहते हैं। 'मॉलोक' कॉल 'ब्रैक' सिस्कल का आह्वान करता है। – Gabe

+0

परीक्षण के माध्यम से मैंने पाया कि 'brk'' malloc' द्वारा उत्पन्न नहीं किया गया है, क्योंकि यदि मैं 'malloc' की संख्या में वृद्धि करता हूं, तो 'brk' में वृद्धि नहीं होती है। – cpuer

+0

क्या आप कह रहे हैं कि यदि आप 'मॉलोक' कॉल को हटाते हैं, तो 'ब्रैक' कॉल ट्रेस से गायब हो जाती हैं? – Gabe

उत्तर

3

आपको क्या लगता है ब्रिक है? malloc बिल्कुल इस उदाहरण में एक syscall का आह्वान कर रहा है, syscall बस "malloc" नहीं है।

3

malloc() सिस्टम brk() फ़ंक्शन (लिनक्स/यूनिक्स में) को कॉल करता है - लेकिन स्थानीय ढेर समाप्त होने पर ही इसे कॉल किया जाता है। अर्थात। अधिकांश मॉलोक कार्यान्वयन ब्रैक() के माध्यम से प्राप्त स्मृति ढेर का प्रबंधन करते हैं, और यदि यह बहुत छोटा या बहुत खंडित है तो वे ब्रैक() के माध्यम से अधिक पूछते हैं।

19

मॉलोक के लिए हर कॉल एक सिस्कल का आह्वान नहीं करता है। मेरे लिनक्स डेस्कटॉप मॉलोक पर 128 केबी ब्लॉक में एक स्थान आवंटित करता है और फिर स्थान वितरित करता है। तो मैं हर 100-200 मॉलोक कॉल के लिए एक सिस्कल देखेंगे। Freebsd malloc पर 2 एमबी ब्लॉक आवंटित करता है। आपकी मशीन संख्याओं की संभावना अलग-अलग होगी।

आप हर malloc पर syscall देखने स्मृति (malloc (10 * 1024 * 1024 * 1024))

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