2011-08-27 6 views
23

वहाँ पर किसी भी अच्छे documention कितने धागे GCD द्वारा बनाई गई हैं है? डब्ल्यूडब्ल्यूडीसी में, उन्होंने हमें बताया कि यह सीपीयू कोर के आसपास मॉडलिंग किया गया है। हालांकि, अगर मैं इस उदाहरण फोन:जीसीडी द्वारा निर्मित धागे की संख्या?

for (int i=1; i<30000; i++) { 
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{ 
     [NSThread sleepForTimeInterval:100000]; 
    }); 
} 

यह 66 धागे यहाँ तक कि एक iPad1 पर खुलता है,। (शेर पर मूल रूप से बुलाए जाने पर यह 66 धागे भी खुलता है)। क्यों 66?

उत्तर

24

पहला, 66 == 64 (अधिकतम जीसीडी थ्रेड पूल आकार) + मुख्य धागा + कुछ अन्य यादृच्छिक गैर-जीसीडी थ्रेड।

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

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

संक्षेप में, थ्रेड पूल स्वचालित रूप से संचालित होगा यदि आपका कोड एपीआई जैसे "नींद()" पर प्रेषण (बाद) को छोड़ देता है, और हैंडकार्ड ईवेंट लूप (यूनिक्स सिलेक्ट()/पोल(), कोको रनूप्स, या यूनिट पर प्रेषण स्रोतों को प्रेषित करता है। POSIX स्थिति चर)।

+1

"को थ्रेड पूल से सह-चुना गया है" सह-चयन से आपका क्या मतलब है? क्या आपका मतलब है कि सोने या अन्य हैंग-अप को 100% गतिविधि के रूप में व्याख्या की जाएगी और इसलिए थ्रेड अतिरिक्त प्रेषण के साथ उपयोग के लिए उपलब्ध नहीं होगा? –

+1

निश्चित रूप से अच्छा होगा अगर आप थ्रेड पूल आकार पर इस दावे का संदर्भ प्रदान कर सकते हैं - मैं कहीं भी कहीं भी नहीं ढूंढ पा रहा हूं। –

1

प्रलेखन बनाए गए धागे की संख्या का उल्लेख करने से बचाता है। अधिकतर क्योंकि धागे की इष्टतम संख्या संदर्भ पर भारी निर्भर करती है।

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

आपके मामले में, जीसीडी का पता चलता है कि कार्य निष्क्रिय है, और अगले कार्य के लिए एक नया धागा पैदा करता है।

क्यों 66 सीमा मुझ से परे है।

+0

मैं शायद ही विश्वास कर सकते हैं कि 66, बेहतरीन संख्या है अगर प्रलेखन मुझसे कहता है कि प्रत्येक थ्रेड राम के बारे में आधे एक मेगाबाइट खाता है। (Http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Multithreading/CreatingThreads/CreatingThreads.html) इस प्रकार, 66 धागे के साथ, हम के बारे में 30 megs भूमि के ऊपर, है कि आईओएस के 64MB सीमा के आधे में है कुल। – steipete

+0

@steipete थ्रेड भी संदर्भ स्विचिंग लागत। इसलिए सीमा तय करने का एकमात्र कारक स्मृति नहीं होना चाहिए। – Eonil

+1

उसी दस्तावेज़ से @steipete "लेकिन उस स्मृति से जुड़े वास्तविक पृष्ठ तब तक बनाए नहीं जाते जब तक उनकी आवश्यकता न हो।"। तो, स्टैक स्पेस का आधा मेग केवल तभी दावा किया जाता है जब पृष्ठ (पृष्ठ द्वारा पृष्ठ; यानी यदि आपके थ्रेड को केवल स्टैक के 2 पृष्ठों की आवश्यकता है, तो यह केवल इतना ही बर्बाद हो जाता है)। इसके अलावा, आयनिल, अब हमारे पास बहु-कोर CPU है जहां संदर्भ स्विचिंग की लागत एक समस्या से कम है (यह देखते हुए कि आप 'केवल' कोर की संख्या के बराबर या उससे कम धागे की संख्या चलाते हैं) – tofi9