2014-09-11 14 views
5

जब ओएस स्मृति में प्रक्रिया लोड करता है तो यह स्टैक पॉइंटर को वर्चुअल एड्रेस में प्रारंभ करता है, यह तय करता है कि स्टैक को प्रक्रिया के वर्चुअल एड्रेस स्पेस में जाना चाहिए और प्रोग्राम कोड इस रजिस्टर का उपयोग यह पता लगाने के लिए करता है कि स्टैक वैरिएबल कहां हैं। मेरा सवाल यह है कि malloc() कैसे पता चलता है कि ढेर के आभासी पते पर क्या शुरू होता है? क्या डेटा सेगमेंट के अंत में ढेर हमेशा मौजूद होता है, यदि ऐसा है तो malloc() कैसे पता है कि यह कहां है? या यह भी स्मृति खंड का एक संगत क्षेत्र है या डेटा अनुभाग में अन्य वैश्विक चर के साथ यादृच्छिक रूप से छेड़छाड़ किया गया है?malloc() कैसे पता चलता है कि ढेर शुरू होता है?

+0

इसे हार्ड-कोड किया जा सकता है। –

+4

मुझे लगता है कि मंच विशिष्ट होगा।क्या आप एक विशिष्ट मंच के लिए उत्तर पाने में रुचि रखते हैं? –

+1

संभावित डुप्लिकेट [मालोक() और फ्री() कैसे काम करते हैं?] (Http://stackoverflow.com/questions/1119134/how-do-malloc-and-free-work) – ControlAltDel

उत्तर

9

malloc कार्यान्वयन ऑपरेटिंग सिस्टम पर निर्भर हैं; तो प्रक्रिया है कि वे ढेर की शुरुआत पाने के लिए उपयोग करते हैं। यूनिक्स पर, इसे प्रारंभिक समय पर sbrk(0) पर कॉल करके पूरा किया जा सकता है। अन्य ऑपरेटिंग सिस्टम पर प्रक्रिया अलग है।

ध्यान दें कि आप ढेर के स्थान को जानने के बिना malloc लागू कर सकते हैं। आप मुफ्त सूची को NULL पर प्रारंभ कर सकते हैं, और sbrk पर कॉल कर सकते हैं या आवंटन आकार के साथ एक समान फ़ंक्शन प्रत्येक बार उचित आकार का एक मुक्त तत्व नहीं मिला है।

+0

अहह, प्रकाश चालू हो जाता है। यही वह है जिसकी तलाश में मैं हूं। – mclaassen

+0

अन्य उल्लिखित उत्तर इस पंक्ति के कारण उलझन में था "एसआरबीके सिस्टम कॉल डेटा सेगमेंट की" सीमा "को ले जाती है।" और, मेरी समझ से डेटा सेगमेंट जहां वैश्विक डेटा संग्रहीत किया जाता है। इसलिए मैंने माना कि ढेर डेटा सेगमेंट के अंत में होना चाहिए, लेकिन यह नहीं मिला कि कैसे malloc() को पता था कि अंत कहां था। – mclaassen

0

विंडोज़ पर, आप प्रक्रिया ढेर स्मृति प्राप्त करने के लिए Heap functions का उपयोग करते हैं। सी रनटाइम HeapAlloc का उपयोग करके ढेर पर मेमोरी ब्लॉक आवंटित करेगा और फिर malloc अनुरोधों को पूरा करने के लिए इसका उपयोग करेगा।

2

यह केवल बारे में लिनक्स या Posix पर malloc

कई malloc कार्यान्वयन के लिनक्स कार्यान्वयन mmap(2) syscall का उपयोग स्मृति से कुछ काफी बड़ा रेंज पाने के लिए। तो वे इसे जारी करने के लिए munmap(2) का उपयोग कर सकते हैं।

(ऐसा लगता है कि sbrk(2) किसी भी अधिक एक बहुत उपयोग नहीं किया जा सकता है की तरह, विशेष रूप से, यह अनुकूल ASLR नहीं है और नहीं हो सकता है बहु धागा अनुकूल) तो

इन दोनों syscalls काफी प्रशस्त हो सकता है, कुछ कार्यान्वयन काफी बड़े हिस्सों में स्मृति (mmap का उपयोग करके) से पूछते हैं (उदाहरण के लिए एक या कुछ मेगाबाइट्स के हिस्से में)। फिर वे मुफ्त स्थान का प्रबंधन करते हैं उदा। ब्लॉक की लिंक्ड सूचियां, आदि। वे अलग-अलग छोटे mallocs और बड़े mallocs संभाल लेंगे।

mmap syscall आमतौर पर (ASLR की वजह से विशेष रूप से कुछ तय टुकड़े पर स्मृति रेंज देने शुरू नहीं करता है

एक साधारण प्रोग्राम एक भी malloc (जैसे 128 int की का परिणाम मुद्रण चलाने के लिए अपने सिस्टम पर कोशिश करें। - रों)। आप शायद अलग-अलग पतों एक रन से अगले करने के लिए (क्योंकि ASLR की) का पालन करेंगे। और strace(1) आईएनजी यह बहुत शिक्षाप्रद है। यह भी प्रयास करें cat /proc/self/maps (या अपने कार्यक्रम के अंदर /proc/self/maps की तर्ज प्रिंट)। देखें proc(5)

तो वें "शुरू करने" की कोई आवश्यकता नहीं है कुछ पते पर ढेर, और कई प्रणालियों पर जो किसी भी भावना को नहीं बनाता है। कर्नेल यादृच्छिक पृष्ठों पर वर्चुअल पतों के सेगमेंट दे रहा है।

बीटीडब्ल्यू, GNU libc और musl libcfree software हैं। आपको उनके malloc कार्यान्वयन के स्रोत कोड के अंदर देखना चाहिए। मुझे लगता है कि source code of musl libc बहुत पठनीय है।

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