2012-03-27 11 views
12

में मेमोरी प्रबंधन इसलिए मैं सिर्फ फर्थ सीख रहा हूं और अगर कोई मुझे यह समझने में मदद कर सकता है कि स्मृति प्रबंधन आम तौर पर कैसे काम करता है। फिलहाल मेरे पास सी स्टैक-बनाम-ढेर प्रतिमान के साथ केवल कुछ (अनुभव) अनुभव है।फर्थ

जो मैं समझता हूं, उससे कोई भी शब्दकोश में या ढेर पर आवंटित कर सकता है। क्या शब्दकोश सी में स्टैक की तरह तेज़/पसंदीदा है? लेकिन सी के विपरीत, स्कॉप्स और स्वचालित स्टैक रिकक्लेमेशन नहीं हैं, इसलिए मुझे आश्चर्य है कि क्या कोई वैश्विक डेटा संरचनाओं (यदि बिल्कुल भी) के लिए शब्दकोश का उपयोग करता है।

जहां तक ​​ढेर जाता है, क्या यह सी की तरह काफी है? ढेर प्रबंधन एक मानक (ANS) अवधारणा है, या यह कार्यान्वयन परिभाषित है?

उत्तर

13

यह शब्दकोश नहीं है, या ढेर पर - ढेर के बराबर शब्दकोश है। हालांकि, गंभीर सीमा के साथ यह एक ढेर की तुलना में ढेर की तरह काम करता है - शब्दकोश के अंत में नए शब्द जोड़े जाते हैं (ALLOT द्वारा आवंटन और फोर्जेट या मुफ़्त द्वारा मुक्त (लेकिन सभी नए शब्दों को मुक्त करना - एकाधिक की तरह अभिनय करना पीओपी))।

एक कार्यान्वयन मेमोरी लेआउट को नियंत्रित कर सकता है और इस प्रकार पारंपरिक ढेर (या कचरा संग्रह) को कार्यान्वित कर सकता है। एक उदाहरण A FORTH implementation of the Heap Data Structure for Memory Mangement (1 9 84) है। एक और कार्यान्वयन Dynamic Memory Heaps for Quartus Forth (2000) है।

बहुत अधिक कार्यान्वयन निर्भर या एक्सटेंशन है। उदाहरण के लिए, मेमोरी लेआउट अक्सर दो ब्लॉक बफर (BLOCK और TIB द्वारा स्थान), पाठ इनपुट बफर और मूल्यों और भाषा के निम्न-स्तर/आदिम कार्यों के बीच होता है, सबसे निचले भाग में, बीच में शब्दकोश (ऊपर की ओर बढ़ रहा है)) और शीर्ष पर रिटर्न स्टैक और पैरामीटर स्टैक।

शब्दकोश के ऊपर पहले उपलब्ध बाइट का पता HERE द्वारा बदला गया है (यह शब्दकोश विस्तार के रूप में बदलता है)।

अस्थायी रूप से डेटा संग्रहीत करने के लिए शब्दकोश के ऊपर एक स्क्रैचपैड क्षेत्र (पीएडी द्वारा लौटाया गया पता) भी है। स्क्रैचपैड क्षेत्र को मुफ्त मेमोरी के रूप में माना जा सकता है।

ऑपरेशन का पसंदीदा तरीका स्थानीय चर या एक ढेर के बजाय जितना संभव हो सके स्टैक का उपयोग करना है।

पी। अध्याय "फॉरथ मेमोरी, डिक्शनरी, और वोकबुलरीज़" में 286 (फर्थ, एमएमएसएफटीएचटी के एक विशेष संस्करण के बारे में), फर्थ: एक टेक्स्ट और एक संदर्भ। महलॉन जी केली और निकोलस जासूस। आईएसबीएन 0-13-326349-5/0-13-326331-2 (पीबीके।)। 1 9 86 प्रेंटिस-हॉल द्वारा।

2

कुछ फर्थ कार्यान्वयन रिटर्न स्टैक फ्रेम पर स्थानीय चर का समर्थन करते हैं और मेमोरी ब्लॉक आवंटित करते हैं। SP-Forth में उदाहरण के लिए:

lib/ext/locals.f 
lib/ext/uppercase.f 

100 CONSTANT /buf 

: test (c-addr u --) { \ len [ /buf 1 CHARS + ] buf } 
    buf SWAP /buf UMIN DUP TO len CMOVE 
    buf len UPPERCASE 
    0 buf len + C! \ just for illustration 
    buf len TYPE 
; 

S" abc" test \ --> "ABC" 
3

पीटर मोर्टेनसेन यह बहुत अच्छी तरह से बाहर रखी। मैं कुछ नोट्स जोड़ूंगा जो कुछ प्रोग्रामर की मदद कर सकते हैं।

ढेर सी शब्द "ऑटो" चर के निकटतम है, और आमतौर पर स्थानीय चर कहा जाता है। आप कुछ हिस्सों में अपने स्टैक मूल्यों के नाम दे सकते हैं, लेकिन अधिकांश प्रोग्रामर अपना कोड लिखने का प्रयास करते हैं ताकि मूल्यों का नामकरण अनावश्यक हो।

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

ढेर आवंटन कई आधुनिक फर्थों में उपलब्ध है, और मानक सीएल में मॉलोक(), फ्री(), और रीयलोक() जैसे काम करता है जो आवंटित करता है। वे जो स्मृति वापस लौटते हैं वह ओएस सिस्टम से होती है ढेर, और आम तौर पर पते को एक चर या किसी अन्य स्थायी ढांचे में स्टोर को स्टोर करने के लिए एक अच्छा विचार है ताकि आप अनजाने में पॉइंटर को मुक्त कर सकें। एक साइड नोट के रूप में, ये शब्द (फ़ाइल I/O शब्दों के साथ) स्टैक पर एक स्थिति लौटाते हैं जो त्रुटि होने पर शून्य नहीं है। यह सम्मेलन अपवाद संचालन तंत्र के साथ अच्छी तरह से फिट बैठता है, और आप की तरह कोड लिखने की अनुमति देता है:

variable PTR 
1024 allocate throw PTR ! 
\ do some stuff with PTR 
PTR @ free throw 
0 PTR ! 

या आवंटन के एक अधिक जटिल है, तो कुछ हद तक कृत्रिम उदाहरण/मुक्त करने के लिए:

\ A simple 2-cell linked list implementation using allocate and free 
: >link (a -- a) ; 
: >data (a -- a) cell + ; 
: newcons (a -- a) \ make a cons cell that links to the input 
    2 cells allocate throw tuck >link ! ; 
: linkcons (a -- a) \ make a cons cell that gets linked by the input 
    0 newcons dup rot >link ! ; 
: makelist (n -- a) \ returns the head of a list of the numbers from 0..n 
    0 newcons dup >r 
    over 0 ?do 
    i over >data ! linkcons (a -- a) 
    loop >data ! r> ; 
: walklist (a --) 
    begin dup >data ? >link @   dup 0= until drop ; 
: freelist (a --) 
    begin dup >link @ swap free throw dup 0= until drop ; 
: unittest 10 makelist dup walklist freelist ; 
+0

यह बहुत देर हो सकता है ... क्या आप '> लिंक' शब्द के उद्देश्य को समझाते हैं? –

+0

क्षमा करें -> लिंक एक एक्सेसर है जो पॉइंटर से "विपक्ष सेल" (एलआईएसपी से एक शब्द उधार लेने के लिए) "अगली" पॉइंटर के पते पर जाता है। इसे नो-ओपी के रूप में कार्यान्वित किया गया है क्योंकि इस कार्यान्वयन में, "अगला" पॉइंटर कंस सेल में संग्रहीत पहली चीज़ है। –

9

बुनियादी सवाल हो सकता है इस तरह से उत्तर नहीं दिया गया है कि एक नए फर्थ उपयोगकर्ता की आवश्यकता होगी ताकि मैं इसमें भाग ले सकूं।

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

शब्दकोश आमतौर पर स्मृति के नीचे शुरू होता है और फर्थ सिस्टम द्वारा ऊपर आवंटित किया जाता है। एक साधारण प्रणाली में दो ढेर उच्च स्मृति में मौजूद होंगे और आम तौर पर उनके पास दो सीपीयू रजिस्ट्रार होते हैं। (बहुत सिस्टम निर्भर)

सबसे मौलिक स्तर पर, स्मृति पॉइंटर चर के मूल्य को बदलकर स्मृति आवंटित की जाती है। (कभी-कभी डीपी कहा जाता है)

प्रोग्रामर आमतौर पर इस चर को सीधे एक्सेस नहीं करता है बल्कि इसे नियंत्रित करने के लिए कुछ उच्च स्तरीय शब्दों का उपयोग करता है।

जैसा कि उल्लेख किया गया है कि फर्थ शब्द 'यहां' शब्दकोष में अगला उपलब्ध पता देता है। इसका उल्लेख नहीं किया गया था कि वेरिएबल डीपी के मूल्य को लाकर यहां परिभाषित किया गया है। (सिस्टम यहाँ वर्णन के लिए dependancy लेकिन उपयोगी)

आगे में 'यहाँ' इस प्रकार दिखाई देंगे:

: यहां (- addr) डीपी @;

यही है।

कुछ स्मृति आवंटित करने के लिए हमें ऊपर की ओर बढ़ने की जरूरत है और हम इसे 'ऑलॉट' शब्द के साथ करते हैं।

'ऑलॉट' के लिए फर्थ परिभाषा बस पैरामीटर स्टैक से एक संख्या लेती है और इसे डीपी में मान में जोड़ती है। तो यह

: ऑलॉट (एन -) डीपी + से अधिक कुछ भी नहीं है! ; \ '+!' सामग्री वैरिएबल डीपी

ऑलोट का उपयोग फोर्थ सिस्टम द्वारा किया जाता है जब हम एक नई परिभाषा बनाते हैं ताकि हमने जो कुछ बनाया है वह सुरक्षित रूप से 'आवंटित' स्मृति के अंदर है।

कुछ ऐसा जो तुरंत स्पष्ट नहीं है वह है कि ऑलोट नकारात्मक संख्या ले सकता है, इसलिए शब्दकोश सूचक को ऊपर या नीचे ले जाना संभव है। तो अगर आप कुछ स्मृति को आबंटित और इसे इस तरह वापसी कर सकते हैं:

हेक्स 100 आवंटित

और मुक्त इसे इस तरह:

हेक्स -100 आवंटित

यह सब कहना है कि यह है एक फर्थ सिस्टम में स्मृति प्रबंधन का सबसे सरल रूप। इसका उपयोग कैसे किया जाता है इसका एक उदाहरण 'बफर' शब्द की परिभाषा में देखा जा सकता है:

: बफर: (एन -) ऑलोट बनाएं;

'बफर:' शब्दकोष में नया नाम बनाता है (नाम से स्थान के लिए जगह बनाने के लिए आवंटित करता है) तो नाम के बाद मेमोरी के सभी बाइट्स और सभी संबंधित हाउसकीपिंग बाइट्स आपके फर्थ सिस्टम को बाइट कर सकता है

का उपयोग तो अब नामित स्मृति का एक ब्लॉक आवंटित करने के लिए हम सिर्फ टाइप करें:

मार्कर foo \ निशान जहां स्मृति अभी समाप्त होता है

हेक्स 2000 बफर: IN_BUFFER

अब हम एक 8K है बाइट बफर सी सहयोगी IN_BUFFER। यदि मानक फर्थ में उस जगह को पुनः प्राप्त करना चाहते हैं तो हम फूथ सिस्टम से खाद्य को हटा दिए जाने के बाद 'फूड' और शब्दकोश में आवंटित सब कुछ टाइप कर सकते हैं।

लेकिन यदि आप अस्थायी मेमोरी स्पेस चाहते हैं, तो यहां 'सब कुछ' का उपयोग करने के लिए स्वतंत्र है!

तो आप बस एक पते को इंगित और इसका इस्तेमाल करते हैं अगर आप इस तरह करना चाहते हैं कर सकते हैं

: MyMemory यहां 200 +; \ यहाँ ऊपर अन-आबंटित स्मृति को MyMemory अंक

     \ MYMEMORY moves with HERE. be aware. 

MyMemory हेक्स 1000 मिटा \ शून्य

आगे की 2K बाइट्स के साथ इसे भरने आम तौर पर उच्च प्रदर्शन एम्बेडेड अनुप्रयोगों के लिए इस्तेमाल किया गया है जहां गतिशील स्मृति आवंटन संयुक्त राष्ट्र पैदा कर सकता है -एलएलईएल कोड इतना ऑलॉट का उपयोग कर स्थिर आवंटन को प्राथमिकता दी गई थी। हालांकि बड़ा प्रणाली एक ढेर है और आवंटित, मुफ्त का उपयोग आकार बदलने के बहुत पसंद उपयोग हम malloc आदि सी

में

बीएफ

+0

मैं जोड़ता हूं कि अन्य उद्देश्यों के लिए ऑलॉट का उपयोग करके नए शब्दों और चर के लिए टुकड़े टुकड़े आवंटन, यूनिसों में पुरानी शैली वाली ब्रेक तंत्र के समान है। –

1

आगे आप एक अलग दुनिया में प्रवेश के साथ।

लिनक्स (और 64 बिट्स को मानते हुए) पर सीफर्थ की तरह एक सामान्य फर्थ में आप अपने फर्थ को एक रैखिक मेमोरी स्पेस के रूप में कॉन्फ़िगर कर सकते हैं जो आपके स्वैप स्पेस (जैसे 128 गीबी) जितना बड़ा हो। यह आपके लिए सरणी, लिंक्ड सूचियों, चित्रों के साथ भरने के लिए है। कोई प्रतिबंध नहीं हैं। फर्थ केवल आपके द्वारा उपयोग की गई मेमोरी का ट्रैक रखने में मदद के लिए यहां एक संकेतक प्रदान करता है। यहां तक ​​कि आप अनदेखा कर सकते हैं, और 1 99 4 के मानक में भी एक शब्द है जो मुक्त मेमोरी (पीएडी) में तैरने वाली स्क्रैच स्पेस प्रदान करता है।

क्या malloc() free() की तरह कुछ है? जरूरी नहीं कि कुछ दर्जन किलोबाइट्स के छोटे कर्नेल में। लेकिन आप केवल एक आवंटन उपयोगिता के साथ एक फ़ाइल शामिल कर सकते हैं और गतिशील स्मृति के लिए उपयोग करने के लिए कुछ Gbyte को अलग कर सकते हैं।

उदाहरण के तौर पर मैं वर्तमान में टिफ फाइलों के साथ काम कर रहा हूं। एक सामान्य 140 एमबीटी तस्वीर यहां आगे बढ़ने वाले शब्दकोश से एक छोटा सा हिस्सा लेती है। पिक्सल की पंक्तियां बदल दी गई हैं, डिकंप्रेस्ड आदि। इसके लिए मैं गतिशील स्मृति का उपयोग करता हूं, इसलिए मैं पंक्ति के डिकंप्रेशन परिणाम के लिए स्थान आवंटित करता हूं। जब परिणाम किसी अन्य परिवर्तन के लिए उपयोग किए जाते हैं तो मुझे उन्हें मैन्युअल रूप से मुक्त करना होगा। यह सी से बिल्कुल अलग लगता है। अधिक नियंत्रण और अधिक खतरा है।

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

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