जब ओएस स्मृति में प्रक्रिया लोड करता है तो यह स्टैक पॉइंटर को वर्चुअल एड्रेस में प्रारंभ करता है, यह तय करता है कि स्टैक को प्रक्रिया के वर्चुअल एड्रेस स्पेस में जाना चाहिए और प्रोग्राम कोड इस रजिस्टर का उपयोग यह पता लगाने के लिए करता है कि स्टैक वैरिएबल कहां हैं। मेरा सवाल यह है कि malloc() कैसे पता चलता है कि ढेर के आभासी पते पर क्या शुरू होता है? क्या डेटा सेगमेंट के अंत में ढेर हमेशा मौजूद होता है, यदि ऐसा है तो malloc() कैसे पता है कि यह कहां है? या यह भी स्मृति खंड का एक संगत क्षेत्र है या डेटा अनुभाग में अन्य वैश्विक चर के साथ यादृच्छिक रूप से छेड़छाड़ किया गया है?malloc() कैसे पता चलता है कि ढेर शुरू होता है?
उत्तर
malloc
कार्यान्वयन ऑपरेटिंग सिस्टम पर निर्भर हैं; तो प्रक्रिया है कि वे ढेर की शुरुआत पाने के लिए उपयोग करते हैं। यूनिक्स पर, इसे प्रारंभिक समय पर sbrk(0)
पर कॉल करके पूरा किया जा सकता है। अन्य ऑपरेटिंग सिस्टम पर प्रक्रिया अलग है।
ध्यान दें कि आप ढेर के स्थान को जानने के बिना malloc
लागू कर सकते हैं। आप मुफ्त सूची को NULL
पर प्रारंभ कर सकते हैं, और sbrk
पर कॉल कर सकते हैं या आवंटन आकार के साथ एक समान फ़ंक्शन प्रत्येक बार उचित आकार का एक मुक्त तत्व नहीं मिला है।
अहह, प्रकाश चालू हो जाता है। यही वह है जिसकी तलाश में मैं हूं। – mclaassen
अन्य उल्लिखित उत्तर इस पंक्ति के कारण उलझन में था "एसआरबीके सिस्टम कॉल डेटा सेगमेंट की" सीमा "को ले जाती है।" और, मेरी समझ से डेटा सेगमेंट जहां वैश्विक डेटा संग्रहीत किया जाता है। इसलिए मैंने माना कि ढेर डेटा सेगमेंट के अंत में होना चाहिए, लेकिन यह नहीं मिला कि कैसे malloc() को पता था कि अंत कहां था। – mclaassen
विंडोज़ पर, आप प्रक्रिया ढेर स्मृति प्राप्त करने के लिए Heap functions का उपयोग करते हैं। सी रनटाइम HeapAlloc
का उपयोग करके ढेर पर मेमोरी ब्लॉक आवंटित करेगा और फिर malloc
अनुरोधों को पूरा करने के लिए इसका उपयोग करेगा।
यह केवल बारे में लिनक्स या 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 बहुत पठनीय है।
- 1. जब कंप्यूटर चालू होता है: यह कैसे पता चलता है कि इसे किस निर्देश से निष्पादित करना शुरू करना है?
- 2. पता चलता है कि सीएसएस टिप्पणी
- 3. जब पता चलता है कि उपयोगकर्ता जावा
- 4. malloc() और ढेर मेमोरी
- 5. कैसे पता चलता है कि दो वाक्य समान हैं?
- 6. प्रक्रिया को कैसे पता चलता है कि इसे
- 7. वर्डप्रेस वर्गीकरण - यह कैसे पता चलता है कि object_id?
- 8. मैं कैसे पता चलता है कि क्या, स्थायी पीढ़ी
- 9. शुरू होता है
- 10. बीएसएस, ढेर, ढेर, डेटा, कोड/पाठ - इनमें से प्रत्येक स्मृति में कब शुरू होता है?
- 11. किसी को यह पता चलता है कि GLIBCXX संस्करण
- 12. जेवीएम कैसे पता चलता है कि रनटाइम पर अपवाद कैसा है?
- 13. NSMutableAttributedString विशेषता है कि अशून्य सूचकांक में शुरू होता है
- 14. स्प्रिंग सुरक्षा से पता चलता है कि कस्टम सदस्यता
- 15. कुशलता से पता चलता है कि तर्कसंगत संख्या बराबर
- 16. कैसे पता चलेगा कि urllib.urlretrieve सफल होता है?
- 17. पता लगाएं कि ढेर मेमोरी दूषित हो जाती है
- 18. आईफोन - यह कैसे पता चलता है कि यह किस वस्तु का जिक्र कर रहा है?
- 19. एक दृश्य कैसे पता चलता है कि किस लेआउट का उपयोग करना है? डिफ़ॉल्ट कहां है?
- 20. पता कैसे लगाया जाए कि स्मृति ढेर से है या नहीं? (ढेर या स्थिर चर नहीं)
- 21. निर्धारित करें कि स्ट्रिंग अक्षर से शुरू होता है I
- 22. मेमोरी पता 0x के साथ क्यों शुरू होता है?
- 23. कैसे boost.asio पता चलता है कि कौन सा पोर्ट मेरा सर्वर ऐप सुन रहा है?
- 24. क्या होता है जब ढेर और ढेर कोलाइड
- 25. लिनक्स कर्नेल कैसे पता चलता है कि ड्राइवर फर्मवेयर कहां देखना है?
- 26. क्या होता है जब एक .NET अनुप्रयोग शुरू होता है?
- 27. शेबांग "#!" शुरू होता है और "! #" समाप्त होता है?
- 28. जब जावा प्रोग्राम शुरू होता है तो क्या होता है?
- 29. पर्ल प्रोग्राम कैसे पता चलता है कि फ़ाइल को पर्ल मॉड्यूल युक्त फ़ाइल कहां मिलती है?
- 30. पायथन कैसे पता चलता है कि कोई रिकॉर्ड सफलतापूर्वक डाला गया है या नहीं
इसे हार्ड-कोड किया जा सकता है। –
मुझे लगता है कि मंच विशिष्ट होगा।क्या आप एक विशिष्ट मंच के लिए उत्तर पाने में रुचि रखते हैं? –
संभावित डुप्लिकेट [मालोक() और फ्री() कैसे काम करते हैं?] (Http://stackoverflow.com/questions/1119134/how-do-malloc-and-free-work) – ControlAltDel