การกลับลำดับความสำคัญคือสถานการณ์ที่ธุรกรรมที่มีลำดับความสำคัญสูงล่าช้าเนื่องจากงานที่มีลำดับความสำคัญต่ำถือครองทรัพยากรที่งานที่มีลำดับความสำคัญสูงจำเป็นต้องใช้ Android รองรับการเรียกใช้เธรดที่มีลำดับความสำคัญต่างๆ ผ่านการสืบทอดลำดับความสำคัญ 3 รูปแบบ ได้แก่ การสืบทอดลำดับความสำคัญของธุรกรรม การสืบทอดลำดับความสำคัญของโหนด และการสืบทอดลำดับความสำคัญแบบเรียลไทม์ เพื่อลดปัญหาการกลับลำดับความสำคัญ
หน้านี้จะอธิบายการสืบทอดลำดับความสำคัญรูปแบบต่างๆ
การสืบทอดลำดับความสำคัญของธุรกรรม
เมื่อทำการเรียกใช้ Binder แบบซิงโครนัส เธรดที่มีลำดับความสำคัญสูงอาจถูกบล็อกโดยเธรดที่มีลำดับความสำคัญต่ำจนกว่าเธรดที่มีลำดับความสำคัญต่ำจะส่งการตอบกลับ ตัวอย่างเช่น เธรดที่มีค่า Nice เป็น -19 อาจถูกบล็อกโดยเธรดที่มีค่า Nice เริ่มต้นเป็น 0
การสืบทอดลำดับความสำคัญของธุรกรรมช่วยแก้ปัญหานี้ได้เนื่องจากไดรเวอร์ Binder จะเปลี่ยนลำดับความสำคัญของเธรด Binder ที่จัดการธุรกรรมชั่วคราวให้ตรงกับลำดับความสำคัญของผู้เรียก เมื่อธุรกรรมเสร็จสมบูรณ์ ไดรเวอร์ Binder จะคืนค่าลำดับความสำคัญของเธรด Binder เป็นค่าก่อนหน้า
การสืบทอดลำดับความสำคัญของโหนด
ในบางสถานการณ์ เช่น สถานการณ์ที่ต้องใช้เวลาในการตอบสนองต่ำ ลำดับความสำคัญของธุรกรรมแบบอะซิงโครนัสมีความสำคัญ
การสืบทอดลำดับความสำคัญของโหนดช่วยให้คุณกำหนดค่าลำดับความสำคัญต่ำสุดที่ธุรกรรมทั้งหมดในโหนดควรทำงานได้ หลังจากกำหนดค่าการสืบทอดลำดับความสำคัญของโหนดแล้ว ธุรกรรมทั้งหมดในโหนดจะทำงานด้วยลำดับความสำคัญต่ำสุดนี้
กฎสำหรับการสืบทอดลำดับความสำคัญของโหนดมีดังนี้
หากธุรกรรมเป็นแบบซิงโครนัส ลำดับความสำคัญจะเป็น
max(min_node_priority, caller_priority);หากธุรกรรมเป็นแบบอะซิงโครนัส ลำดับความสำคัญจะเป็น
max(default_priority (nice 0), min_node_priority);
กำหนดค่าการสืบทอดลำดับความสำคัญของโหนด
หากต้องการกำหนดค่าการสืบทอดลำดับความสำคัญของโหนด ให้ใช้ BBinder::setMinSchedulerPolicy
การสืบทอดลำดับความสำคัญแบบเรียลไทม์
Android ใช้นโยบายการจัดกำหนดการแบบเรียลไทม์ เช่น SCHED_FIFO เพื่อให้เธรดที่สำคัญต่อเวลาในการตอบสนองทำงานให้เสร็จทันเวลา นอกจากนี้ งานบางอย่างของ Android ที่สำคัญต่อเวลาในการตอบสนองยังแบ่งออกเป็น 2 กระบวนการขึ้นไป
การสืบทอดลำดับความสำคัญแบบเรียลไทม์ทำงานเหมือนกับค่า Nice ทุกประการ ยกเว้น
- การสืบทอดลำดับความสำคัญแบบเรียลไทม์จะปิดใช้โดยค่าเริ่มต้น
- ค่าลำดับความสำคัญแบบเรียลไทม์ที่สูงกว่าจะมีลำดับความสำคัญสูงกว่าค่าที่ต่ำกว่า
เปิดใช้การสืบทอดลำดับความสำคัญแบบเรียลไทม์
ต้องเปิดใช้การสืบทอดลำดับความสำคัญแบบเรียลไทม์สำหรับโหนดแต่ละรายการโดยใช้การเรียก BBinder::setInheritRt(true)