जावा में म्यूटेक्स और सेमाफोर क्या है? मुख्य अंतर क्या है?


जवाबों:


115

सेमाफोर को गिना जा सकता है, जबकि म्यूटेक्स केवल 1 तक गिन सकता है।

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

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


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

1
@finnw, सामान्य रूप से दो प्रकार के म्यूटेक्स, पुनरावर्ती और गैर-पुनरावर्ती हैं। क्या जावा डिफ़ॉल्ट रूप से पुनरावर्ती प्रकार का उपयोग करता है?
edA-qa मोर्ट-ओरा-वाई

2
@ eda-qa mort-ora-y, शब्द "म्यूटेक्स" का उपयोग जावा वीएम या एपीआई युक्ति में नहीं किया गया है, इसलिए मैं यह मान रहा हूं कि यह प्रत्येक ऑब्जेक्ट में निर्मित मॉनिटर को संदर्भित करता है, जो कि म्यूटेक्स नामक Win32 ऑब्जेक्ट के समान है। । एक ही में लागू होता है ReentrantLock। ये सभी पुनरावर्ती हैं। मुझे गैर-पुनरावर्ती म्यूटेक्स के किसी भी "वास्तविक दुनिया" उदाहरणों के बारे में पता नहीं है (मैंने उन्हें केवल पाठ्यपुस्तकों में देखा है) इसलिए मैंने उन पर विचार नहीं किया।
14:14 बजे

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

1
C ++ 11 (C ++ 0x) मानक में, म्यूटेक्स गैर-पुनरावर्ती है। वे उन लोगों के लिए एक अलग 'recursive_mutex' भी प्रदान करते हैं जिनकी आवश्यकता है। मुझे पता है कि हम यहां जावा की बात कर रहे हैं, लेकिन फिर हममें से कई अब भाषाओं में कोड करते हैं।
आदित्य कुमार पाण्डेय

139

दुर्भाग्य से हर कोई सेमीफोर और म्यूटेक्स के बीच सबसे महत्वपूर्ण अंतर से चूक गया है; " स्वामित्व " की अवधारणा ।

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

म्यूटेक्स भी प्राथमिकता वंशानुक्रम (जो प्राथमिकता उलटा समस्या के साथ मदद कर सकता है) और पुनरावृत्ति (गतिरोध के एक प्रकार को समाप्त) का समर्थन कर सकता है।

यह भी बताया जाना चाहिए कि "बाइनरी" सेमाफोर और "काउंटिंग / जनरल" सेमाफोर हैं। जावा का सेमाफोर एक गिनती का सेमाफोर है और इस तरह इसे एक से अधिक मूल्य के साथ आरंभीकृत करने की अनुमति मिलती है (जबकि, जैसा कि बताया गया है, एक म्यूटेक्स केवल एक की एक वैचारिक गिनती है)। इसकी उपयोगिता अन्य पदों में इंगित की गई है।

इसलिए सारांशित करने के लिए, जब तक कि आपके पास प्रबंधन करने के लिए कई संसाधन न हों, मैं हमेशा सेमीफोर पर म्यूटेक्स की सिफारिश करूंगा।


1
फेबाहस का उत्तर काफी महत्वपूर्ण है - म्यूटेक्स थ्रेड को चेक करने का प्रयास करता है कि म्यूटेक्स वास्तव में इसका मालिक है। मैंने इसे एक साक्षात्कार प्रश्न के रूप में लिया है, इसलिए इसे याद रखने की कोशिश कर रहा हूं।
andrew pate

40

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

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

संक्षेप में, मुख्य अंतर यह है कि एक ही बार में कितने थ्रेड्स संसाधन प्राप्त करने की अनुमति दी जाती है?

  • म्यूटेक्स - एक।
  • सेमाफोर - इसका DEFINED_COUNT, (जितने भी सेमाफोर काउंट हैं)

8

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



3

एक म्यूटेक्स को अक्सर बाइनरी सेमाफोर के रूप में जाना जाता है। जब तक किसी भी गैर-शून्य गणना के साथ एक अर्धचंद्र बनाया जा सकता है, एक म्यूटेक्स वैचारिक रूप से 1 की ऊपरी गिनती वाला एक सेफ़ोर है।



1

सेमाफोर :

एक गिनती का सेमाफोर। वैचारिक रूप से, एक सेमाफोर परमिट का एक सेट रखता है। acquire()यदि कोई परमिट उपलब्ध होने तक आवश्यक हो, तो प्रत्येक ब्लॉक लेता है और फिर लेता है। प्रत्येक release()एक परमिट जोड़ता है, संभवतः एक अवरोधक ब्रीफ़र जारी करता है। हालाँकि, कोई वास्तविक परमिट ऑब्जेक्ट का उपयोग नहीं किया जाता है; सेमाफोर बस उपलब्ध संख्या की एक गणना रखता है और तदनुसार कार्य करता है।

सेमाफोर का उपयोग अक्सर थ्रेड्स की संख्या को सीमित करने के लिए किया जाता है, जो कुछ (भौतिक या तार्किक) संसाधन तक पहुंच सकता है

जावा में बिल्ट-इन म्यूटेक्स एपीआई नहीं है। लेकिन इसे बाइनरी सेमाफोर के रूप में लागू किया जा सकता है।

एक सेमाफोर एक को इनिशियलाइज़ किया जाता है, और जिसका उपयोग इस तरह किया जाता है कि इसमें केवल एक ही परमिशन उपलब्ध हो, एक पारस्परिक अपवर्जन लॉक के रूप में काम कर सकता है। इसे आमतौर पर बाइनरी सेमाफोर के रूप में जाना जाता है, क्योंकि इसमें केवल दो राज्य हैं: एक परमिट उपलब्ध है, या शून्य परमिट उपलब्ध है।

जब इस तरह से उपयोग किया जाता है, तो बाइनरी सेमाफोर के पास संपत्ति होती है (कई लॉक कार्यान्वयन के विपरीत), कि "लॉक" को मालिक के अलावा किसी धागे द्वारा जारी किया जा सकता है (क्योंकि सेमाफोर के पास स्वामित्व की कोई धारणा नहीं है) । यह कुछ विशेष संदर्भों में उपयोगी हो सकता है, जैसे कि डेडलॉक रिकवरी।

तो मुख्य अंतर सेमाफोर और Mutex के बीच:

  1. सेमीफोर ने थ्रेडहग परमिट के संसाधन तक पहुंचने के लिए थ्रेड्स की संख्या को प्रतिबंधित किया है। Mutex संसाधन तक पहुँचने के लिए केवल एक थ्रेड की अनुमति देता है।

  2. कोई भी धागा सेमाफोर का मालिक नहीं है। थ्रेड्स कॉल acquire()और release()विधियों द्वारा परमिट की संख्या को अपडेट कर सकते हैं । म्यूटेक्स को ताला पकड़े हुए धागे से ही अनलॉक किया जाना चाहिए।

  3. जब एक म्यूटेक्स का उपयोग स्थिति चर के साथ किया जाता है, तो एक निहित ब्रैकेटिंग होती है - यह स्पष्ट है कि कार्यक्रम के किस भाग को संरक्षित किया जा रहा है d। यह जरूरी नहीं कि एक सेमाफोर के लिए मामला है, जिसे समवर्ती प्रोग्रामिंग के लिए जाना जा सकता है - यह शक्तिशाली है, लेकिन एक असंरचित, अनिश्चित तरीके से उपयोग करना आसान है।


0

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

अब आप देख सकते हैं कि एक म्यूटेक्स सामान्य सेमाफोर का एक विशेष मामला है।


0

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

सेमाफोर में दो बिल्डर हैं:

Semaphore(int num)
Semaphore(int num, boolean come)

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


0

आप अतुलनीय की तुलना करते हैं, तकनीकी तौर पर एक सेमाफोर और म्यूटेक्स के बीच कोई अंतर नहीं है यह समझ में नहीं आता है। म्यूटेक्स आपके एप्लिकेशन लॉजिक में किसी भी नाम की तरह एक महत्वपूर्ण नाम है, इसका मतलब है कि आप "1" पर एक सेमाफोर को इनिशियलाइज़ करते हैं, इसका उपयोग आम तौर पर एक संसाधन या एक सुरक्षित चर की रक्षा के लिए किया जाता है ताकि आपसी बहिष्कार सुनिश्चित किया जा सके।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.