2011-06-22 14 views
6

यह मेरी समझ है कि जीएचसी प्रत्येक थ्रेड को एक ढेर देता है। यह जरूरी क्यों है? जीएचसी सीपीएस को संकलित नहीं करता है? क्या एक धागा संक्षेप में बंद होने के रूप में व्यक्त नहीं किया गया है?जीएचसी के प्रत्येक धागे के लिए एक ढेर क्यों है?

उत्तर

5

आपके प्रश्न के कई पहलू हैं।

जीएचसी रनटाइम में डिजाइन निर्णयों का मुख्य संदर्भ पेपर ''Runtime Support for Multicore Haskell'' है।

याद रखें कि

GHC क्रम प्रणाली ऑपरेटिंग सिस्टम धागे के एक मुट्ठी भर, मोटे तौर पर प्रत्येक भौतिक सीपीयू के लिए एक पर बहुसंकेतन द्वारा उन्हें हल्के धागे के लाखों लोगों का समर्थन करता है।

और:

प्रत्येक हास्केल धागा एक फाई nite आकार ढेर है, जो ढेर में आवंटित किया जाता है पर चलता है। एक थ्रेड की स्थिति, इसके ढेर के साथ, ढेर-आवंटित थ्रेड स्टेट ऑब्जेक्ट (टीएसओ) में रखा जाता है। टीएसओ का आकार लगभग 15 शब्द प्लस स्टैक है, और हास्केल थ्रेड की पूरी स्थिति का गठन करता है। एक ढेर एक बड़े क्षेत्र में त्सो को कॉपी करके बढ़ सकती है, और बाद में फिर से

GHC सीपीएस के माध्यम से संकलित नहीं है हटना सकता है। प्रत्येक थ्रेड रिकर्सिव कॉल करता है, और उन्हें स्टैक को आवंटित करना होगा। एक ढेर-आवंटित वस्तु के रूप में ढेर का प्रतिनिधित्व करके, चीजों को सरल बना दिया जाता है।

एक धागा बंद होने से अधिक है।

धागे निष्पादित होने के रूप में, यह ढेर और ढेर को आवंटित करना शुरू कर देता है। इस प्रकार:

धागे का ढेर, और इसलिए इसका टीएसओ, परिवर्तनीय है। जब थ्रेड निष्पादित होता है, तो स्टैक पॉइंटर्स को नई ऑब्जेक्ट्स, पर जमा करेगा और इसलिए यदि टीएसओ पुरानी पीढ़ी में रहता है तो उसे को याद किया गया सेट [जीसी] के याद किए गए सेट में जोड़ा जाना चाहिए।

स्टैक्स द्वारा इंगित वस्तुओं को कचरा इकट्ठा करने के लिए अनुकूलित किया जा सकता है यह सुनिश्चित करने के लिए जीसी थ्रेड के समान भौतिक धागे पर होता है।

इसके अलावा, जब कचरा कलेक्टर चलाता है, यह अति आवश्यक है कि TSOs कि एक दिया CPU पर बाद मार दिया ही CPU पर कचरा कलेक्टर द्वारा पार कर रहे हैं, क्योंकि त्सो और डेटा यह दर्शाता है उस CPU के स्थानीय कैश में होने की संभावना है।

तो, जीएचसी के प्रत्येक थ्रेड के लिए एक ढेर है क्योंकि संकलन के लिए जरूरी है कि धागे के ढेर और ढेर तक पहुंच हो। प्रत्येक थ्रेड को अपना खुद का ढेर देकर, धागे समानांतर रूप से समानांतर में निष्पादित कर सकते हैं। धागे "बस एक बंद" से अधिक हैं, क्योंकि उनके पास एक परिवर्तनीय ढेर है।

+0

आपने जवाब देने का एक अच्छा काम किया है "ghc कैसे थ्रेड प्रबंधित करता है?", लेकिन सवाल विशेष रूप से पूछता है "क्यों?"। मुझे लगता है कि यह प्रदर्शन के साथ करना है, लेकिन आप विस्तार करने की देखभाल करेंगे। –

+0

यह हमेशा प्रदर्शन होता है - जीएचसी का निष्पादन मॉडल साझा वस्तुओं (शुद्धता का लाभ उठाने के लिए) के धागे द्वारा विवाद को कम करने की कोशिश करता है। चूंकि रनटाइम द्वारा एक स्टैक की आवश्यकता होती है, प्रति थ्रेड स्टैक एक स्पष्ट कदम है। –

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