2012-09-13 8 views
19

मेरे दूसरे प्रश्न Haskell collections with guaranteed worst-case bounds for every single operation? से संबंधित, मैं उत्सुक हूँ: कब तक रुक जाता है कचरा संग्रहण की वजह से हो सकता है?कचरा संग्रहण के कारण हास्केल कार्यक्रम में कितने समय के विराम हो सकते हैं?

क्या हास्केल किसी प्रकार के वृद्धिशील कचरा संग्रह का उपयोग करता है ताकि एक कार्यक्रम केवल एक ही समय में छोटी अवधि के लिए रुक गया हो, या यह चरम मामले में कई सेकंड तक रुक सकता है?

मुझे इस विषय पर दो एसपीजे के कागजात मिले: https://research.microsoft.com/en-us/um/people/simonpj/papers/non-stop/index.htm। लेकिन मुझे इन संदर्भों को वास्तव में जीएचसी (या अन्य हास्केल कार्यान्वयन) द्वारा अपनाया गया था, लेकिन मुझे कोई संदर्भ नहीं मिला।

+4

ध्यान दें कि सिद्धांत में कार्यक्रम के संचालन में अप्रत्याशित असंबद्ध देरी के कई कारण हैं। इनमें वर्चुअल मेमोरी पेजिंग जैसी चीजें शामिल हैं, और ओएस द्वारा किए गए संदर्भ स्विच शामिल हैं। ये सभी भाषाओं पर लागू होते हैं, यहां तक ​​कि वे स्वचालित कचरा संग्रह का उपयोग नहीं करते हैं। सिद्धांत रूप में ये किसी भी कार्यक्रम के किसी भी दो संचालन के बीच देरी सम्मिलित कर सकते हैं, अधिकतम देरी की लंबाई की * गारंटी नहीं *। व्यावहारिक रूप से, वे शायद ही कभी एक समस्या है जिसे आपको "सामान्य" प्रोग्रामिंग में सौदा करना है। जीसी देरी एक ही हैं। – Ben

उत्तर

24

GHC कम्प्यूटेशनल प्रवाह क्षमता, नहीं विलंबता के लिए बनाया गया है। नतीजतन, जीएचसी generational, multi-threaded कचरा कलेक्टर with thread-local heaps का उपयोग करता है। धागे-स्थानीय वस्तुओं का कचरा संग्रह अन्य धागे को रोकता नहीं है। वैश्विक ढेर का कभी-कभी प्रमुख जीसी सभी धागे को रोक देगा।

आमतौर पर रुक जाता है मिलीसेकेंड की छोटी संख्या में हैं, hwoever विलंबता की कोई गारंटी नहीं है।

आप several runtime flags (उदा। जीसी -I अंतराल) के माध्यम से जीसी की आवृत्ति को नियंत्रित कर सकते हैं।

+3

मुझे पूरा यकीन है कि थ्रेड-स्थानीय ढेर सामान वास्तव में मुख्य रेखा में नहीं है। साइमन मार्लो ने कहा कि जीसी प्रदर्शन में सुधार नहीं करते हुए जीसी ने और अधिक जटिल बना दिया है। इसलिए, संशोधित उत्तर यह है: सभी जीसी कारणों (आमतौर पर बहुत कम) का कारण बनते हैं और प्रमुख जीसी समानांतर में किए जाते हैं। वास्तविक विराम समय ढेर आकार पर बहुत अधिक निर्भर करता है। '+ RTS -s' वास्तव में विराम के समय प्रिंट करता है, इसलिए यह पता लगाना आसान है। – nominolo

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