निरंतर समय संचालन के साथ चतुर स्मृति प्रबंधन?


18

आइए एक मेमोरी सेगमेंट पर विचार करें (जिसका आकार बढ़ सकता है या फाइल की तरह सिकुड़ सकता है, जब जरूरत हो) जिस पर आप दो बुनियादी मेमोरी आवंटन ऑपरेशन कर सकते हैं जिसमें निश्चित आकार के ब्लॉक शामिल हैं:

  • एक ब्लॉक का आवंटन
  • पहले से आवंटित ब्लॉक को मुक्त करना जो अब उपयोग नहीं किया जाता है।

इसके अलावा, आवश्यकता के रूप में, स्मृति प्रबंधन प्रणाली को वर्तमान में आवंटित ब्लॉकों के आसपास स्थानांतरित करने की अनुमति नहीं है: उनके सूचकांक / पते को अपरिवर्तित रहना चाहिए।

सबसे भोली स्मृति प्रबंधन एल्गोरिथ्म एक वैश्विक काउंटर (प्रारंभिक मान 0 के साथ) में वृद्धि करेगा और अगले आवंटन के लिए एक पते के रूप में अपने नए मूल्य का उपयोग करेगा। हालाँकि, यह तब खंड को छोटा करने की अनुमति नहीं देगा जब केवल कुछ आवंटित ब्लॉक बने रहेंगे।

बेहतर दृष्टिकोण: काउंटर को बनाए रखें, लेकिन डीलक्लोकेट किए गए ब्लॉकों की सूची बनाए रखें (जो कि निरंतर समय में की जा सकती हैं) और इसे नए आवंटन के लिए स्रोत के रूप में उपयोग करें जब तक कि यह खाली न हो।

आगे क्या? क्या ऐसा कुछ चालाक है जो अभी भी निरंतर समय के आवंटन और निपटान की बाधाओं के साथ हो सकता है, जो मेमोरी सेगमेंट को यथासंभव कम रखेगा?

(एक लक्ष्य सबसे छोटे पते के साथ वर्तमान में गैर-आवंटित ब्लॉक को ट्रैक करने के लिए हो सकता है, लेकिन यह निरंतर समय में संभव नहीं लगता ...)


किसी सूची की जाँच अब निरंतर समय की नहीं होगी, क्योंकि सूची पहले से कुछ आवंटन / अव्यवस्थाओं के कारण बढ़ सकती है या सिकुड़ सकती है?
सिम

@ बताइए, मैं मान रहा था कि यह एक लिंक की गई सूची है और इसके साथ संचालन , क्योंकि आप हमेशा केवल सिर के साथ काम करते हैं। O(N)
22

मुझे लगता है कि आपका "बेहतर दृष्टिकोण" पहले से ही अधिकतम मात्रा में मेमोरी का उपयोग करेगा, अर्थात यह एक मुफ्त ब्लॉक होने पर अतिरिक्त मेमोरी को कभी भी आवंटित नहीं करेगा। आप "चतुर" दृष्टिकोण की कल्पना कैसे करेंगे? क्या आपका मतलब है कि इसे शुरुआत के करीब आवंटित करना चाहिए ताकि बेहतर मौका हो कि आप सौदे के बाद सेगमेंट को छोटा कर सकें?
svick

@Sim: क्षमा करें, शायद मुझे स्टैक शब्द का इस्तेमाल करना चाहिए था (लेकिन मुझे लगा कि यह भ्रामक हो सकता है), 'डीललॉकेट' पुश है और 'आवंटित' पॉप है, या मामले में यह विफल हो जाता है बस काउंटर इंक्रीप्शन पर वापस गिर जाता है। दोनों निरंतर समय हैं।
स्टेफेन जिमेनेज़

क्या आपके पास वास्तविक समय की कमी है, या आप लगातार समय के साथ ठीक हैं? जवाब बहुत अलग होने की संभावना है।
गिल्स एसओ- बुराई को रोकना '

जवाबों:


11

निश्चित आकार के ब्लॉक के साथ, आपने जो वर्णन किया है, वह एक निःशुल्क सूची है । यह एक बहुत ही सामान्य तकनीक है, जो निम्नलिखित मोड़ के साथ है: मुक्त ब्लॉकों की सूची स्वयं को मुक्त ब्लॉकों में संग्रहीत किया जाता है। सी कोड में, यह इस तरह दिखेगा:

static void *alloc_ptr = START_OF_BIG_SEGMENT;
static void *free_list_head = NULL;

static void *
allocate(void)
{
    void *x;

    if (free_list_head == NULL) {
        x = alloc_ptr;
        alloc_ptr = (char *)alloc_ptr + SIZE_OF_BLOCK;
    } else {
        x = free_list_head;
        free_list_head = *(void **)free_list_head;
    }
    return x;
}

static void
release(void *x)
{
    *(void **)x = free_list_head;
    free_list_head = x;
}

यह तब तक अच्छी तरह से काम करता है जब तक सभी आबंटित ब्लॉकों का आकार समान होता है, और यह आकार एक सूचक के आकार का एक गुणक होता है, ताकि संरेखण संरक्षित रहे। आवंटन और डील्लोकेशन निरंतर-समय है (अर्थात, मेमोरी-एक्सेस और प्राथमिक परिवर्धन के रूप में निरंतर-समय के रूप में - एक आधुनिक कंप्यूटर में, एक मेमोरी एक्सेस में कैश मिस और यहां तक ​​कि वर्चुअल मेमोरी शामिल हो सकती है, इसलिए डिस्क एक्सेस होती है, इसलिए "निरंतर समय" काफी बड़ा हो सकता है)। कोई मेमोरी ओवरहेड नहीं है (कोई अतिरिक्त प्रति-ब्लॉक पॉइंटर्स या उस तरह की चीजें नहीं; आवंटित ब्लॉक सन्निहित हैं)। इसके अलावा, आवंटन सूचक किसी दिए गए बिंदु पर तभी पहुंचता है, जब एक समय में, कई ब्लॉकों को आवंटित किया जाना था: चूंकि आवंटन मुक्त सूची का उपयोग करना पसंद करते हैं, आवंटन सूचक केवल तभी बढ़ा है जब वर्तमान सूचक के नीचे की जगह घड़ी भर गई हो। उस अर्थ में, तकनीक।

घटानाएक रिलीज के बाद आवंटन सूचक अधिक जटिल हो सकता है, क्योंकि नि: शुल्क सूची का पालन करके मुक्त ब्लॉकों को विश्वसनीय रूप से पहचाना जा सकता है, जो अप्रत्याशित क्रम में उनके माध्यम से जाता है। यदि संभव हो तो बड़े खंड के आकार को कम करना आपके लिए महत्वपूर्ण है, तो आप अधिक ओवरहेड के साथ एक वैकल्पिक तकनीक का उपयोग करना चाहते हैं: किसी भी दो आवंटित ब्लॉकों के बीच, आप "छेद" डाल सकते हैं। छेद एक डबल-लिंक्ड सूची के साथ मेमोरी क्रम में एक साथ जुड़े हुए हैं। आपको एक छेद के लिए एक डेटा प्रारूप की आवश्यकता होती है, ताकि आप यह जानकर कि यह कहाँ समाप्त होता है, और यह भी पता कर सकें कि छेद का आकार क्या है, यदि आपको पता है कि छेद कहाँ से शुरू होता है। फिर, जब आप एक ब्लॉक जारी करते हैं, तो आप एक छेद बनाते हैं जिसे आप अगले और पिछले छेदों के साथ विलय करते हैं, सभी छेदों की क्रमबद्ध सूची का पुनर्निर्माण (अभी भी निरंतर समय में) करते हैं। ओवरहेड तब आवंटित ब्लॉक के प्रति दो सूचक-आकार के शब्दों के बारे में है; लेकिन, उस कीमत पर, आप मज़बूती से "अंतिम छेद" की घटना का पता लगा सकते हैं, यानी बड़े खंड के आकार को कम करने का अवसर।

कई संभावित बदलाव हैं। एक अच्छा परिचयात्मक पेपर डायनेमिक स्टोरेज आवंटन है: विल्सन एट अल द्वारा एक सर्वेक्षण और महत्वपूर्ण समीक्षा


4
आप स्थिरांक स्थल के नज़दीकी छिद्रों को निरंतर समय में कैसे खोज सकते हैं?
राफेल

1
दूसरी विधि में मैं वर्णन करता हूं, एक शून्य, एक या अधिक डेटा ब्लॉक के लिए जगह के साथ-साथ एक हेडर एक हेडर (बिंदुओं की एक जोड़ी है)। किसी भी दो आवंटित ब्लॉकों के बीच, हमेशा एक छेद होता है, भले ही यह एक सूक्ष्म छेद हो जिसमें केवल एक छेद हेडर होता है। इसलिए निकटतम छिद्रों का पता लगाना आसान है: वे स्लॉट के ठीक पहले और ठीक बाद में हैं। बेशक, माइक्रो-होल को नि: शुल्क सूची (आवंटन के लिए योग्य छेद की सूची) का हिस्सा नहीं बनाया गया है। इसे देखने का एक और तरीका यह है कि आप प्रत्येक ब्लॉक और हर (नॉन-माइक्रो) छेद (16-बिट Ms-Dos के तहत आवंटन जैसा काम करता है) में एक हेडर जोड़ते हैं।
थॉमस पोर्निन

4

यह उत्तर जेनेरिक मेमोरी प्रबंधन तकनीकों के बारे में है। मैंने याद किया कि प्रश्न उस मामले के बारे में पूछता है जहां सभी ब्लॉकों का आकार समान है (और संरेखित हैं)।


आपको जो मूल रणनीतियाँ पता होनी चाहिए, वे पहले-फिट, अगली-फिट, सर्वश्रेष्ठ-फिट और मित्र प्रणाली हैं । मैंने पढ़ाया गया एक कोर्स के लिए एक बार एक संक्षिप्त सारांश लिखा था , मुझे आशा है कि यह पठनीय है। मैं काफी हद तक विस्तृत सर्वेक्षण की ओर इशारा करता हूं ।

व्यवहार में आप इन बुनियादी रणनीतियों के विभिन्न संशोधनों को देखेंगे। लेकिन इनमें से कोई भी वास्तव में निरंतर समय नहीं है! मुझे नहीं लगता कि स्मृति की एक सीमित मात्रा का उपयोग करते हुए, यह सबसे खराब स्थिति में संभव है।


दिलचस्प है, मुझे इसे विवरण में पढ़ना होगा। हालांकि, ऐसा लगता है कि ये सिस्टम विशेष रूप से गैर-स्थिर आकार के आवंटन के साथ सौदा करते हैं, जो कि एक ऐसा मुद्दा नहीं है जिससे मैं सामना कर रहा हूं।
स्टीफन जिमेनेज़

सही। क्षमा करें, मैंने आपके प्रश्न को बहुत तेज़ी से पढ़ा है।
rgrig

हे(एलजीn)

s / smallest free block / मुक्त ब्लॉक पर सबसे छोटा पता /
rgrig

2

आप परिशोधित विश्लेषण और विशेष रूप से गतिशील सरणियों पर एक नज़र रखना चाह सकते हैं । यहां तक ​​कि अगर ऑपरेशन वास्तव में हर कदम पर निरंतर समय में नहीं किया जाता है, तो लंबे समय में ऐसा लगता है कि यह मामला है।


2
और डायनामिक एरेज़ मेमोरी को आवंटित करने में कैसे मदद करेगा?
svick

आप (डी) एक ही तरह के एल्गोरिथ्म का उपयोग करके सन्निहित कोशिकाओं का हिस्सा आवंटित करेंगे? आपकी पूरी फ़ाइल बड़ी और बड़ी चंक्स की लिंक की गई सूची होगी।
गैलिस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.