प्राथमिकता इनहेरिटेंस

प्रायॉरिटी इन्वर्ज़न एक ऐसी स्थिति होती है जिसमें ज़्यादा प्राथमिकता वाले लेन-देन में देरी होती है. ऐसा इसलिए होता है, क्योंकि कम प्राथमिकता वाला टास्क, ज़्यादा प्राथमिकता वाले टास्क के लिए ज़रूरी संसाधन को होल्ड करता है. प्राथमिकता के उलट होने की समस्या को कम करने के लिए, Android अलग-अलग प्राथमिकताओं पर थ्रेड चलाने की सुविधा देता है. इसके लिए, प्राथमिकता के इनहेरिटेंस के तीन अलग-अलग फ़ॉर्म का इस्तेमाल किया जाता है: लेन-देन की प्राथमिकता का इनहेरिटेंस, नोड की प्राथमिकता का इनहेरिटेंस, और रीयल-टाइम प्राथमिकता का इनहेरिटेंस.

इस पेज पर, प्राथमिकता इनहेरिटेंस के इन अलग-अलग फ़ॉर्म के बारे में बताया गया है.

लेन-देन की प्राथमिकता को इनहेरिट करना

सिंक्रोनस बाइंडर कॉल करते समय, ज़्यादा प्राथमिकता वाली थ्रेड को कम प्राथमिकता वाली थ्रेड से तब तक ब्लॉक किया जा सकता है, जब तक कम प्राथमिकता वाली थ्रेड से जवाब नहीं मिल जाता. उदाहरण के लिए, -19 की नाइस वैल्यू वाला थ्रेड, 0 की डिफ़ॉल्ट नाइस वैल्यू वाले थ्रेड से ब्लॉक हो सकता है.

लेन-देन की प्राथमिकता को इनहेरिट करने की सुविधा इस समस्या को ठीक करती है. ऐसा इसलिए, क्योंकि बाइंडर ड्राइवर, लेन-देन को मैनेज करने वाले बाइंडर थ्रेड की प्राथमिकता को कुछ समय के लिए बदल देता है, ताकि वह कॉलर की प्राथमिकता से मेल खा सके. लेन-देन पूरा होने पर, बाइंडर ड्राइवर, बाइंडर थ्रेड की प्राथमिकता को उसकी पिछली वैल्यू पर वापस सेट कर देता है.

नोड की प्राथमिकता इनहेरिट करना

कुछ स्थितियों में, एसिंक्रोनस लेन-देन की प्राथमिकता तय करना ज़रूरी होता है. जैसे, कम समय में होने वाले लेन-देन के लिए.

नोड की प्राथमिकता इनहेरिटेंस की मदद से, उस कम से कम प्राथमिकता को कॉन्फ़िगर किया जा सकता है जिस पर किसी नोड पर सभी लेन-देन किए जाने चाहिए. नोड की प्राथमिकता इनहेरिट करने की सुविधा कॉन्फ़िगर करने के बाद, नोड पर सभी लेन-देन इस कम से कम प्राथमिकता पर चलते हैं.

नोड की प्राथमिकता इनहेरिट करने के नियम ये हैं:

  • अगर लेन-देन सिंक्रोनस है, तो प्राथमिकता max(min_node_priority, caller_priority); हो जाती है.

  • अगर लेन-देन एसिंक्रोनस है, तो प्राथमिकता max(default_priority (nice 0), min_node_priority); हो जाती है.

नोड की प्राथमिकता इनहेरिट करने की सुविधा कॉन्फ़िगर करना

नोड की प्राथमिकता को इनहेरिट करने की सुविधा को कॉन्फ़िगर करने के लिए, BBinder::setMinSchedulerPolicy का इस्तेमाल करें.

रीयल-टाइम प्राथमिकता इनहेरिटेंस

Android, रीयल-टाइम शेड्यूलिंग की नीतियों का इस्तेमाल करता है. जैसे, SCHED_FIFO. इससे, कम समय में पूरा होने वाले थ्रेड समय पर अपना काम पूरा कर पाते हैं. इसके अलावा, Android के कुछ ऐसे काम होते हैं जिनमें कम से कम समय लगना ज़रूरी होता है. इन्हें दो या उससे ज़्यादा प्रोसेस में बांटा जाता है.

रीयल-टाइम प्राथमिकता इनहेरिटेंस, नाइस वैल्यू की तरह ही काम करता है. हालांकि, इसमें ये अंतर हैं:

  • रीयल-टाइम प्राथमिकता इनहेरिटेंस की सुविधा डिफ़ॉल्ट रूप से बंद होती है.
  • रीयल-टाइम प्राथमिकता की बड़ी वैल्यू को, छोटी वैल्यू के मुकाबले ज़्यादा प्राथमिकता दी जाती है.

रीयल-टाइम में प्राथमिकताएं तय करने की सुविधा चालू करना

BBinder::setInheritRt(true) कॉल का इस्तेमाल करके, अलग-अलग नोड के लिए रीयल-टाइम प्राथमिकता इनहेरिटेंस की सुविधा चालू होनी चाहिए.