2010-06-04 15 views
8

मैं दूसरे दिन अपने दोस्त के साथ चर्चा कर रहा था। मैं कह रहा था कि कैसे, शुद्ध लुआ में, आप एक प्रीपेप्टिव मल्टीटास्किंग सिस्टम नहीं बना सकते थे। उनका दावा है कि आप निम्नलिखित कारणों से कर सकते हैं:लुआ में मल्टीथ्रेडिंग

सी और लुआ दोनों में कोई इनबिल्ट थ्रेडिंग लाइब्रेरी नहीं है [ओपी का नोट: ठीक है, लुआ तकनीकी रूप से करता है, लेकिन AFAIK यह हमारे उद्देश्यों के लिए उपयोगी नहीं है]। ज्यादातर सी (++) में लिखे गए विंडोज़ में पूर्व-खाली मल्टीटास्किंग है, जिसे उन्होंने स्क्रैच से बनाया है। इसलिए, आप लुआ में ऐसा करने में सक्षम होना चाहिए। बड़ी समस्या मैं उस के साथ देखते हैं कि मुख्य रास्ता पूर्वक्रमिक बहुविध (मेरी जानकारी के लिए) काम करता है कि यह नियमित रूप से बीच में आता है जो प्रबंधक नियंत्रण होता है और निर्धारित करने के लिए उपयोग करता है क्या कोड यह अगले पर काम किया जाना चाहिए उत्पन्न करता है। मुझे यह भी नहीं लगता कि लुआ की कोई सुविधा है जो ऐसा कर सकती है।

मेरा प्रश्न है: क्या शुद्ध-लुआ लाइब्रेरी लिखना संभव है जो लोगों को पूर्व-खाली मल्टीटास्किंग करने की अनुमति देता है?

+0

एफवाईआई यह आपके प्रश्न (मल्टीथ्रेडिंग के शुद्ध लुआ कार्यान्वयन) का उत्तर नहीं है, लेकिन किसी ऐसे व्यक्ति के लिए जो लू कोड एकाधिक ओएस थ्रेड चलाने के लिए चाहता है, और उन्हें पूर्ववत रूप से शेड्यूल करना चाहता है, तो कई विकल्प हैं: http: // kotisivu। dnainternet.net/askok/bin/lanes/comparison.html – pts

उत्तर

7

मैं यह नहीं देख सकता कि यह कैसे करना है, हालांकि लुआ के औपचारिक अर्थशास्त्र के बिना (उदाहरण के लिए yield के अर्थशास्त्र की तरह), लोहेक्लाड तर्क के साथ आना वाकई मुश्किल क्यों है। (मैं उम्र के लिए एक औपचारिक अर्थ विज्ञान चाहने गया है, लेकिन जाहिर है रॉबर्टो और LHF बेहतर काम करने के लिए है।)

अगर मैं लुआ के लिए रिक्तिपूर्व बहुकार्यन चाहता था, मैं भी में यह करने के लिए कोशिश नहीं शुद्ध लुआ

  • इंटरप्ट lua_State में एक ध्वज कहा, "वर्तमान coroutine रोका गया है" सेट: इसके बजाय मैं एक पुराने चाल मैं पहली बार न्यू जर्सी के मानक ML में 20 साल पहले देखा था का उपयोग करेंगे।

  • ऑल्टर वीएम ताकि हर पाश और हर समारोह फोन पर, यह झंडा और पैदावार की जाँच करता है, यदि आवश्यक हो।

यह पैच लिखना आसान और बनाए रखना आसान होगा। यह लंबे समय से चल रहा है सी समारोह है कि पूर्व empted नहीं किया जा सकता की समस्या का समाधान नहीं है, लेकिन आपको लगता है कि समस्या को हल करने के लिए है, तो आप बहुत कठिन क्षेत्र में भटक रहे हैं, और आप के रूप में अच्छी पर अपने सभी सूत्रण ऐसा कर सकते हैं सी स्तर, लुआ स्तर नहीं।

+0

जानकारी के लिए धन्यवाद :) – RCIX

+0

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

5

मुझे नहीं पता कि, नहीं। यदि आप debug.sethook के साथ coroutines पर सेट हुक से उत्पन्न हो सकते हैं, लेकिन यह काम नहीं करता है, तो यह लगभग बेतुका सरल होगा। आप सी हुक सी (lua_sethook) से सेट से उपज है, लेकिन मैं बाहर बिल्कुल ऐसा करने में लगा सकते हैं सकता है, और यह शुद्ध लुआ वैसे भी नहीं है।

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

Here लुआ-एल मेलिंग सूची से संबंधित धागा है जो आपको दिलचस्प लगेगा।

+0

सुप्रीम कमांडर ऐसी "नकली" थ्रेडिंग प्रणाली का उपयोग करता है, हालांकि इसमें लूआ का एक कस्टम ट्विक है। यही सवाल था कि इस सवाल को प्रेरित किया :) – RCIX

+0

सचमुच, मैं इस तरह की चीज करने में सक्षम होने के लिए _love_ चाहता हूं। यह कुछ समस्याएं पैदा करेगा जो मैं आसानी से संभालने के लिए बहुत आसान हो जाता हूं। – Twisol

5

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

आप उल्लेख करते हैं कि विंडोज ज्यादातर सी/सी ++ में लिखा गया है। कीवर्ड ज्यादातर है। आप शुद्ध एएनएसआई सी/सी ++ में प्रीपेप्टिव शेड्यूलर नहीं लिख सकते हैं। आमतौर पर, इंटरप्ट सेवा दिनचर्या का हिस्सा असेंबली भाषा में लिखा जाता है। या, सी/सी ++ कंपाइलर एक गैर-मानक एक्सटेंशन लागू करता है जो सी/सी ++ में इंटरप्ट सेवा दिनचर्या को लिखने की अनुमति देता है। कुछ कंपाइलर्स आपको एक __ अंतराल संशोधक के साथ एक फ़ंक्शन घोषित करने की अनुमति देते हैं जो संकलक को लंबे समय तक उत्पन्न करने का कारण बनता है जो फ़ंक्शन को एक इंटरप्ट सेवा दिनचर्या के रूप में उपयोग करने की अनुमति देता है।

इसके अलावा, कोड जो स्मृति मैप किए गए आईओ, या आईओ निर्देशों के साथ सीपीयू रजिस्टरों के साथ इंटरप्ट सेवा नियमित फ़िडल सेट करता है। इस कोड में से कोई भी पोर्टेबल एएनएसआई सी/सी ++ है। और, सीपीयू आर्किटेक्चर पर निर्भर करता है।