प्रतिनिधि इंटरव्यू विषय

सामान्य साक्षात्कार: Linux गैर-ओवरलैपिंग रेंजों के लिए Maple Tree का उपयोग क्यों करता है?

सामान्यकठिन
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

एक कर्नेल सबसिस्टम को लुकअप, इंसर्ट, डिलीट और गैप इटरेशन के साथ कई गैर-ओवरलैपिंग इंटीजर रेंजों को बनाए रखना चाहिए। Maple Tree की संरचना, समवर्ती एक्सेस (concurrent access), एलोकेशन बाधाओं और आप पुराने स्ट्रक्चर से माइग्रेशन को कैसे सत्यापित करेंगे, यह बताएं।

प्रॉम्प्ट और संदर्भ

एक कर्नेल सबसिस्टम को लुकअप, इंसर्ट, डिलीट और गैप इटरेशन के साथ कई गैर-ओवरलैपिंग इंटीजर रेंजों को बनाए रखना चाहिए। Maple Tree की संरचना, समवर्ती एक्सेस (concurrent access), एलोकेशन बाधाओं और आप पुराने स्ट्रक्चर से माइग्रेशन को कैसे सत्यापित करेंगे, यह बताएं।

Linux कर्नेल दस्तावेज़ Maple Tree को गैर-ओवरलैपिंग रेंजों के लिए अनुकूलित B-tree के रूप में वर्णित करता है। यह पॉइंट इंडेक्स और रेंज स्टोर करता है, सामान्य और सीमित एलोकेशन मोड का समर्थन करता है, और इसे इसके लॉक के तहत या RCU के साथ पढ़ा जा सकता है। साक्षात्कार केवल यह दावा करने के बजाय कि यह "रेड-ब्लैक ट्री से तेज़ है", लाइफसाइकिल, लॉकिंग और एलोकेशन सिमेंटिक्स का परीक्षण करता है।

साक्षात्कारकर्ता क्या मूल्यांकन करता है

साक्षात्कारकर्ता इंडेक्स मानों, रेंज मानों और गैप्स के बीच अंतर; नोड स्प्लिट्स, मर्ज और ऑपरेशन स्टेट का स्पष्टीकरण; सही GFP, लॉक, संदर्भ-गणना (reference-count) और RCU हैंडलिंग; माइग्रेशन के दौरान गैर-ओवरलैप, इटरेशन क्रम और डिलीशन सिमेंटिक्स का संरक्षण; और ऐसे बेंचमार्क जिनमें समवर्तीता (concurrency) और मेमोरी दबाव शामिल हैं, की तलाश करता है।

स्पष्टीकरण हेतु प्रश्न

रेंज मॉडल

पुष्टि करें कि क्या रेंज बंद (closed) हैं, क्या एंडपॉइंट अधिकतम इंटीजर हो सकते हैं, क्या आसन्न रेंज मर्ज हो सकती हैं, क्या गैप्स का कोई अर्थ है, और क्या एक इंडेक्स एक ऑब्जेक्ट को मैप करता है।

समवर्तीता और संदर्भ

पुष्टि करें कि क्या कॉल करने वाले प्रोसेस, इंटरप्ट या नॉन-स्लीपेबल संदर्भ में चलते हैं; क्या रीडर्स RCU का उपयोग कर सकते हैं; और क्या राइटर्स Maple Tree के आंतरिक लॉक या बाहरी लॉक पर निर्भर करते हैं।

माइग्रेशन लक्ष्य

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

30-सेकंड का उत्तर

"Maple Tree इंडेक्स और इंटरवल्स को पैक करने के लिए रेंज-उन्मुख B-tree नोड्स का उपयोग करता है, जो गैर-ओवरलैपिंग रेंजों और गैप प्रश्नों के लिए उपयुक्त है। सामान्य अपडेट GFP नियमों के साथ एलोकेट कर सकते हैं; एटॉमिक या नॉन-स्लीपेबल पाथ्स के लिए तैयार ऑपरेशन स्टेट और सीमित एलोकेशन की आवश्यकता होती है। रीडर्स लॉक का उपयोग कर सकते हैं, या RCU के तहत वे रीड सेक्शन छोड़ने से पहले एक ऑब्जेक्ट संदर्भ प्राप्त करते हैं। मैं इनवेरिएंट्स और एक डुअल-राइट तुलना स्थापित करूंगा, सीमाओं, गैप्स, डिलीशन, समवर्तीता और मेमोरी दबाव का परीक्षण करूंगा, फिर वास्तविक वर्कलोड लेटेंसी और फ़ुटप्रिंट की तुलना करूंगा।"

चरण-दर-चरण समाधान

चरण 1: रेंज इनवेरिएंट्स को परिभाषित करें

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

चरण 2: नोड्स और ऑपरेशन स्टेट को समझें

Maple Tree नोड्स कई पिवोट्स और स्लॉट्स स्टोर करते हैं, जिससे पॉइंटर की गहराई कम होती है और रेंज लोकैलिटी में सुधार होता है। जटिल इटरेशन या अपडेट वर्तमान स्थिति और ऑपरेशन संदर्भ के लिए ma_state का उपयोग कर सकते हैं; असमर्थित समवर्ती सीमाओं के पार स्टेट का पुन: उपयोग न करें।

चरण 3: एक एलोकेशन मोड चुनें

सामान्य अपडेट GFP_KERNEL के साथ एलोकेट कर सकते हैं और स्लीप कर सकते हैं। नॉन-स्लीपेबल पाथ्स के लिए प्री-एलोकेशन या सीमित GFP फ्लैग्स और तैयार ऑपरेशन स्टेट की आवश्यकता होती है। स्पिनलॉक रखते हुए या RCU रीड सेक्शन के अंदर कभी भी संभावित रूप से स्लीप करने वाले एलोकेशन पाथ को इनवोक न करें।

चरण 4: रीड कंसिस्टेंसी डिज़ाइन करें

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

चरण 5: रेंज और गैप लुकअप लागू करें

किसी इंडेक्स पर लुकअप कवरिंग रेंज लौटाता है या कोई मान नहीं लौटाता है। गैप इटरेशन पिछली प्रविष्टि के अंत से जारी रहता है ताकि पहली और अंतिम सीमाएं छूट न जाएं। इटरेटर अपने अगले इंडेक्स को रिकॉर्ड करता है और समवर्ती डिलीशन और अधिकतम इंडेक्स को संभालता है; "कोई मान नहीं" स्वचालित रूप से इटरेशन का अंत नहीं होता है।

text
lookup(index):
  lock_or_rcu_read()
  entry = maple_lookup(index)
  if entry != null:
    refcount_inc(entry.owner)
  unlock_or_rcu_read()
  return entry

find_gap(start, end):
  state = maple_state(start)
  while state.index <= end:
    range = maple_next_range(state)
    if gap_before(range, state.index): return [state.index, range.start - 1]
    state.index = range.end + 1
  return [state.index, end]

चरण 6: पुराने स्ट्रक्चर को माइग्रेट करें

डुअल-राइट या साइड इंडेक्स बनाते समय पुराने स्ट्रक्चर को सोर्स ऑफ ट्रुथ के रूप में रखें। यादृच्छिक सीमाओं, ओवरलैपिंग इंसर्ट्स, डिलीट के बाद के गैप्स और समवर्ती रीड्स की तुलना करें। एरर कोड, लॉक ऑर्डर, एलोकेशन विफलता और रिकवरी व्यवहार मेल खाने के बाद ही रीड पाथ को स्विच करें।

चरण 7: लाभ और रोलबैक को मान्य करें

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

मॉडल उत्तर

मैं पहले गैर-ओवरलैप, एंडपॉइंट और गैप इनवेरिएंट्स को परिभाषित करूंगा, फिर Maple Tree के रेंज-उन्मुख B-tree में रेंजों को स्टोर करूंगा। स्लीपेबल सामान्य पाथ GFP_KERNEL का उपयोग कर सकते हैं; नॉन-स्लीपेबल पाथ स्टेट तैयार करते हैं और लॉक या RCU सेक्शन के अंदर एलोकेशन से बचते हैं। रीडर्स या तो एक लॉक रखते हैं या उपयोग करने से पहले RCU के तहत एक ऑब्जेक्ट संदर्भ प्राप्त करते हैं, जिसमें रेफरेंस काउंटिंग वैल्यू लाइफटाइम की रक्षा करती है। मैं माइग्रेशन के दौरान डुअल-राइट करूंगा और लुकअप, गैप, डिलीट और सीमा व्यवहार की तुलना करूंगा, फिर पुराने कार्यान्वयन को रोलबैक पाथ के रूप में रखते हुए लेटेंसी, मेमोरी और एलोकेशन-विफलता मेट्रिक्स का उपयोग करके स्विच करूंगा।

सामान्य गलतियाँ

  • गलती: Maple Tree को पॉइंट-की मैप के रूप में मानना। → यह क्यों विफल होता है: इसका महत्व गैर-ओवरलैपिंग रेंजों और गैप ऑपरेशनों में है। → सुधार: एंडपॉइंट्स, कवरिंग लुकअप और गैप इटरेशन को परिभाषित करें।
  • गलती: स्पिनलॉक के तहत या RCU रीड सेक्शन में संभावित रूप से स्लीप करने वाले अपडेट को कॉल करना। → यह क्यों विफल होता है: GFP एलोकेशन संदर्भ वहां स्लीप नहीं कर सकता। → सुधार: प्री-एलोकेट करें, सही मोड चुनें और लॉक सीमाओं को अलग करें।
  • गलती: केवल ट्री नोड की रक्षा करना, वैल्यू ऑब्जेक्ट की नहीं। → यह क्यों विफल होता है: अनलॉक के बाद वैल्यू को फ्री किया जा सकता है। → सुधार: RCU या लॉक सेक्शन छोड़ने से पहले कॉपी करें या संदर्भ लें।
  • गलती: माइग्रेशन के दौरान केवल लुकअप थ्रूपुट को मापना। → यह क्यों विफल होता है: स्प्लिट्स, डिलीशन, गैप्स और मेमोरी दबाव हावी हो सकते हैं। → सुधार: यथार्थवादी रेंजों, समवर्तीता और एलोकेशन-विफलता परिदृश्यों की तुलना करें।

फॉलो-अप और उत्तर

Maple Tree या रेड-ब्लैक ट्री?

सरल ऑर्डर्ड पॉइंट कीज़ के लिए, एक रेड-ब्लैक ट्री पर्याप्त हो सकता है। गैर-ओवरलैपिंग रेंजों, गैप प्रश्नों और लोकैलिटी के बड़े सेट Maple Tree के पक्ष में होते हैं। वर्कलोड और समवर्ती मेट्रिक्स को निर्णय लेने दें।

आप RCU का उपयोग कब करेंगे?

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

mtree_erase() को GFP_KERNEL की आवश्यकता क्यों हो सकती है?

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

आप कैसे साबित करते हैं कि कोई गैप छूटा नहीं है?

विस्तृत सीमाओं, आसन्न रेंजों, अधिकतम इंडेक्स और यादृच्छिक डिलीशन के साथ एक सटीक मॉडल तैयार करें; समवर्ती डिलीशन और इटरेटर रीस्टार्ट सहित प्रत्येक गैप के एंडपॉइंट्स की तुलना करें।

सार्वजनिक स्रोत

संबंधित प्रश्न