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

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