Table of Contents
Concurrency and multithreading कंप्यूटर विज्ञान में मुख्य अवधारणाएं हैं जो इंजीनियरों को तेजी से, उत्तरदायी और स्केलेबल सॉफ्टवेयर बनाने की अनुमति देती हैं। चूंकि सिस्टम तेजी से मल्टी-कोर प्रोसेसर पर भरोसा करते हैं और आर्किटेक्चर वितरित करते हैं, इन विषयों को मास्टर करने के लिए प्रदर्शन की बाधाओं से निपटने, डेटा अखंडता सुनिश्चित करने और कुशल संसाधन उपयोग को प्राप्त करने के लिए आवश्यक हो गया है। यह लेख प्रमुख सिद्धांतों, सामान्य साक्षात्कार प्रश्नों और व्यावहारिक रणनीतियों का पता लगाता है कि प्रत्येक इंजीनियर को समवर्ती और बहुधा प्रणालियों के साथ काम करते समय पता होना चाहिए।
क्या है?
अभिगमन एक प्रणाली की क्षमता को संदर्भित करता है ताकि समय की ओवरलैपिंग में कई कार्यों को संभालने में सक्षम हो। इसका मतलब यह नहीं है कि कार्य उसी सटीक तत्काल (parallelism]]] पर ही लागू होते हैं, बल्कि यह प्रणाली अपने निष्पादन को रोकने के द्वारा कई कार्यों पर प्रगति कर सकती है। अभिगमनता, थ्रूपुट और उत्तरदायीता में सुधार करती है, विशेष रूप से आई / ओ-बाउंड या इंटरैक्टिव अनुप्रयोगों में।
कई तंत्रों के माध्यम से कॉनकॉरेंसी प्राप्त की जा सकती है:
- Multithreading – एक ही प्रक्रिया के भीतर एकाधिक धागे।
- Multiprocessing – एकाधिक प्रक्रियाएं जो अलग सीपीयू कोर पर चल सकती हैं।
- Asynchronous प्रोग्रामिंग - गैर अवरुद्ध संचालन जो कई कार्यों को संभालने के लिए एक धागा की अनुमति देता है (जैसे, कॉलबैक, फ्यूचर्स, या async/await का उपयोग करना)।
आधुनिक ऑपरेटिंग सिस्टम और रनटाइम्स, थ्रेड्स, प्रोसेस और इवेंट लूप्स जैसे कॉनकरेंसी प्राइमिटिव प्रदान करते हैं। इन दृष्टिकोणों के बीच व्यापार-बंद को समझना इंजीनियरों के लिए एक मूलभूत कौशल है।
एक गहरी गोता के लिए अभियोजकता मॉडल में, ]]Wikipedia article on concurrency] को पढ़ने पर विचार करें।
बहुधापन
मल्टीथ्रेडिंग एक विशिष्ट कार्यान्वयन है, जहां एक एकल प्रक्रिया एकाधिक धागे को स्पॉन करती है जो समान स्मृति स्थान और संसाधनों को साझा करती है। प्रत्येक धागे का अपना खुद का कॉल स्टैक और प्रोग्राम काउंटर होता है, लेकिन प्रक्रिया के भीतर सभी धागे साझा ढेर स्मृति को पढ़ और लिख सकते हैं। यह साझा एक्सेस एक ताकत और एक भेद्यता दोनों है।
बहुधागामी के प्रमुख पहलुओं में शामिल हैं:
- ]Thread निर्माण और प्रबंधन [ - धागे को स्पष्ट रूप से बनाया जा सकता है या ओवरहेड से बचने के लिए थ्रेड पूल द्वारा प्रबंधित किया जा सकता है।
- ]Thread lifecycle – नए, रनेबल, अवरुद्ध, प्रतीक्षा, समयबद्ध प्रतीक्षा और समाप्त जैसे राज्यों।
- Context switching - OS धागे के बीच स्विच करता है, जिससे कुछ ओवरहेड होता है।
- ]Shared resources – डाटा संरचनाओं, फ़ाइलों, और कनेक्शन समवर्ती पहुँच से संरक्षित किया जाना चाहिए।
बहुधा पढ़ने विशेष रूप से सीपीयू-बाउन कार्यों के लिए उपयोगी है जो समानांतर (जैसे, छवि प्रसंस्करण, वैज्ञानिक सिमुलेशन) और आई / ओ-बाउन्ड कार्यों के लिए जहां धागे डेटा के लिए इंतजार कर सकते हैं जबकि अन्य काम जारी रखते हैं (जैसे, वेब सर्वर)। हालांकि, गलत उपयोग से रेस की स्थिति, डेडलॉक्स और असंगत राज्य जैसे सूक्ष्म कीड़े हो सकते हैं।
जावा मल्टीथ्रेडिंग पर व्यावहारिक मार्गदर्शन के लिए, Oracle जावा Concurrency ट्यूटोरियल] एक उत्कृष्ट संसाधन है।
Concurrency and Multithreading के बीच कुंजी अंतर
हालांकि अक्सर विनिमेय रूप से उपयोग किया जाता है, समवर्तीता और बहुधापन अलग अवधारणाएं हैं। नीचे दी गई तालिका मुख्य अंतर (एक semantic सूची का उपयोग करके) को उजागर करती है।
- Concurrency एक प्रणाली की एक संपत्ति है - यह एक साथ प्रगति में कई कार्यों को संभाल सकता है। इसे बहुधागामी, बहुसंसाधन या अतुल्यकालिक तकनीकों के माध्यम से प्राप्त किया जा सकता है।
- Multithreading एक प्रोग्रामिंग तकनीक है जो एक प्रक्रिया के भीतर एकाधिक धागे का उपयोग करती है ताकि यह एक प्रक्रिया है।
- कंसर्रेंसी एक बार में कई कार्यों को संभालने के लिए प्रोग्राम्स को संरचनात्मक तरीके से केंद्रित है, जबकि मल्टीथ्रेडिंग एक निम्न-स्तरीय कार्यान्वयन विस्तार है।
- बहुधापन में साझा स्मृति शामिल है, जो दौड़ की स्थिति और स्मृति स्थिरता मुद्दों जैसी चुनौतियों को पेश करती है। एक उच्च स्तर पर आकस्मिकता (जैसे अभिनेता मॉडल) साझा राज्य से बच सकती है।
- एक प्रणाली सभी पर धागे का उपयोग किए बिना समवर्ती हो सकती है (उदाहरण के लिए, एक धागे के साथ घटना संचालित प्रोग्रामिंग)।
- सच समानांतरवाद को एकाधिक सीपीयू कोर की आवश्यकता होती है, लेकिन समय-सामान के माध्यम से एक कोर पर समवर्तीता को अनुकरण किया जा सकता है।
इंजीनियर्स के लिए सामान्य समतुल्यता और बहुधा प्रश्न
इंजीनियर अक्सर समवर्ती कार्यक्रमों और बहुधा कोड को डीबग करने के बारे में उनकी क्षमता पर परीक्षण किए जाते हैं। नीचे विस्तृत स्पष्टीकरण के साथ कई विस्तारित प्रश्न हैं।
1. आप दौड़ की स्थिति कैसे रोक सकते हैं?
एक रेस की स्थिति तब होती है जब दो या अधिक धागे साझा डेटा को समवर्ती रूप से एक्सेस करते हैं और अंतिम परिणाम उनके निष्पादन के समय पर निर्भर करता है। रोकथाम रणनीतियों में शामिल हैं:
- Mutexes (locks)] - यह सुनिश्चित करने के लिए कि केवल एक धागा एक समय में एक महत्वपूर्ण अनुभाग में प्रवेश कर सकता है।
- ]Semaphores - संसाधनों के एक परिमित पूल तक पहुंच को नियंत्रित करता है।
- Atomic operation – सरल अद्यतन के लिए CPU-level निर्देशों (जैसे, तुलना और स्वैप) का उपयोग करें।
- ]Read-write locks - समवर्ती पढ़ने की अनुमति देते हैं लेकिन अनन्य लिखते हैं।
- ]Immutable ऑब्जेक्ट - साझा डेटा जो पूरी तरह से दौड़ को खत्म नहीं कर सकता है।
- ]Thread-local Storage – प्रत्येक धागे को डेटा की अपनी प्रतिलिपि दें।
तंत्र की पसंद साझा संसाधन की प्रकृति और आवश्यक प्रदर्शन विशेषताओं पर निर्भर करती है।
2. क्या है, क्या है?
डेडलॉक एक ऐसी स्थिति है जहां दो या दो से अधिक धागे एक दूसरे धागे से आयोजित संसाधन के लिए इंतजार कर रहे हैं, जिससे सभी अनिश्चित काल तक चलते हैं। डेडलॉक के लिए क्लासिक स्थितियां हैं: पारस्परिक बहिष्कार, पकड़ और प्रतीक्षा, कोई प्रीम्पशन नहीं, और परिपत्र प्रतीक्षा। बचाव तकनीकों में शामिल हैं:
- Resource hierarchy – संसाधनों के लिए एक वैश्विक आदेश आवंटित और उस क्रम में ताले प्राप्त करने के लिए धागे की आवश्यकता है।
- Timeouts – एक निश्चित अवधि के बाद एक ताला जारी और फिर से प्रयास करें।
- Dadlock का पता लगाना – मृतकों को होने की अनुमति देते हैं लेकिन उन्हें तोड़ने का एक तंत्र है (जैसे, एक धागे को समाप्त करना)।
- ]Lock-free प्रोग्रामिंग [ - पूरी तरह से ताले से बचने के लिए परमाणु संचालन का उपयोग करें।
इंजीनियर्स को सावधानीपूर्वक लॉक अधिग्रहण पैटर्न डिजाइन करना चाहिए और संभावित डेडलॉक्स को पकड़ने के लिए भारी सहमति के तहत परीक्षण करना चाहिए।
3. थ्रेड सिंक्रनाइज़ेशन प्रभाव प्रदर्शन कैसे करता है?
सिंक्रनाइज़ेशन डेटा स्थिरता सुनिश्चित करता है लेकिन ओवरहेड को लागू करता है। प्रमुख प्रदर्शन व्यापार-बंद हैं:
- Contention - जब कई धागे एक ही लॉक प्राप्त करने की कोशिश करते हैं, तो वे निष्पादन को क्रमबद्ध करते हैं, समानांतरवाद को कम करते हैं।
- Context switching - ऐसे धागे जो ताले पर ब्लॉक करते हैं, OS को स्विच करने के लिए संदर्भों को मजबूर करते हैं, जो महंगा है।
- Cache coherency – साझा करने के लिए mutable डेटा invalidates सीपीयू कैश, स्मृति यातायात में वृद्धि.
- ]Granularity - मोटे अनाज वाले ताले (जैसे, एक वैश्विक ताला) सरल शुद्धता लेकिन सीमा की कमी; ठीक-ग्रेन किए गए ताले (जैसे, प्रति-element लॉक) समानता में सुधार करते हैं लेकिन जटिलता और जोखिम वाले डेडलॉक को बढ़ाते हैं।
लॉक स्ट्रिपिंग, रीड-राइट लॉक्स और समवर्ती डेटा संरचनाओं (जैसे, ]]) जैसी आधुनिक रणनीतियों को सुरक्षा और गति को संतुलित करने में मदद करता है।
4. जावा / सी # में कीवर्ड को समझाएं। यह क्या समस्या हल करती है?
]] कीवर्ड यह सुनिश्चित करता है कि एक चर का मूल्य हमेशा मुख्य स्मृति से पढ़ा जाता है और लिखा जाता है, जो थ्रेड-स्थानीय कैशिंग को रोकता है। यह दृश्यता समस्या को हल करता है: एक अस्थिर चर के लिए लिखना तुरंत सभी धागे के लिए दिखाई देता है। हालांकि, ]नहीं मिश्रित संचालन के लिए परमाणुता की गारंटी (जैसे, ]). यह झंडे या राज्य संकेतकों के लिए उपयोगी है जो थ्रेड निष्पादन को नियंत्रित करने के लिए उपयोग किया जाता है।
5. एक धागा पूल क्या है और कब आप एक का उपयोग करना चाहिए?
एक थ्रेड पूल पूर्व निर्मित धागे का एक संग्रह है जिसे कार्यों को निष्पादित करने के लिए पुन: उपयोग किया जा सकता है। लाभ में थ्रेड निर्माण और फाड़ना, बेहतर प्रतिक्रिया समय और नियंत्रित संसाधन उपयोग से ओवरहेड को कम करना शामिल है। थ्रेड पूल कई अल्पकालिक या आई / ओ-बाउंड कार्यों को संभालने के लिए आदर्श हैं, जैसे कि HTTP अनुरोधों की सेवा करना। आम कार्यान्वयन में जावा में ]] और ]]]]] शामिल हैं।
ध्यानपूर्वक पूल को आकार देने के लिए लिया जाना चाहिए: सीपीयू कोर को कम करने के लिए बहुत कम धागे, जबकि बहुत से लोग अत्यधिक संदर्भ स्विचन और स्मृति खपत का कारण बनते हैं।
6. अम्दाहल का कानून क्या है, और यह बहुधा प्रदर्शन के लिए क्यों मायने रखता है?
Amdahl कानून का कहना है कि कई प्रोसेसरों का उपयोग करके एक कार्यक्रम की गति कार्यक्रम के अनुक्रमिक हिस्से तक सीमित है। गणितीय रूप से: Speedup = 1 / ((1 - P) + P/N) , जहां P समानांतर भिन्न है और N प्रोसेसर की संख्या है। उदाहरण के लिए, यदि कोड का 10% क्रमिक रूप से रन करना चाहिए, तो अनंत कोर के साथ अधिकतम गति 10x है। यह कानून इंजीनियरों को सीरियल बोतलनेस (जैसे सावधान एल्गोरिदम डिजाइन और डिकॉपिंग के माध्यम से) को कम करने की याद दिलाता है।
इंजीनियर्स के लिए सर्वश्रेष्ठ अभ्यास
मजबूत और उच्च प्रदर्शन समवर्ती कोड लिखने के लिए, इन दिशानिर्देशों का पालन करें:
- ]Prefer high-level अमूर्तion – कच्चे धागे प्रबंधन के बजाय निष्पादक सेवाओं, धागा पूल और समवर्ती संग्रह का उपयोग करें।
- ]Immutable data first – जहां भी संभव हो साझा mutable राज्य से बचने के लिए। immutable वस्तुओं या प्रतिलिपि-on-write पैटर्न का प्रयोग करें।
- ]]]] - केवल महत्वपूर्ण संचालन करने के लिए आवश्यक कम से कम समय के लिए ताले पकड़ो।
- ]]]]]]]]]]]] ][]]]]]]]]]]]]]]]]]]]]]]]]]]]][[[[[FLT[[[[]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]][[[[[[[[[[[[[[[[[[FLT[FLT[[[[[[[[[[[[[FLT:
- ]वास्तविक सहमति के तहत टेस्ट - रेस, डेडलॉक्स और डेटा भ्रष्टाचार का पता लगाने के लिए तनाव परीक्षण उपकरण और थ्रेड सैनिटाइज़र का उपयोग करें।
- Document सिंक्रनाइज़ेशन contract[] - स्पष्ट रूप से राज्य जो चर धागा सुरक्षित हैं और कौन से ताले उन्हें सुरक्षित रखते हैं।
- Consider विकल्प - साझा राज्य को कम करने के लिए अभिनेता मॉडल (जैसे, अक्का), संदेश गुजरना, या प्रतिक्रियाशील धाराओं की जांच करें।
अंतर्निहित प्लेटफ़ॉर्म (जैसे जावा मेमोरी मॉडल, POSIX थ्रेड्स, या पायथन GIL) की पूरी समझ विषम व्यवहार को डीबगिंग के लिए अनिवार्य है।
निष्कर्ष
Concurrency and multithreading सिर्फ सैद्धांतिक अवधारणाओं नहीं हैं; वे व्यावहारिक उपकरण हैं जो सीधे सॉफ्टवेयर की गुणवत्ता को प्रभावित करते हैं। दौड़ की स्थिति की पहचान करने के लिए सीखने से, डेडलॉक को रोकने और संसाधन सामग्री का प्रबंधन करने के द्वारा, इंजीनियर सिस्टम को डिजाइन कर सकते हैं जो दोनों तेज और विश्वसनीय हैं। इस लेख में साक्षात्कार में गहरे अध्ययन के लिए एक प्रारंभिक बिंदु का प्रतिनिधित्व किया गया है। बहु-कोर और वितरित कंप्यूटिंग विकसित होने के कारण प्रत्येक इंजीनियर के लिए समवर्ती निष्पादन के बारे में एक महत्वपूर्ण कौशल रहेगा।
आगे पढ़ने के लिए, Geeks concurrency article] और ]]] पर व्यापक गाइड बाल्डंग ]]]