धागे के आधार पर एक पर प्रक्रियाओं के आधार पर समरूपता के लिए मॉडल का उपयोग करने के मुख्य लाभ क्या हैं और बाद में कौन से संदर्भ उपयुक्त हैं?Concurrency: प्रक्रिया बनाम थ्रेड
उत्तर
दोष-सहिष्णुता और मापनीयता प्रक्रिया बनाम थ्रेड का उपयोग करने का मुख्य लाभ हैं।
एक ऐसी प्रणाली जो साझा स्मृति या किसी अन्य प्रकार की तकनीक पर निर्भर करती है जो केवल थ्रेड का उपयोग करते समय उपलब्ध होती है, जब आप कई मशीनों पर सिस्टम को चलाने के लिए बेकार रहेंगे। जल्द या बाद में आपको विभिन्न प्रक्रियाओं के बीच संवाद करने की आवश्यकता होगी।
प्रक्रियाओं का उपयोग करते समय आपको संदेशों के माध्यम से संचार से निपटने के लिए मजबूर किया जाता है, उदाहरण के लिए, एरलांग संचार को संभालने का तरीका है। डेटा साझा नहीं किया जाता है, इसलिए डेटा भ्रष्टाचार का कोई खतरा नहीं है।
प्रक्रियाओं का एक अन्य लाभ यह है कि वे क्रैश हो सकते हैं और आप ज्ञान में अपेक्षाकृत सुरक्षित महसूस कर सकते हैं कि आप उन्हें फिर से शुरू कर सकते हैं (यहां तक कि नेटवर्क होस्टों में भी)। हालांकि, अगर कोई थ्रेड क्रैश हो जाता है, तो यह पूरी प्रक्रिया को क्रैश कर सकता है, जो आपके पूरे एप्लिकेशन को कम कर सकता है। उदाहरण के लिए: यदि एक एरलांग प्रक्रिया दुर्घटनाग्रस्त हो जाती है, तो आप केवल उस फोन कॉल को खो देंगे, या वह वेबरेक्वेस्ट इत्यादि। पूरा आवेदन नहीं।
यह सब कहकर, ओएस प्रक्रियाओं में भी कई कमियां होती हैं जो उन्हें उपयोग करने में कठोर बनाती हैं, इस तथ्य की तरह कि यह हमेशा एक नई प्रक्रिया को जन्म देने के लिए लेता है। हालांकि, एर्लांग की प्रक्रियाओं की अपनी धारणा है, जो बेहद हल्के हैं।
इसके साथ ही, यह चर्चा वास्तव में शोध का विषय है। यदि आप अधिक जानकारी प्राप्त करना चाहते हैं, तो आप जो आर्मस्ट्रांग का पेपर गलती-सहनशील प्रणालियों पर दे सकते हैं] 1 एक पढ़ा गया है, यह एर्लांग और दर्शन के बारे में बहुत कुछ बताता है।
* ओएस प्रक्रियाओं में कई कमियां होती हैं जो उन्हें उपयोग करने में कठोर बनाती हैं, इस तथ्य की तरह कि यह हमेशा एक नई प्रक्रिया को जन्म देने के लिए लेता है। * यह उपयोग में ओएस पर भारी निर्भर करता है। लिनक्स में एक प्रक्रिया को फोर्किंग करना धागे को कम करने के समान होता है क्योंकि लिनक्स में प्रक्रियाओं और धागे के बीच कोई अंतर नहीं होता है। दो धागे केवल दो प्रक्रियाएं हैं जो मेमोरी मैप साझा करती हैं। यह बहुत तेज़ है। –
प्रक्रिया-आधारित मॉडल का उपयोग करने का नुकसान यह है कि यह धीमा हो जाएगा। आपको अपने कार्यक्रम के समवर्ती हिस्सों के बीच डेटा कॉपी करना होगा।
थ्रेड-आधारित मॉडल का उपयोग करने का नुकसान यह है कि आपको शायद यह गलत लगेगा। यह मतलब हो सकता है, लेकिन यह सच है - मुझे धागे के आधार पर कोड दिखाएं और मैं आपको एक बग दिखाऊंगा। मुझे थ्रेड कोड में बग मिली है जो 10 वर्षों के लिए "सही" चलाती है।
प्रक्रिया-आधारित मॉडल का उपयोग करने के फायदे कई हैं। पृथक्करण आपको प्रोटोकॉल और औपचारिक संचार पैटर्न के संदर्भ में सोचने के लिए मजबूर करता है, जिसका अर्थ यह है कि आप इसे अधिक सही मानेंगे। एक दूसरे के साथ संवाद करने की प्रक्रिया कई मशीनों में फैलाना आसान है। एकाधिक समवर्ती प्रक्रियाएं एक प्रक्रिया को दूसरों को क्रैश किए बिना क्रैश करने की अनुमति देती हैं।
थ्रेड-आधारित मॉडल का उपयोग करने का लाभ यह है कि यह तेज़ है।
यह स्पष्ट हो सकता है कि मैं इनमें से कौन सा पसंद करता हूं, लेकिन यदि यह नहीं है: प्रक्रियाएं, सप्ताह के हर दिन और दो बार रविवार को। धागे बहुत कठिन हैं: मैंने कभी भी किसी से मुलाकात नहीं की है जो सही बहु थ्रेडेड कोड लिख सकता है; वे जो दावा करते हैं कि आमतौर पर अंतरिक्ष के बारे में पर्याप्त जानकारी नहीं है।
निश्चित रूप से, जॉन स्कीट थ्रेडेड कोड लिख सकता है। जबकि आप सही हैं कि ज्यादातर लोग नहीं कर सकते (मैं निश्चित रूप से नहीं कर सकता!) ऐसे लोग हैं जो करते हैं। – Brad
आपको विभिन्न प्रक्रियाओं के बीच साझा करने के लिए "स्मृति की प्रतिलिपि" की आवश्यकता नहीं है। – valdo
लेकिन एर्लांग-प्रोसेसिस ओएस-प्रोसेस के समान नहीं है। Erlang-Processes अधिक हल्के वजन है और ओएस-थ्रेड की तुलना में बेहतर प्रदर्शन है। – Jonas
इस मामले में प्रक्रियाएं एक दूसरे से अधिक स्वतंत्र होती हैं, जबकि थ्रेड कुछ संसाधन साझा करते हैं उदा। याद। लेकिन एक सामान्य मामले में थ्रेड प्रक्रियाओं की तुलना में अधिक हल्के वजन होते हैं।
एरलांग प्रक्रिया ओएस प्रक्रियाओं की तरह ही नहीं है। Erlang प्रक्रियाएं बहुत हल्के वजन वाले हैं और एर्लांग में एक ही ओएस थ्रेड के भीतर कई एर्लांग प्रक्रियाएं हो सकती हैं।Technically why is processes in Erlang more efficient than OS threads?
सबसे पहले देखें और सबसे महत्वपूर्ण, प्रक्रियाओं अधिकांशतः इस बात उनकी स्मृति नियंत्रित किया जाता है में धागे से अलग:
Process = n*Thread + memory region (n>=1)
प्रक्रियाओं को अपने स्वयं के अलग स्मृति है। प्रक्रियाओं में एकाधिक धागे हो सकते हैं।
प्रक्रियाओं को ऑपरेटिंग सिस्टम स्तर पर एक-दूसरे से पृथक किया जाता है। थ्रेड प्रक्रिया में अपने साथियों के साथ अपनी याददाश्त साझा करते हैं। (यह अक्सर अवांछित होता है। इसका समाधान करने के लिए वहां पुस्तकालय और विधियां हैं, लेकिन आमतौर पर ऑपरेटिंग सिस्टम थ्रेड पर कृत्रिम परत होती है।)
स्मृति की बात सबसे महत्वपूर्ण समझदार कारक है, क्योंकि इसमें कुछ प्रभाव हैं :
- प्रक्रियाओं के बीच डेटा का आदान-प्रदान थ्रेड के बीच धीमा है। प्रक्रिया अलगाव को तोड़ने के लिए हमेशा कर्नेल कॉल और मेमोरी रीमेपिंग की कुछ भागीदारी की आवश्यकता होती है।
- प्रक्रियाओं की तुलना में थ्रेड अधिक हल्के होते हैं। ऑपरेटिंग सिस्टम को संसाधनों को आवंटित करना और प्रत्येक प्रक्रिया के लिए स्मृति प्रबंधन करना है।
- प्रक्रियाओं का उपयोग करके आपको स्मृति अलगाव और सिंक्रनाइज़ेशन मिल जाता है। धागे के बीच साझा स्मृति तक पहुंच के साथ आम समस्याएं आपको चिंता नहीं करती हैं। चूंकि आपको प्रक्रियाओं के बीच डेटा साझा करने के लिए एक विशेष प्रयास करना है, इसलिए आप इसके साथ स्वचालित रूप से सिंक हो जाएंगे।
प्रक्रियाओं का उपयोग करके आपको अच्छा (या परम) encapsulation देता है। चूंकि अंतर प्रक्रिया संचार को विशेष प्रयास की आवश्यकता होती है, इसलिए आपको एक स्वच्छ इंटरफेस को परिभाषित करने के लिए मजबूर किया जाएगा। मुख्य निष्पादन योग्य से अपने आवेदन के कुछ हिस्सों को तोड़ना एक अच्छा विचार है। शायद आप इस तरह निर्भरताओं को विभाजित कर सकते हैं। उदा। Process_RobotAi <-> Process_RobotControl
एआई नियंत्रण कक्ष की तुलना में काफी अलग निर्भरता होगी। इंटरफ़ेस सरल हो सकता है: Process_RobotAI --DriveXY--> Process_RobotControl
। शायद आप रोबोट प्लेटफॉर्म बदल सकते हैं। आपको केवल उस सरल इंटरफेस के साथ एक नया RobotControl
निष्पादन योग्य लागू करना होगा। आपको अपने एआई घटक में कुछ भी स्पर्श या फिर भी कंपाइल करने की ज़रूरत नहीं है।
यह भी इसी कारण से, अधिकांश मामलों में संकलन को तेज करेगा।
संपादित करें: बस पूर्णता के लिए मैं दूसरों को याद दिलाता हूं कि दूसरों ने मुझे याद दिलाया है: एक क्रैशिंग प्रक्रिया आपके पूरे एप्लिकेशन को क्रैश नहीं करती है।
जनरल में:
- कुछ अत्यधिक समवर्ती या synchronuous, एन के साथ एक एल्गोरिथ्म >> 1 उदाहरणों समानांतर और डेटा साझा करने, उपयोग धागे में चल तरह बनाना चाहते हैं।
- एक ऐसे सिस्टम के साथ एक सिस्टम है जिसमें डेटा या एल्गोरिदम साझा करने की आवश्यकता नहीं है, न ही वे अक्सर डेटा का आदान-प्रदान करते हैं, प्रक्रियाओं का उपयोग करते हैं। यदि आप इंटर प्रोसेस संचार के लिए आरपीसी लाइब्रेरी का उपयोग करते हैं, तो आपको कोई अतिरिक्त लागत पर नेटवर्क-वितरित समाधान मिलता है।
1 और 2 चरम और नो-ब्रेनर परिदृश्य हैं, बीच में सबकुछ व्यक्तिगत रूप से तय किया जाना चाहिए।
आईपीसी/आरपीसी का उपयोग करने वाली प्रणाली के अच्छे (या भयानक) उदाहरण के लिए, ros पर एक नज़र डालें।
- 1. Concurrency Runtime
- 2. जावा थ्रेड बनाम ओएस थ्रेड
- 3. थ्रेड बनाम कोर
- 4. प्रोसेस बनाम थ्रेड
- 5. लाइटवेट बनाम हेवीवेट प्रक्रिया
- 6. प्रक्रिया थ्रेड नाम
- 7. एकाधिक कांटा() Concurrency
- 8. थ्रेड पूल बनाम थ्रेड स्पॉइंग
- 9. थ्रेड आईडी बनाम थ्रेड हैंडल
- 10. अजाक्स concurrency
- 11. HttpWebRequest पर Concurrency सीमा
- 12. थ्रेड पूल बनाम कई व्यक्तिगत थ्रेड
- 13. विधि बनाम फंक्शन बनाम प्रक्रिया बनाम कक्षा?
- 14. थ्रेड बनाम थ्रेडपूल
- 15. थ्रेड बनाम थ्रेडिंग
- 16. पृष्ठभूमिवर्कर बनाम पृष्ठभूमि थ्रेड
- 17. हैंडलर बनाम थ्रेड
- 18. एसिंक्रोनस प्रतिनिधि बनाम थ्रेड
- 19. थ्रेड। स्टार्ट() बनाम BackgroundWorker
- 20. थ्रेड बनाम pthread perl
- 21. थ्रेड। स्टार्ट() बनाम ThreadPool.QueueUserWorkItem()
- 22. थ्रेड बनाम Async
- 23. PARTIAL_WAKE_LOCK बनाम SCREEN_DIM_WAKE_LOCK डाउनलोड थ्रेड
- 24. PHP और Concurrency
- 25. सी # Concurrency और एजेंट
- 26. NHibernate Concurrency समस्या
- 27. Concurrency समांतरता नहीं है?
- 28. लुसेन.NET में Concurrency।
- 29. प्रक्रिया। किल() बनाम प्रक्रिया। स्टार्ट ("टास्ककिल", ...)
- 30. decaf threads बनाम बूस्ट थ्रेड बनाम omnithreads
क्या आपका मतलब erlang प्रक्रियाओं या ओएस प्रक्रियाओं का मतलब है? – ZeissS
मेरा मतलब ओएस प्रक्रिया है। – Kummo