2011-09-22 19 views
5

मेरे पास दो सी ++ कोड हैं जिन्हें कहा जाता है और एक को बी कहा जाता है। मैं बूस्ट थ्रेडिंग लाइब्रेरी का उपयोग कर 64 बिट्स लिनक्स में दौड़ रहा हूं।विभिन्न प्रक्रियाओं के बीच उपज

कोड 5 धागे बनाता है जो कुछ ऑपरेशन करने वाले गैर-अंतराल लूप में रहते हैं। बी कोड 5 धागे बनाता है जो एक गैर-अंतराल लूप invoking उपज() में रहते हैं।

मैं क्वाडकोर मशीन पर हूं ... जब कोड अकेले कोड करता है, तो यह लगभग 400% CPU उपयोग प्राप्त करता है। जब बी अकेले कोड का आह्वान करते हैं, तो यह लगभग 400% CPU उपयोग प्राप्त करता है। मुझे पहले ही इसकी उम्मीद है।

लेकिन जब दोनों एक साथ चल रहा है, मैं उम्मीद कर रहा था कि कोड CPU के लगभग कुछ भी नहीं किया जाता है और एक 400% का उपयोग करें। लेकिन वास्तव में दोनों सीपीयू के बराबर स्लाइस का उपयोग कर रहे हैं, लगभग 200%।

मेरा सवाल है,() विभिन्न प्रक्रियाओं के बीच काम नहीं करता है? क्या मुझे उम्मीद है कि इसे जिस तरह से काम करने का कोई तरीका है?

+1

मेरे पास कोई जवाब नहीं है, और मुझे लगता है कि आपका प्रश्न दिलचस्प है क्योंकि शेड_इल्ड ने रन कतार के पीछे प्रक्रिया को रखने का दावा किया है, लेकिन यह वास्तविक रूप से उपयोगी उपयोग करने के संदर्भ में आपके लिए दिलचस्प हो सकता है sched_yield का उपयोग करके: http://kerneltrap.org/Linux/Using_sched_yield_Improperly – Kevin

+1

यह पुस्तक स्निपेट का तात्पर्य है कि आपके लिनक्स कर्नेल का संस्करण मायने रखता है: http://books.google.com/books?id=k_ocKY0iegsC&pg=PA168&lpg=PA168&dq=sched_yield+ + एक और + प्रक्रिया और स्रोत = बीएल और ओ टी एस = VgCNK6kGIu और sig = gyduzTS_2EY8v8wwwAE8MScSLsg & hl = hi & Ei = 68N7TqfOCcXPiAK6qrDVBw और सा = एक्स और Oi = book_result और सीटी = परिणाम और resnum = 3 और वेद = 0CCgQ6AEwAg # v = onepage & q = sched_yield% 20to% 20another% 20process & f = गलत पर – Kevin

उत्तर

2

लिनक्स गतिशील थ्रेड प्राथमिकता का उपयोग करता है। अच्छी तरह से सेट की गई स्थिर प्राथमिकता केवल गतिशील प्राथमिकता को सीमित करने के लिए है।

जब कोई थ्रेड अपने पूरे टाइमलाइस का उपयोग करता है, तो कर्नेल इसकी प्राथमिकता को कम कर देगा और जब कोई थ्रेड अपने पूरे टाइमलाइस का उपयोग नहीं करेगा (आईओ करके, प्रतीक्षा/उपज आदि कहकर) कर्नेल इसकी प्राथमिकता बढ़ाएगा।

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

3

तो आपके पास 4 कोर 4 ए के चलते 4 धागे चल रहे हैं। कतार में 6 धागे हैं - 1 ए और 5 बी। चलने वाला एक थ्रेड इसके टाइमलाइस को समाप्त करता है और कतार में लौटता है। शेड्यूलर कतार से अगले रननेबल थ्रेड चुनता है। संभावना है कि यह चाल बी से संबंधित है? 5/6। ठीक है, यह धागा शुरू हो गया है, यह sched_yield() को कॉल करता है और कतार में वापस लौटाता है। संभावना क्या है कि अगला धागा फिर से बी थ्रेड होगा? 5/6 फिर से!

प्रक्रिया बी बार-बार CPU समय प्राप्त करता है, और कर्नेल को महंगा संदर्भ स्विच करने के लिए भी मजबूर करता है।

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

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