यह मेरी समझ है कि जीएचसी प्रत्येक थ्रेड को एक ढेर देता है। यह जरूरी क्यों है? जीएचसी सीपीएस को संकलित नहीं करता है? क्या एक धागा संक्षेप में बंद होने के रूप में व्यक्त नहीं किया गया है?जीएचसी के प्रत्येक धागे के लिए एक ढेर क्यों है?
उत्तर
आपके प्रश्न के कई पहलू हैं।
जीएचसी रनटाइम में डिजाइन निर्णयों का मुख्य संदर्भ पेपर ''Runtime Support for Multicore Haskell'' है।
याद रखें कि
GHC क्रम प्रणाली ऑपरेटिंग सिस्टम धागे के एक मुट्ठी भर, मोटे तौर पर प्रत्येक भौतिक सीपीयू के लिए एक पर बहुसंकेतन द्वारा उन्हें हल्के धागे के लाखों लोगों का समर्थन करता है।
और:
प्रत्येक हास्केल धागा एक फाई nite आकार ढेर है, जो ढेर में आवंटित किया जाता है पर चलता है। एक थ्रेड की स्थिति, इसके ढेर के साथ, ढेर-आवंटित थ्रेड स्टेट ऑब्जेक्ट (टीएसओ) में रखा जाता है। टीएसओ का आकार लगभग 15 शब्द प्लस स्टैक है, और हास्केल थ्रेड की पूरी स्थिति का गठन करता है। एक ढेर एक बड़े क्षेत्र में त्सो को कॉपी करके बढ़ सकती है, और बाद में फिर से
GHC सीपीएस के माध्यम से संकलित नहीं है हटना सकता है। प्रत्येक थ्रेड रिकर्सिव कॉल करता है, और उन्हें स्टैक को आवंटित करना होगा। एक ढेर-आवंटित वस्तु के रूप में ढेर का प्रतिनिधित्व करके, चीजों को सरल बना दिया जाता है।
एक धागा बंद होने से अधिक है।
धागे निष्पादित होने के रूप में, यह ढेर और ढेर को आवंटित करना शुरू कर देता है। इस प्रकार:
धागे का ढेर, और इसलिए इसका टीएसओ, परिवर्तनीय है। जब थ्रेड निष्पादित होता है, तो स्टैक पॉइंटर्स को नई ऑब्जेक्ट्स, पर जमा करेगा और इसलिए यदि टीएसओ पुरानी पीढ़ी में रहता है तो उसे को याद किया गया सेट [जीसी] के याद किए गए सेट में जोड़ा जाना चाहिए।
स्टैक्स द्वारा इंगित वस्तुओं को कचरा इकट्ठा करने के लिए अनुकूलित किया जा सकता है यह सुनिश्चित करने के लिए जीसी थ्रेड के समान भौतिक धागे पर होता है।
इसके अलावा, जब कचरा कलेक्टर चलाता है, यह अति आवश्यक है कि TSOs कि एक दिया CPU पर बाद मार दिया ही CPU पर कचरा कलेक्टर द्वारा पार कर रहे हैं, क्योंकि त्सो और डेटा यह दर्शाता है उस CPU के स्थानीय कैश में होने की संभावना है।
तो, जीएचसी के प्रत्येक थ्रेड के लिए एक ढेर है क्योंकि संकलन के लिए जरूरी है कि धागे के ढेर और ढेर तक पहुंच हो। प्रत्येक थ्रेड को अपना खुद का ढेर देकर, धागे समानांतर रूप से समानांतर में निष्पादित कर सकते हैं। धागे "बस एक बंद" से अधिक हैं, क्योंकि उनके पास एक परिवर्तनीय ढेर है।
- 1. समांतर क्यों नहीं है। प्रत्येक धागे को चलाने के लिए?
- 2. क्या धागे के पास एक अलग ढेर है?
- 3. एक ढेर और ढेर क्यों है?
- 4. धागे ढेर की जगह क्यों साझा करते हैं?
- 5. एक फाइबोनैकी ढेर क्यों एक फाइबोनैकी ढेर कहा जाता है?
- 6. क्यों एक काम है कि एक थ्रेड पूल के धागे
- 7. क्या जीएचसी के लिए एक distcc-like उपकरण है?
- 8. धागे शुरू करने के लिए हमें एक रननेबल क्यों चाहिए?
- 9. ओएस धागे महंगा क्यों माना जाता है?
- 10. जीएचसी इतना बड़ा/बड़ा क्यों है?
- 11. csvwriter.writerow() प्रत्येक चरित्र के बाद एक अल्पविराम क्यों डालता है?
- 12. बढ़ावा :: धागे उदाहरण और ढेर भ्रष्टाचार संदेश
- 13. यह प्रत्येक लूप के लिए क्यों नहीं है?
- 14. PHP बड़े पैमाने पर मेल भेज रहा है: प्रत्येक के लिए प्रत्येक के लिए एक?
- 15. ढेर वास्तव में एक ढेर है?
- 16. समानांतर करता है। प्रत्येक ब्लॉक के लिए?
- 17. कतार बनाने के लिए दो ढेर का उपयोग क्यों करें?
- 18. जीएचसी 7.4.1 के लिए बाधा प्रकार वाक्यविन्यास क्या है?
- 19. जीएचसी
- 20. जीएचसी
- 21. जीएचसी
- 22. अनन्य तत्वों के ढेर के लिए कंटेनर
- 23. ढेर ओवरफ्लो अपवाद- क्यों?
- 24. ढेर और कतार, क्यों?
- 25. जीएचसी
- 26. खड़ी barplot जहां प्रत्येक ढेर 100%
- 27. जीएचसी मोनॉयड के लिए उदाहरण क्यों नहीं प्राप्त कर सकता है?
- 28. रूट के बिना जीएचसी इंस्टॉल
- 29. एकाधिक धागे या धागे के साथ प्रक्रिया
- 30. जीएचसी
आपने जवाब देने का एक अच्छा काम किया है "ghc कैसे थ्रेड प्रबंधित करता है?", लेकिन सवाल विशेष रूप से पूछता है "क्यों?"। मुझे लगता है कि यह प्रदर्शन के साथ करना है, लेकिन आप विस्तार करने की देखभाल करेंगे। –
यह हमेशा प्रदर्शन होता है - जीएचसी का निष्पादन मॉडल साझा वस्तुओं (शुद्धता का लाभ उठाने के लिए) के धागे द्वारा विवाद को कम करने की कोशिश करता है। चूंकि रनटाइम द्वारा एक स्टैक की आवश्यकता होती है, प्रति थ्रेड स्टैक एक स्पष्ट कदम है। –