প্রায়োরিটি ইনভার্সন হলো এমন একটি পরিস্থিতি যেখানে একটি উচ্চ-প্রায়োরিটির ট্রানজ্যাকশন একটি নিম্ন-প্রায়োরিটির টাস্কের কারণে বিলম্বিত হয়, কারণ নিম্ন-প্রায়োরিটির টাস্কটি উচ্চ-প্রায়োরিটির টাস্কটির প্রয়োজনীয় একটি রিসোর্স দখল করে রাখে। প্রায়োরিটি ইনভার্সন প্রশমিত করার জন্য, অ্যান্ড্রয়েড তিন ধরনের প্রায়োরিটি ইনহেরিটেন্সের মাধ্যমে থ্রেডগুলোকে ভিন্ন ভিন্ন প্রায়োরিটিতে চালানোর সুবিধা দেয়: ট্রানজ্যাকশন প্রায়োরিটি ইনহেরিটেন্স, নোড প্রায়োরিটি ইনহেরিটেন্স এবং রিয়েল-টাইম প্রায়োরিটি ইনহেরিটেন্স।
এই পৃষ্ঠায় প্রায়োরিটি ইনহেরিটেন্সের এই বিভিন্ন রূপগুলো ব্যাখ্যা করা হয়েছে।
লেনদেন অগ্রাধিকার উত্তরাধিকার
একটি সিনক্রোনাস বাইন্ডার কল করার সময়, একটি উচ্চ-অগ্রাধিকারের থ্রেড একটি নিম্ন-অগ্রাধিকারের থ্রেড দ্বারা ব্লক হতে পারে যতক্ষণ না নিম্ন-অগ্রাধিকারের থ্রেডটি একটি উত্তর পাঠায়। উদাহরণস্বরূপ, -১৯ নাইস ভ্যালুযুক্ত একটি থ্রেড, ০ ডিফল্ট নাইস ভ্যালুযুক্ত একটি থ্রেড দ্বারা ব্লক হতে পারে।
ট্রানজ্যাকশন প্রায়োরিটি ইনহেরিটেন্স এই সমস্যাটির সমাধান করে, কারণ বাইন্ডার ড্রাইভার সাময়িকভাবে ট্রানজ্যাকশন পরিচালনাকারী বাইন্ডার থ্রেডের প্রায়োরিটি পরিবর্তন করে কলারের প্রায়োরিটির সাথে মিলিয়ে দেয়। ট্রানজ্যাকশনটি সম্পন্ন হলে, বাইন্ডার ড্রাইভার বাইন্ডার থ্রেডটির প্রায়োরিটি তার পূর্বের মানে ফিরিয়ে আনে।
নোড অগ্রাধিকার উত্তরাধিকার
কিছু পরিস্থিতিতে, যেমন যেখানে কম লেটেন্সি প্রয়োজন, সেখানে অ্যাসিঙ্ক্রোনাস ট্রানজ্যাকশনের অগ্রাধিকার গুরুত্বপূর্ণ।
নোড প্রায়োরিটি ইনহেরিটেন্স আপনাকে একটি নোডের সমস্ত ট্রানজ্যাকশনের সর্বনিম্ন প্রায়োরিটি নির্ধারণ করার সুযোগ দেয়। নোড প্রায়োরিটি ইনহেরিটেন্স কনফিগার করার পর, নোডের সমস্ত ট্রানজ্যাকশন এই সর্বনিম্ন প্রায়োরিটিতে চলে।
নোড প্রায়োরিটি ইনহেরিটেন্সের নিয়মগুলো হলো:
যদি ট্রানজ্যাকশনটি সিনক্রোনাস হয়, তাহলে প্রায়োরিটি হয়
max(min_node_priority, caller_priority);।যদি ট্রানজ্যাকশনটি অ্যাসিঙ্ক্রোনাস হয়, তাহলে প্রায়োরিটি হয়
max(default_priority (nice 0), min_node_priority);।
নোড অগ্রাধিকার উত্তরাধিকার কনফিগার করুন
নোড প্রায়োরিটি ইনহেরিটেন্স কনফিগার করতে, BBinder::setMinSchedulerPolicy ব্যবহার করুন।
রিয়েল-টাইম অগ্রাধিকার উত্তরাধিকার
অ্যান্ড্রয়েড লেটেন্সি-সংবেদনশীল থ্রেডগুলোকে সময়মতো তাদের কাজ সম্পন্ন করাতে SCHED_FIFO মতো রিয়েল-টাইম শিডিউলিং নীতি ব্যবহার করে। এছাড়াও, অ্যান্ড্রয়েডের কিছু লেটেন্সি-সংবেদনশীল কাজ দুই বা ততোধিক প্রসেসের মধ্যে ভাগ করে দেওয়া হয়।
রিয়েল-টাইম প্রায়োরিটি ইনহেরিটেন্স নাইস ভ্যালু-এর মতোই কাজ করে, তবে কিছু ব্যতিক্রম আছে:
- রিয়েল-টাইম প্রায়োরিটি ইনহেরিটেন্স ডিফল্টরূপে নিষ্ক্রিয় থাকে।
- বৃহত্তর রিয়েল-টাইম অগ্রাধিকার মানগুলো ক্ষুদ্রতর মানগুলোর চেয়ে বেশি অগ্রাধিকার পায়।
রিয়েল-টাইম অগ্রাধিকার উত্তরাধিকার সক্ষম করুন
BBinder::setInheritRt(true) কলটি ব্যবহার করে প্রতিটি নোডের জন্য রিয়েল-টাইম প্রায়োরিটি ইনহেরিটেন্স সক্রিয় করতে হবে।