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

प्राथमिकता पलटने की स्थिति तब होती है, जब कम प्राथमिकता वाला टास्क, ज़्यादा प्राथमिकता वाले लेन-देन में देरी करता है. ऐसा इसलिए होता है, क्योंकि कम प्राथमिकता वाले टास्क के पास वह संसाधन होता है जिसकी ज़रूरत ज़्यादा प्राथमिकता वाले टास्क को होती है. प्राथमिकता पलटने की समस्या को कम करने के लिए, 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) कॉल का इस्तेमाल करें.