2012-08-14 11 views
16

सवाल Automatically release mutex on crashes in Unix 2010 में पीठ पर एक टिप्पणी में, jilles ने दावा किया: क्योंकि glibc खतरनाक शॉर्टकट लेताग्लिब/एनपीटीएल/लिनक्स मजबूत म्यूटेक्स में रेस हालत?

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

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

कारण मैं पूछता हूं और मुझे दिलचस्पी है कि यह एक ही लिनक्स मजबूत-म्यूटेक्स आदिम पर बनाए गए अपने स्वयं के कार्यान्वयन की शुद्धता के लिए प्रासंगिक है।

+3

ओएमजी, त्रुटि नाम में एनईआरडी है –

+0

ऐसा लगता है कि पुराने वीएमए आधारित दृष्टिकोण में कुछ समस्याएं थीं; http://www.kernel.org/doc/Documentation/robust-futexes.txt। हालांकि, अगर मैं इसे सही ढंग से पढ़ता हूं तो सूची उपयोगकर्ता स्पेस मेमोरी में रखी जाती है - तो अगर आप स्मृति दूषित हैं तो आप क्या कर सकते हैं? हालांकि इसे साझा स्मृति को दूषित करने के विशेष मामले के रूप में देखा जा सकता है। – nos

+0

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

उत्तर

6

फ्रीबीएसडी पथ्रेड डेवलपर डेविड जू द्वारा दौड़ का विवरण: http://lists.freebsd.org/pipermail/svn-src-user/2010-November/003668.html

मुझे नहीं लगता कि दौड़ के लिए मुनमैप/एमएमएपी चक्र कड़ाई से जरूरी है। साझा स्मृति का टुकड़ा भी एक अलग उपयोग के लिए रखा जा सकता है। यह असामान्य लेकिन मान्य है।

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

+1

मेमोरी को बिना किसी अनैप किए किए एक अलग उपयोग में डालने के बारे में समस्या को पकड़ने के लिए धन्यवाद। यह 'pthread_mutex_destroy' में किसी प्रकार का सिंक्रनाइज़ेशन डालकर टालने योग्य होना चाहिए ... –

+0

दरअसल, मैं सवाल करता हूं कि उस मुद्दे से बचना संभव है या नहीं। उसी प्रक्रिया में इसे निश्चित रूप से टाला जा सकता है, लेकिन कई प्रक्रियाओं के बीच, "किसी भी प्रक्रिया के लिए इंतजार करने के लिए अभी भी म्यूटेक्स को ड्रॉप करने के लिए एक पुरानी लंबित पॉइंटर हो सकती है" का कोई स्पष्ट तरीका नहीं है। मुझे नहीं लगता कि यह मुद्दा "नया मैपिंग" मुद्दा जितना गंभीर है (क्योंकि यह केवल एक विशेष उद्देश्य के मामले को प्रभावित करता है, एक अलग उद्देश्य के लिए समान साझा स्मृति का पुन: उपयोग करता है), लेकिन यह अभी भी काफी परेशान है। –

+1

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

8

मुझे लगता है कि मुझे दौड़ मिली है, और यह वास्तव में बहुत बदसूरत है। यह इस प्रकार है:

थ्रेड ए ने मजबूत म्यूटेक्स रखा है और इसे खोल दिया है। मूल प्रक्रिया है:

  1. इसे थ्रेड के मजबूत सूची शीर्षलेख के "लंबित" स्लॉट में रखें।
  2. वर्तमान धागे द्वारा आयोजित मजबूत म्यूटेक्स की लिंक की गई सूची से इसे हटा दें।
  3. म्यूटेक्स अनलॉक करें।
  4. धागे की मजबूत सूची शीर्षलेख के "लंबित" स्लॉट को साफ़ करें।
समस्या

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

समाधान चरण 2 और इसके बाद के संस्करण 4 के बीच mmap/munmap पर एक वैश्विक ताला धारण करने के लिए है, बाधा मुद्दा इस सवाल का मेरा उत्तर में वर्णित करने के लिए अपने समाधान के रूप में बिल्कुल वैसा ही:

Can a correct fail-safe process-shared barrier be implemented on Linux?

+0

@r क्या मैं इसे सही समझता हूं कि आप केवल इस समस्या के आसपास काम कर सकते हैं जब आप अपना खुद का म्यूटेक्स कार्यान्वयन लिख रहे हैं और 'mmap' /' munmap' कॉल पर नियंत्रण रखते हैं (ताकि आप चरण 2 और 4 के बीच ताले डाल सकें)? इसका मतलब है कि POSIX (pthreads) मजबूत म्यूटेक्स हमेशा इस समस्या से पीड़ित होंगे? क्या इसे लिनक्स पर एक पर्थ्रेड बग माना जाना चाहिए? साथ ही, जब आप (मजबूत या गैर-मजबूत?) धारक वैश्विक एमएमएपी लॉक विफल रहता है तो आप क्या करते हैं? – nh2

+0

हां यह glibc में एक बग है। Https://sourceware.org/bugzilla/show_bug.cgi?id=14485 –

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