मेमोरी एलोकेटर


11

आप एक नई गूढ़ प्रोग्रामिंग भाषा डिजाइन कर रहे हैं और एक सुविधा जिसे आपने जोड़ने का फैसला किया है वह एक डायनामिक मेमोरी एलोकेटर है। आपकी भाषा उपयोगकर्ता के प्रोग्राम स्पेस के लिए एक विशेष समर्पित वर्चुअल एड्रेस स्पेस निर्दिष्ट करती है। यह किसी आंतरिक स्थिति के लिए मेमोरी एलोकेटर द्वारा उपयोग किए जाने वाले एड्रेस स्पेस से अलग है।

अपने कार्यान्वयन को वितरित करने की लागत को कम करने में मदद करने के लिए कोड का आकार यथासंभव छोटा होना चाहिए।

इंटरफेस

आपको तीन कार्य प्रदान करने होंगे: आरंभीकरण, आवंटन, और निपटना।

प्रारंभ

यह फ़ंक्शन एकल धनात्मक पूर्णांक पैरामीटर लेता है N। इसका मतलब है कि उपयोगकर्ता के कार्यक्रम Nमें उसके पते की जगह में N-1बाइट्स हैं, जिसमें से मेमोरी आवंटित करने के लिए बाइट्स हैं । पता 0"null" के लिए आरक्षित है।

यह गारंटी दी जाती है कि यह फ़ंक्शन किसी भी आवंटित / डीलॉलेट कॉल से ठीक पहले एक बार कहा जाएगा।

ध्यान दें कि इस फ़ंक्शन को उपयोगकर्ता प्रोग्राम के वर्चुअल एड्रेस स्पेस के लिए किसी भी भौतिक मेमोरी को आवंटित करने की आवश्यकता नहीं है; आप मूल रूप से एक खोखले मेमोरी एलोकेटर का "लुक एंड फील" बना रहे हैं।

का आवंटन

आवंटित फ़ंक्शन को आवंटित करने के लिए मेमोरी बाइट्स की संख्या का अनुरोध करना होगा। इनपुट सकारात्मक होने की गारंटी है।

आपके फ़ंक्शन को आवंटित ब्लॉक की शुरुआत में एक पूर्णांक पता लौटना चाहिए, या 0यह बताने के लिए कि अनुरोधित आकार उपलब्ध नहीं है। यदि उपलब्ध आकार का एक सन्निहित ब्लॉक आपको पता स्थान में कहीं भी उपलब्ध है, तो आपको आवंटित करना होगा!

आपको यह सुनिश्चित करना होगा कि कोई भी दो आवंटित ब्लॉक ओवरलैप न हों।

पुनःआवंटन

डीलक्लोकेट फ़ंक्शन को आवंटित ब्लॉक की शुरुआत का पता लेना चाहिए, और वैकल्पिक रूप से दिए गए ब्लॉक का आकार भी ले सकता है।

जिस मेमोरी को डीलिट किया गया है, वह आवंटन के लिए फिर से उपलब्ध है। यह माना जाता है कि इनपुट पता एक वैध पता है।

उदाहरण पायथन कार्यान्वयन

ध्यान दें कि आप आंतरिक स्थिति का ट्रैक रखने के लिए कोई भी तरीका चुन सकते हैं; इस उदाहरण में वर्ग उदाहरण इसका ट्रैक रखता है।

class myallocator:
    def __init__(self, N):
        # address 0 is special, it's always reserved for null
        # address N is technically outside the address space, so use that as a
        # marker
        self.addrs = [0, N]
        self.sizes = [1, 0]

    def allocate(self, size):
        for i,a1,s1,a2 in zip(range(len(self.addrs)),
                                 self.addrs[:-1], self.sizes[:-1],
                                 self.addrs[1:]):
            if(a2 - (a1+s1) >= size):
                # enough available space, take it
                self.addrs.insert(i+1, a1+s1)
                self.sizes.insert(i+1, size)
                return a1+s1
        # no contiguous spaces large enough to take our block
        return 0

    def deallocate(self, addr, size=0):
        # your implementation has the option of taking in a size parameter
        # in this implementation it's not used
        i = self.addrs.index(addr)
        del self.addrs[i]
        del self.sizes[i]

स्कोरिंग

यह कोड गोल्फ है; बाइट्स में सबसे छोटा कोड जीतता है। आपको अपने आवंटनकर्ता द्वारा आवश्यक किसी भी आंतरिक स्थिति के लिए मेमोरी से बाहर चलने के बारे में चिंता करने की आवश्यकता नहीं है।

मानक पाश छेद लागू होते हैं।

लीडरबोर्ड


3
मुझे संदेह है कि पायथन सूची प्रति तत्व एक बाइट लेती है। क्या "आवंटित मेमोरी" को बाइट्स में होना चाहिए, या यह सिर्फ "आपकी भाषा की सामान्य सरणी / सूची प्रकार" हो सकता है?
दरवाज़े

4
किसी भी वास्तविक आवंटन की आवश्यकता नहीं है (आंतरिक स्थिति पर नज़र रखने के लिए जो भी आप चाहते हैं, जो अपने स्वयं के वर्चुअल एड्रेस स्पेस पर है) को छोड़कर; आप केवल कुछ अमूर्त परिमित आभासी पता स्थान पर पूर्णांक लौटा रहे हैं।
helloworld922

To help reduce the cost of distributing your implementation the size of the code must be as small as possibleया यह कुशल हो सकता है (छोटे और कुशल समान नहीं हैं) संभव है? : डी
द कोडर


हालांकि यह चुनौती एक भाषा डिज़ाइन पृष्ठभूमि के साथ प्रेरित है, एक भाषा डिज़ाइन करना वास्तव में कार्य का हिस्सा नहीं है (बल्कि एक के कुछ हिस्सों को लागू करना), इसलिए मैंने टैग हटा दिया है।
मार्टिन एंडर

जवाबों:


4

रूबी, ,०

i,a,d=->n{$m=?o*n},->n{$m.sub!(/\B#{?o*n}/,?f*n);"#$`".size},->n,s{$m[n,s]=?o*s}

मेगाटॉम के उत्तर की तरह, लेकिन राज्य को संग्रहीत करने के लिए एक सरणी के बजाय एक स्ट्रिंग का उपयोग करता है । "ओ" वर्ण एक खुली कोशिका को दर्शाता है, जबकि एक "एफ" एक भरे हुए को दर्शाता है। इससे हम रूबी के अपेक्षाकृत कठिन स्ट्रिंग हेरफेर कार्यों का उपयोग कर सकते हैं:

?o*n n "o" s के स्ट्रिंग को प्रारंभ करता है।

/\B#{?o*n}/एक नियमित अभिव्यक्ति है जो लगातार n "ओ" से मेल खाती है जिसमें पहला वर्ण शामिल नहीं है। sub!पहले मैच को n "f" s से बदल देता है।

"#$`" मैच के बाईं ओर स्ट्रिंग देता है, या कोई मैच नहीं होने पर एक खाली स्ट्रिंग, इसलिए आकार या तो आवंटित सूचकांक या 0 है।

डीललोकेट केवल स्ट्रिंग के निर्दिष्ट भाग को "o" s पर सेट करता है।


4

जावास्क्रिप्ट (ईएस 6), 88

ट्रैक रखने के लिए एक वैश्विक चर _(एक बहुत विरल सरणी) का उपयोग करना ।

अब मैं इसे कैसे परख सकता था?

I=n=>(_=[1],_[n]=0)
A=n=>_.some((x,i)=>i-p<n?(p=i+x,0):_[p]=n,p=1)?p:0
D=p=>delete _[p]

3

रूबी, 135

एक वैश्विक सरणी का ट्रैक रखें कि क्या प्रत्येक सेल को आवंटित किया गया है या नहीं।

i=->n{$a=[!0]*n;$a[0]=0}
a=->n{s=$a.each_cons(n).to_a.index{|a|a.none?};n.times{|i|$a[s+i]=0}if s;s||0}
d=->s,n{n.times{|i|$a[s+i]=!0}}

1

गणितज्ञ, १५२

i=(n=#;l={{0,1},{#,#}};)&
a=If[#=={},0,l=l~Join~#;#[[1,1]]]&@Cases[l,{Except@n,e_}:>{e,e+#}/;Count[l,{a_,_}/;e<=a<e+#]<1,1,1]&
d=(l=l~DeleteCases~{#,_};)&

nकुल आकार को lसंग्रहीत करें, आंतरिक स्थिति को संग्रहीत करता है। आवंटनकर्ता आवंटित मेमोरी के दूसरे खंड के ठीक पीछे आवंटित करने का प्रयास करेगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.