वर्तमान सॉफ्टवेयर उद्योग में मल्टीथ्रेडिंग कितना महत्वपूर्ण है? [बन्द है]


59

मेरे पास एमवीसी फ्रेमवर्क (स्ट्रट्स की तरह) का उपयोग करके जावा में वेब एप्लिकेशन लिखने का 3 साल का अनुभव है। मैंने अब तक कभी भी मल्टीथ्रेडेड कोड नहीं लिखा है, हालांकि मैंने प्रमुख खुदरा श्रृंखलाओं के लिए कोड लिखा है।

मुझे साक्षात्कार के दौरान मल्टीथ्रेडिंग पर कुछ प्रश्न मिलते हैं और मैं उन्हें आमतौर पर (ज्यादातर सरल प्रश्न) उत्तर देता हूं। इससे मुझे आश्चर्य हुआ कि मौजूदा उद्योग परिदृश्य में मल्टीथ्रेडिंग कितना महत्वपूर्ण है?


8
आपने स्पष्ट रूप से ऐसा नहीं किया होगा, लेकिन पर्दे के पीछे आपने इसका फायदा जरूर उठाया है।
मार्टिन यॉर्क

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

1
मैं शायद ही कभी इसे वेब विकास में उपयोग करता हूं, लेकिन मुझे लगता है कि यह कहीं और सामान्य है। उदाहरण के लिए, मैं हाल ही में एक एंड्रॉइड ऐप लिख रहा था और महसूस किया कि यदि आपके पास कोई नेटवर्क गतिविधि है तो आपको मल्टीथ्रेडिंग का उपयोग करना आवश्यक है।
jwegner

4
यह महत्वपूर्ण नहीं है, यह समानांतर कंप्यूटिंग है। अगर आपको लगता है कि आपके वेब ऐप पर जाने वाला सब कुछ थ्रेड पर है ... तो आपको कुछ न कुछ अवश्य करना चाहिए।
user606723

1
"थ्रेड के बाहर सोचने की क्षमता" सिंगल थ्रेडेड प्रोग्रामिंग के लिए भी बहुत अच्छा है। आप स्वीकृत के लिए बहुत कम लेते हैं, और आपका कोड आमतौर पर अधिक मजबूत और पुन: प्रयोज्य होता है।
corsiKa

जवाबों:


92

यह अत्यंत महत्वपूर्ण है।

हालांकि यह समझना अधिक महत्वपूर्ण है कि अतुल्यकालिक समस्या को हल करने के लिए मल्टीथ्रेडिंग सिर्फ एक तरीका है। जिस तकनीकी वातावरण में अब बहुत से लोग सॉफ्टवेयर लिख रहे हैं, वह ऐतिहासिक सॉफ्टवेयर डेवलपमेंट एनवायरनमेंट (मोनोलिथिक एप्लिकेशन के बैच कंपीटेशंस का प्रदर्शन) से दो प्रमुख तरीकों से भिन्न है:

  • कई-कोर मशीनें अब आम हैं। हम परिमाण के आदेशों से घड़ी की गति या ट्रांजिस्टर घनत्व की उम्मीद नहीं कर सकते हैं। गणना की कीमत में गिरावट जारी रहेगी, लेकिन बहुत सारे समानता के कारण यह गिर जाएगी। हमें उस शक्ति का लाभ उठाने का एक तरीका खोजना होगा।

  • कंप्यूटर अब भारी नेटवर्क हैं और आधुनिक अनुप्रयोग विभिन्न स्रोतों से समृद्ध जानकारी प्राप्त करने में सक्षम हैं।

एक कम्प्यूटेशनल दृष्टिकोण से, ये दो कारक अनिवार्य रूप से एक ही मूल विचार को उबालते हैं: एक अतुल्यकालिक फैशन में जानकारी तेजी से उपलब्ध होगी । क्या आपके लिए आवश्यक जानकारी आपकी मशीन में किसी अन्य चिप पर या दुनिया भर में आधे रास्ते पर एक चिप पर गणना की जा रही है या नहीं। किसी भी तरह से, आपका प्रोसेसर वहाँ बैठा हुआ है, जब वह उपयोगी काम कर सकता है, तो वह सूचना के इंतजार में अरबों चक्र जला रहा है।

तो क्या अब मायने रखती है, और क्या भविष्य में और भी अधिक बात करेंगे, नहीं है multithreading दर असल, बल्कि, asynchrony के साथ काम कर । मल्टीथ्रेडिंग ऐसा करने का सिर्फ एक तरीका है - एक जटिल, त्रुटि-प्रवण तरीका जो केवल अधिक जटिल और अधिक त्रुटि-प्रवण होने वाला है क्योंकि कमजोर-मेमोरी-मॉडल चिप्स अधिक व्यापक रूप से उपयोग किए जाते हैं।

उपकरण विक्रेताओं के लिए चुनौती यह है कि वे अपने ग्राहकों के लिए मल्टीथ्रेडिंग की तुलना में बेहतर तरीके से पेश आएं, ताकि वे उस अतुल्यकालिक अवसंरचना से निपट सकें जिसका वे भविष्य में उपयोग कर रहे हैं।


5
एक उत्कृष्ट जवाब के लिए, यह मेरे स्वयं के विनम्र प्रयास की तुलना में अधिक श्रेय का हकदार है।
पीटर टॉपर

2
जानकारी तेजी से एक अतुल्यकालिक फैशन में उपलब्ध होगी। अगर वह सच नहीं है। । ।
सर्फस

2
concurrencyasynchronous व्यवहार से अधिक महत्वपूर्ण है । आप बिना किसी संगति के asyncronous कर सकते हैं (यानी एक ही कोर CPU पर कई धागे) asynchronousएक अर्थपूर्ण विकल्प नहीं है concurrency

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

"संगामिति अक्सर केवल संगामिति की नकल होती है, उदाहरण के लिए, टाइम स्लाइसिंग के माध्यम से गैर-सहकारी मल्टीटास्किंग": मेरी समझ में यह अभी भी (सच्चा) संगामिति है, शायद आपका मतलब यह समानता नहीं है?
जियोर्जियो

46

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


3
+1: पहले से कहीं अधिक महत्वपूर्ण। यह भी याद रखें कि सिस्टम डिज़ाइन में, आप केवल कार्य विभाजन करके मल्टीथ्रेडिंग के लाभ प्राप्त कर सकते हैं ताकि अधिक प्रक्रियाएँ कर रहे हों।
स्कॉट सी विल्सन

11
काफी कुछ मोबाइल उपकरणों में पहले से ही मल्टी-कोर प्रोसेसर हैं!
चे जामी

3
मेरा तर्क है कि पहली बार साझाकरण प्रणाली के निर्माण के बाद से मल्टी-थ्रेडिंग महत्वपूर्ण है। कई प्रोसेसर / कोर होने से कई थ्रेड होने के लिए दक्षता का एक नया आयाम जुड़ जाता है।
jernernerny

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

1
@ टक्स-डी, आपके पास बहुत अच्छी तरह से एक मोबाइल डिवाइस पर एक गेम हो सकता है जो एक से अधिक कोर का उपयोग करता है। यह कुछ असाधारण नहीं है।
श्वेतार्क

28

सामान्य तौर पर, मल्टी-थ्रेडिंग पहले से ही काफी महत्वपूर्ण है, और केवल अगले कुछ वर्षों में अधिक महत्वपूर्ण होने जा रहा है (जैसा कि Péter Török) ने बताया - यह है कि कैसे प्रोसेसर भविष्य के लिए बड़े पैमाने पर काम करेगा (उच्च मेगाहर्ट्ज के बजाय अधिक कोर) ।

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


ध्यान दें कि पोस्टर एक वेब डेवलपर है और अधिकांश वेब सर्वर कंटेनर आपके लिए बहु-थ्रेडिंग का काम करते हैं। ऐसा नहीं है कि यह कुछ मामलों में आवश्यकता को समाप्त करता है, लेकिन मल्टी-थ्रेडिंग कंट्रोलर कोड का 99% समय एमवीसी कॉल के लिए सबसे बड़ा प्रदर्शन सुधार नहीं है।
मुफ्सा

19

मल्टी-थ्रेडिंग एक लाल हेरिंग है। मल्टी-थ्रेडिंग वास्तविक समस्या का एक कार्यान्वयन विवरण है, जो कि कंजेंसी है । ताले के कारण सभी थ्रेडेड प्रोग्राम समवर्ती नहीं हैं और क्या नहीं।

concurrentकार्यक्रम लागू करने के लिए थ्रेड्स केवल एक मॉडल और कार्यान्वयन पैटर्न हैं।

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


+1 हालांकि मुझे अभी भी लगता है कि एरलांग बहु-थ्रेडेड है; समुदाय ने परस्पर साझा अवस्था पर निर्भर रहने के लिए "थ्रेड" शब्द को फिर से परिभाषित किया, और इस तरह खुद को इससे अलग कर लिया।
दान

1
एर्लांग वीएम डिफ़ॉल्ट रूप से सीपीयू प्रति 1 थ्रेड का उपयोग करता है, लेकिन एर्लैंग डेवलपर के रूप में, आपके पास अंतर्निहित ओएस थ्रेड्स तक केवल हल्के वजन की प्रक्रिया नहीं होती है जो एरलंग वीएम आपूर्ति करती है।

10

मुझे साक्षात्कार के दौरान मल्टीथ्रेडिंग पर कुछ प्रश्न मिलते हैं ...

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


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

6

यह समझना कि प्रदर्शन में सुधार करने के लिए थ्रेडिंग का लाभ कैसे उठाया जाए, आज के सॉफ्टवेयर वातावरण में, अधिकांश उद्योगों और अनुप्रयोगों के लिए एक महत्वपूर्ण कौशल है।

कम से कम, समसामयिकता से जुड़े मुद्दों को समझना एक दिया जाना चाहिए।

स्पष्ट ध्यान दें कि सभी अनुप्रयोग या वातावरण इसका लाभ उठाने में सक्षम नहीं होंगे, उदाहरण के लिए कई एम्बेडेड सिस्टम में। हालाँकि ऐसा लगता है कि जैसे एटम प्रोसेसर (एट अल) इसे बदलने के लिए काम कर रहा है (हल्के मल्टीकोर अधिक सामान्य होने लगते हैं)।


4

लगता है कि आप पहले से ही मल्टीथ्रेडेड कोड लिख रहे हैं।

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

इसलिए मैं कहूंगा कि कम से कम मूल बातें जानना महत्वपूर्ण है।


18
<nitpick> जाहिरा तौर पर वह मल्टीथ्रेडेड कोड नहीं लिख रहा है, केवल (सिंगल थ्रेडेड) कोड जो एक मल्टीथ्रेडेड वातावरण में चलाया जाता है। </ nitpick>
Péter Török

2

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


2

संक्षिप्त उत्तर: बहुत।

लंबे समय तक उत्तर: इलेक्ट्रॉनिक (ट्रांजिस्टर-आधारित) कंप्यूटर तेजी से प्रौद्योगिकी की भौतिक सीमाओं के करीब पहुंच रहे हैं। गर्मी उत्पन्न करते समय प्रत्येक कोर से अधिक घड़ियों को निचोड़ना कठिन और कठिन होता जा रहा है और माइक्रोस्कोपिक सर्किट (सर्किट पथों के क्वांटम प्रभाव पहले से ही आधुनिक चिप्स पर एक साथ इतने करीब रखे जा रहे हैं कि "क्वांटम टनलिंग" नामक एक इलेक्ट्रॉन बना सकता है। एक पारंपरिक विद्युत चाप के लिए उचित परिस्थितियों की आवश्यकता के बिना, एक सर्किट से दूसरे सर्किट में "पटरियों को कूदो"; इसलिए, लगभग सभी चिप निर्माता इसके बजाय प्रत्येक सीपीयू में "निष्पादन इकाइयों" को डालकर, प्रत्येक घड़ी को और अधिक सक्षम बनाने पर ध्यान केंद्रित कर रहे हैं। फिर, कंप्यूटर प्रति घड़ी केवल एक काम करने के बजाय, यह 2, या 4 कर सकता है, या 8. 8. इंटेल में "हाइपरट्रेडिंग" है, जो मूल रूप से एक सीपीयू कोर को दो तार्किक प्रोसेसर (कुछ सीमाओं के साथ) में विभाजित करता है। वस्तुतः सभी निर्माता एक सीपीयू चिप में कम से कम दो अलग-अलग सीपीयू कोर लगा रहे हैं, और डेस्कटॉप सीपीयू के लिए वर्तमान सोने का मानक आपकी चिप के साथ चार कोर है। आठ संभव है जब दो सीपीयू चिप्स का उपयोग किया जाता है, "क्वाड क्वाड-कोर" प्रोसेसर (16 ईयूएस प्लस वैकल्पिक एचटी) के लिए डिज़ाइन किए गए सर्वर मेनबोर्ड हैं, और सीपीयू की अगली पीढ़ी में प्रति चिप छह या आठ होने की संभावना है।

इस सब के ऊपर यह है कि, जिस तरह से कंप्यूटर कंप्यूटिंग शक्ति प्राप्त कर रहे हैं, उसका पूरा लाभ उठाने के लिए, आपको अपने प्रोग्राम को कंप्यूटर को "विभाजित और जीतने" की अनुमति देने में सक्षम होना चाहिए। प्रबंधित भाषाओं में कम से कम एक GC धागा होता है जो आपके प्रोग्राम से मेमोरी प्रबंधन को अलग से संभालता है। कुछ में "संक्रमण" धागे भी होते हैं जो COM / OLE इंटरोप को संभालते हैं (प्रदर्शन के लिए प्रबंधित "सैंडबॉक्स" की सुरक्षा के लिए बहुत कुछ)। उस से परे, हालांकि, आपको वास्तव में यह सोचना शुरू करना होगा कि आपका प्रोग्राम एक साथ कई काम कैसे कर सकता है, और आपके प्रोग्राम को वास्तुशिल्प रूप से नियंत्रित करने के लिए डिज़ाइन किए गए सुविधाओं के साथ अपने प्रोग्राम को आर्किटेक्ट करें। विंडोज, और विंडोज़ उपयोगकर्ता, व्यावहारिक रूप से आपके प्रोग्राम को पृष्ठभूमि थ्रेड्स में लंबे, जटिल कार्यों को करने की उम्मीद करेंगे, जो आपके प्रोग्राम के UI (जो प्रोग्राम के मुख्य थ्रेड में चलता है) को विंडोज मैसेज लूप में "रिस्पॉन्सिबल" रखता है। जाहिर है, समांतर समाधान (जैसे छंटनी) की समस्याएं प्राकृतिक उम्मीदवार हैं, लेकिन समांतरिकरण से लाभ उठाने वाली समस्याओं की एक सीमित संख्या है।


1

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

संपादित करें: यहाँ मल्टीथ्रेडिंग के डाउनसाइड्स के बारे में ध्यान रखने योग्य कुछ बातें हैं:

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

इसके अलावा, यह लिंक उसी के बारे में कुछ मदद कर सकता है।


2
यह ओपी के सवाल का जवाब देने के लिए प्रतीत नहीं होता है: - /
Péter Török

यह थ्रेडिंग का एक शीर्ष (सबसे) स्तर दृश्य देता है, हालांकि। मल्टी-थ्रेडिंग में देरी से पहले विचार करने वाली बात।
c0da

@ c0da स्टैक एक्सचेंज एक चर्चा बोर्ड नहीं है: जवाब सीधे सवाल का जवाब देना चाहिए। क्या आप इसे वापस लाने के लिए अपने उत्तर का विस्तार कर सकते हैं कि पूछने वाले की क्या तलाश है?

1

इससे मुझे आश्चर्य हुआ कि मौजूदा उद्योग परिदृश्य में मल्टीथ्रेडिंग कितना महत्वपूर्ण है?

प्रदर्शन-महत्वपूर्ण क्षेत्रों में जहां प्रदर्शन भारी-भार उठाने वाले तीसरे पक्ष के कोड से नहीं हो रहा है, लेकिन हमारा अपना है, तो मैं CPU परिप्रेक्ष्य से महत्वपूर्ण महत्व के इस क्रम में चीजों पर विचार करना चाहता हूं (GPU एक वाइल्डकार्ड है जिसे मैंने जीता है 'में नहीं जाना):

  1. मेमोरी दक्षता (पूर्व: संदर्भ का स्थानीयता)।
  2. एल्गोरिथम
  3. बहु सूत्रण
  4. SIMD
  5. अन्य अनुकूलन (स्थिर शाखा पूर्वानुमान संकेत, उदाहरण के लिए)

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

मेमोरी क्षमता

एल्गोरिथम पर स्मृति दक्षता के मेरी पसंद पर सबसे अधिक आश्चर्य हो सकता है। ऐसा इसलिए है क्योंकि स्मृति दक्षता इस सूची में सभी 4 अन्य मदों के साथ बातचीत करती है, और यह इसलिए है क्योंकि "कार्यान्वयन" श्रेणी के बजाय "डिजाइन" श्रेणी में इसका अक्सर विचार होता है। स्मृति दक्षता को समझने में अक्सर चिकन या अंडा समस्या का एक सा हिस्सा होता है, अक्सर सूची पर सभी 4 वस्तुओं पर विचार करने की आवश्यकता होती है, जबकि सभी 4 अन्य वस्तुओं को भी स्मृति दक्षता पर विचार करने की आवश्यकता होती है। फिर भी यह हर चीज के दिल में है।

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

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

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

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

एल्गोरिथम

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

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

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

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

बहु सूत्रण

मल्टीथ्रेडिंग प्रदर्शन के संदर्भ में एक कठिन है क्योंकि यह हार्डवेयर विशेषताओं के लिए एक सूक्ष्म-स्तरीय अनुकूलन है, लेकिन हमारा हार्डवेयर वास्तव में उस दिशा में बढ़ रहा है। पहले से ही मेरे पास सहकर्मी हैं जिनके पास 32 कोर हैं (मेरे पास केवल 4 हैं)।

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

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

SIMD

SIMD भी थोड़ा अजीब है क्योंकि रजिस्टर वास्तव में व्यापक हो रहे हैं, और भी व्यापक होने की योजना है। मूल रूप से हमने 64-बिट एमएमएक्स रजिस्टर देखा, जिसके बाद समानांतर में 4 एसपीएफपी संचालन में सक्षम 128-बिट एक्सएमएम रजिस्टर। अब हम समांतर 8 में सक्षम 256-बिट YMM रजिस्टर देख रहे हैं। और पहले से ही 512-बिट रजिस्टरों के लिए योजनाएं हैं जो 16 को समानांतर में अनुमति देगा।

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

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

एक बार फिर, बिना किसी मेमोरी लेआउट के, जो कि वेक्टरकृत प्रसंस्करण के लिए कुशल है, SIMD बेकार है। हम केवल एक स्केलर फ़ील्ड को एक विस्तृत रजिस्टर में लोड कर रहे हैं, केवल उस पर एक ऑपरेशन करने के लिए। इन सभी वस्तुओं के दिल में वास्तव में कुशल होने के लिए मेमोरी लेआउट पर निर्भरता है।

अन्य अनुकूलन

ये अक्सर वही होते हैं जो मैं सुझाव देता हूं कि हम आजकल "माइक्रो" कॉल करना शुरू कर देंगे, यदि शब्द न केवल एल्गोरिदमिक फोकस से परे जाने का सुझाव देता है, बल्कि उन परिवर्तनों की ओर भी है जो प्रदर्शन पर एक लघु प्रभाव डालते हैं।

अक्सर शाखा भविष्यवाणी के लिए अनुकूलन करने की कोशिश करने के लिए एल्गोरिथ्म या स्मृति दक्षता में बदलाव की आवश्यकता होती है, उदाहरण के लिए, अगर यह केवल संकेत और स्थैतिक भविष्यवाणी के लिए कोड को पुन: व्यवस्थित करने का प्रयास किया जाता है, तो यह केवल ऐसे कोड के पहली बार निष्पादन में सुधार करता है, जिससे प्रभावों पर सवाल उठता है अक्सर एकमुश्त नगण्य नहीं।

प्रदर्शन के लिए वापस मल्टीथ्रेडिंग पर जाएं

तो वैसे भी, एक प्रदर्शन के संदर्भ से कितना महत्वपूर्ण है? मेरे 4-कोर मशीन पर, यह आदर्श रूप से 5 गुना तेजी से चीजें बना सकता है (हाइपरथ्रेडिंग के साथ मुझे क्या मिल सकता है)। यह मेरे सहयोगी के लिए काफी महत्वपूर्ण होगा जिनके पास 32 कोर हैं। और यह आने वाले वर्षों में तेजी से महत्वपूर्ण हो जाएगा।

इसलिए यह काफी महत्वपूर्ण है। लेकिन यह समस्या पर थ्रेड्स का एक गुच्छा फेंकना बेकार है यदि मेमोरी दक्षता नहीं है तो तालों को संयम से इस्तेमाल किया जा सकता है, झूठी साझाकरण को कम करने के लिए, आदि।

प्रदर्शन के बाहर बहुआयामी

मल्टीथ्रेडिंग हमेशा सरासर प्रदर्शन के बारे में एक सीधी तरह से समझ में नहीं आता है। कभी-कभी यह उपयोगकर्ता को जवाबदेही में सुधार करने के लिए थ्रूपुट की संभावित लागत पर भी एक लोड को संतुलित करने के लिए उपयोग किया जाता है, या उपयोगकर्ता को चीजों को खत्म करने के लिए इंतजार किए बिना अधिक मल्टीटास्किंग करने की अनुमति देता है (उदा: फ़ाइल डाउनलोड करते समय ब्राउज़िंग जारी रखें)।

उन मामलों में, मेरा सुझाव है कि मल्टीथ्रेडिंग ऊपर की ओर बहुत अधिक बढ़ जाता है (संभवतः मेमोरी दक्षता से भी ऊपर), क्योंकि यह तब हार्डवेयर के सबसे बाहर निकलने के बजाय उपयोगकर्ता के अंत डिजाइन के बारे में है। यह अक्सर इंटरफ़ेस डिज़ाइनों पर हावी होता जा रहा है और जिस तरह से हम इस तरह के परिदृश्यों में हमारे पूरे कोडबेस को संरचना देते हैं।

जब हम बड़े पैमाने पर डेटा संरचना तक पहुँचने के लिए बस एक तंग लूप को समानांतर नहीं कर रहे हैं, तो मल्टीथ्रेडिंग वास्तव में कट्टर "डिज़ाइन" श्रेणी में चला जाता है, और डिज़ाइन हमेशा ट्रम्प कार्यान्वयन होता है।

तो उन मामलों में, मैं कहूंगा कि मल्टीथ्रेडिंग अपफ्रंट पर विचार करना बहुत महत्वपूर्ण है, स्मृति प्रतिनिधित्व और पहुंच से भी अधिक।


0

समवर्ती और समानांतर प्रोग्रामिंग वह है जो महत्वपूर्ण होती जा रही है। थ्रेड्स एक ही समय में कई काम करने का एक प्रोग्रामिंग मॉडल है (और छद्म समानांतर में ऐसा नहीं है जैसे यह मल्टी-कोर प्रोसेसर के उदय से पहले हुआ करता था)। बहु-सूत्रण (IMHO निष्पक्ष) की आलोचना की जाती है जो जटिल और खतरनाक है क्योंकि धागे कई संसाधनों को साझा करते हैं और प्रोग्रामर उन्हें सहयोग करने के लिए जिम्मेदार है। अन्यथा आप गतिरोधों के साथ समाप्त होते हैं जो डीबग करना कठिन है।


0

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

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


0

ऐतिहासिक रूप से लोगों को हाथ से मल्टीथ्रेड प्रोग्रामिंग करके संघर्ष करना पड़ा। उन्हें सीधे सभी मुख्य घटकों (थ्रेड्स, सेमाफोर्स, म्यूटेक्स, लॉक्स, आदि) के साथ काम करना था।

इन सभी प्रयासों के परिणामस्वरूप ऐसे अनुप्रयोग उत्पन्न हुए जो एक प्रणाली में अतिरिक्त सीपीयू जोड़कर बड़े पैमाने पर करने में सक्षम थे। यह वर्टिकल स्कैलेबिलिटी "व्हाट्सएप सबसे बड़ा सर्वर जिसे मैं खरीद सकता हूं" तक सीमित है।

आजकल मुझे सॉफ्टवेयर डिजाइन के लिए अधिक रूपरेखा और विभिन्न डिजाइन मॉडल का उपयोग करने की दिशा में एक बदलाव दिखाई देता है। MapReduce एक ऐसा मॉडल है जो बैच प्रोसेसिंग की ओर केंद्रित है।

लक्ष्य क्षैतिज रूप से बढ़ रहा है। बड़े सर्वर खरीदने के बजाय अधिक मानक सर्वर जोड़ना।

इस तथ्य ने कहा कि वास्तव में मल्टीथ्रेडेड प्रोग्रामिंग को समझना बहुत महत्वपूर्ण है। मैं उस स्थिति में रहा हूं जहां किसी ने एक दौड़ की स्थिति बनाई और यह भी नहीं पता था कि जब तक हम परीक्षण के दौरान अजीब त्रुटियों पर ध्यान नहीं देते तब तक एक दौड़ की स्थिति क्या है।


-1

मेरी मशीन में 8 कोर हैं। टास्क मैनेजर में, मेरे पास 60 प्रक्रियाएँ हैं। वीएस जैसे कुछ, 98 थ्रेड तक का उपयोग करते हैं। आउटलुक 26 का उपयोग करता है। मुझे उम्मीद है कि मेरे अधिकांश मेमोरी उपयोग उन निष्क्रिय थ्रेड्स में से प्रत्येक के लिए आवंटित किए गए स्टैक हैं।

मैं व्यक्तिगत रूप से 300-कोर कंप्यूटर के बाहर आने का इंतजार कर रहा हूं ताकि मुझे आउटलुक के जवाब के लिए इंतजार न करना पड़े। बेशक तब तक आउटलुक 301 थ्रेड का उपयोग करेगा।

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

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


मैं अक्सर एक पृष्ठभूमि थ्रेड पर कुछ अजीब करूंगा जैसे कि एक लंबा DB लोड, लेकिन इसकी बहुत दुर्लभ मुझे दौड़ की स्थिति या ताले आदि से निपटना होगा (वास्तव में शायद कभी नहीं)
अरन मुल्होलैंड
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.