การสืบทอดลําดับความสําคัญ

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