การกลับลำดับความสำคัญคือสถานการณ์ที่ธุรกรรมที่มีลำดับความสำคัญสูง ถูกหน่วงเวลาโดยงานที่มีลำดับความสำคัญต่ำ เนื่องจากงานที่มีลำดับความสำคัญต่ำถือครอง ทรัพยากรที่งานที่มีลำดับความสำคัญสูงต้องการ 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)