2008-09-01 18 views
8

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

थ्रेड पूल को कार्यों की एक श्रृंखला निष्पादित करने की आवश्यकता है। कार्य कम चल रहे हैं (< 1sec) या लंबे समय तक चलने (घंटे या दिन)। प्रत्येक कार्य में एक प्राथमिक प्राथमिकता होती है (1 = बहुत कम से 5 = बहुत अधिक)। कार्य किसी भी समय पहुंच सकते हैं जबकि अन्य कार्य चल रहे हैं, इसलिए जब वे थ्रेड पूल पहुंचते हैं तो इन्हें चुनने और उन्हें शेड्यूल करने के लिए शेड्यूल के रूप में सेट करने की आवश्यकता होती है।

कार्य प्राथमिकता कार्य लंबाई की पूरी तरह से स्वतंत्र है। असल में यह बताना असंभव है कि बिना किसी दौड़ के चलाने के लिए कितना समय लग सकता है।

कुछ कार्य सीपीयू बाध्य हैं जबकि कुछ बहुत अधिक IO बाध्य हैं। यह बता देना असंभव है कि एक दिया गया कार्य क्या होगा (हालांकि मुझे लगता है कि कार्य चल रहा है, जबकि यह पता लगाना संभव हो सकता है)।

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

सामान्य रूप से, आपको उच्च प्राथमिकता वाले कार्यों को उच्च CPU प्राथमिकता (रेफरी: SetThreadPriority) के साथ चलाना चाहिए। निचले प्राथमिकता वाले कार्यों को उच्च प्राथमिकता वाले कार्यों को "ब्लॉक" नहीं करना चाहिए, इसलिए यदि उच्च प्राथमिकता कार्य चल रहा है, तो उच्च प्राथमिकता कार्य चल रहा है, उच्च प्राथमिकता कार्य चलाना होगा।

कार्यों में उनके साथ जुड़े "अधिकतम चल रहे कार्य" पैरामीटर हैं। प्रत्येक प्रकार के कार्य को केवल एक समय में कार्य के इस कई समवर्ती उदाहरणों पर चलाने की अनुमति है। उदाहरण के लिए, हम कतार में निम्न कार्य हो सकता है:

  • एक - 1000 उदाहरणों - कम प्राथमिकता - अधिकतम कार्य 1
  • बी - 1000 उदाहरणों - कम प्राथमिकता - अधिकतम कार्य 1
  • सी - 1000 उदाहरण - कम प्राथमिकता - अधिकतम कार्य 1

एक कार्य कार्यान्वयन केवल एक ही समय में (ए) 1 बी और 1 सी चला सकता है (अधिकतर)।

इसे विंडोज एक्सपी, सर्वर 2003, Vista और सर्वर 2008 (नवीनतम सर्विस पैक) पर चलाने की जरूरत है।


संदर्भ के लिए, हम निम्न इंटरफ़ेस का उपयोग हो सकता है:

namespace ThreadPool 
{ 
    class Task 
    { 
    public: 
     Task();  
     void run(); 
    }; 

    class ThreadPool 
    {  
    public: 
     ThreadPool(); 
     ~ThreadPool(); 

     void run(Task *inst); 
     void stop(); 
    }; 
} 

उत्तर

5

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

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

1

यह Windows XP, सर्वर 2003, विस्टा और सर्वर 2008 (नवीनतम सर्विस पैक्स) पर चलाने की जरूरत है।

सिस्टम के अंतर्निर्मित थ्रेड पूल की कौन सी विशेषता उन्हें आपके कार्य के लिए अनुपयुक्त बनाती है?यदि आप XP और 2003 को लक्षित करना चाहते हैं तो आप नए चमकदार Vista/2008 पूल का उपयोग नहीं कर सकते हैं, लेकिन आप अभी भी QueueUserWorkItem और दोस्तों का उपयोग कर सकते हैं।

0

@DrPizza - यह एक बहुत अच्छा सवाल है, और यह समस्या के दिल के लिए सही है। QueueUserWorkItem और Windows NT थ्रेड पूल से इनकार करने के कुछ कारण हैं (हालांकि Vista एक दिलचस्प दिखता है, शायद कुछ सालों में)।

सबसे पहले, जब हम शुरू होते हैं और धागे को रोकते हैं तो हम अधिक नियंत्रण रखना चाहते थे। हमने सुना है कि एनटी थ्रेड पूल एक नया धागा शुरू करने के लिए अनिच्छुक है अगर ऐसा लगता है कि कार्य कम चल रहे हैं। हम WT_EXECUTELONGFUNCTION का उपयोग कर सकते हैं, लेकिन हमें वास्तव में कोई जानकारी नहीं है कि कार्य लंबा या छोटा

दूसरा, यदि थ्रेड पूल पहले से ही लंबे समय तक चल रहा था, कम प्राथमिकता वाले कार्यों, उच्च प्राथमिकता का कोई मौका नहीं होगा कार्य समय पर चलाने के लिए हो रही है। एनटी थ्रेड पूल में कार्य प्राथमिकताओं की कोई वास्तविक अवधारणा नहीं है, इसलिए हम एक QueueUserWorkItem नहीं कर सकते हैं और कह सकते हैं "ओह, वैसे भी इसे चलाएं"।

तीसरा, (एमएसडीएन के अनुसार) एनटी थ्रेड पूल एसटीए अपार्टमेंट मॉडल के साथ संगत नहीं है। मुझे यकीन नहीं है कि इसका क्या अर्थ होगा, लेकिन हमारे सभी कार्यकर्ता थ्रेड एसटीए में चलते हैं।

0

@DrPizza - यह एक बहुत अच्छा सवाल है, और यह समस्या के दिल के लिए सही है। QueueUserWorkItem और Windows NT थ्रेड पूल से इनकार करने के कुछ कारण हैं (हालांकि Vista एक दिलचस्प दिखता है, शायद कुछ सालों में)।

हाँ, ऐसा लगता है कि यह विस्टा में काफी हद तक बढ़ गया है, जो अब काफी बहुमुखी है।

ठीक है, मैं अभी भी थोड़ा अस्पष्ट हूं कि आप प्राथमिकताओं को कैसे काम करना चाहते हैं। यदि पूल वर्तमान में टाइप ए का कार्य 1 और कम प्राथमिकता के अधिकतम समरूपता के साथ चला रहा है, और इसे ए (और अधिकतम समवर्ती 1) प्रकार का एक नया कार्य भी दिया जाता है, लेकिन इस बार उच्च प्राथमिकता के साथ, इसे क्या करना चाहिए ?

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

मेरी धारणा यह है कि यह बाद का व्यवहार है जिसके बाद आप हैं?

0

@DrPizza:

ठीक है, मैं अभी भी कैसे आप प्राथमिकताओं काम करना चाहते हैं के बारे में थोड़ा अस्पष्ट रहा हूँ। यदि पूल वर्तमान में 1 की अधिकतम संगामिति और कम प्राथमिकता के साथ ग्रुप ए के एक कार्य चल रहा है, और यह दिया हो जाता है एक उच्च के साथ भी ग्रुप ए (और अधिक से अधिक संगामिति 1) का एक नया कार्य, लेकिन इस बार प्राथमिकता, यह क्या करना चाहिए?

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

आम तौर पर, केवल विभिन्न प्रकार के कार्यों में अलग-अलग प्राथमिकताओं की आवश्यकता होती है। उदाहरण के लिए: - 1000 उदाहरणों - कम प्राथमिकता

  • बी काम - 1000 उदाहरणों -

    • एक टास्क उच्च प्राथमिकता

    मान लिया जाये कि एक कार्य के साथ आया था और चल रहे थे, तो बी कार्यों के लिए किया था पहुंचे, हम चाहते हैं कि बी कार्य सीधे कम या ज्यादा चलाने में सक्षम हों।

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