Pewarisan prioritas

Inversi prioritas adalah situasi ketika transaksi berprioritas tinggi tertunda oleh tugas berprioritas rendah karena tugas berprioritas rendah memegang resource yang dibutuhkan oleh tugas berprioritas tinggi. Untuk mengurangi inversi prioritas, Android mendukung menjalankan thread dengan prioritas yang berbeda melalui tiga bentuk pewarisan prioritas yang berbeda: pewarisan prioritas transaksi, pewarisan prioritas node, dan pewarisan prioritas real-time.

Halaman ini menjelaskan berbagai bentuk pewarisan prioritas ini.

Pewarisan prioritas transaksi

Saat melakukan panggilan binder sinkron, thread berprioritas tinggi dapat diblokir oleh thread berprioritas rendah hingga thread berprioritas rendah mengirimkan balasan. Misalnya, thread dengan nilai bagus -19 dapat diblokir oleh thread dengan nilai bagus default 0.

Pewarisan prioritas transaksi memperbaiki masalah ini karena driver binder untuk sementara mengubah prioritas thread binder yang menangani transaksi agar sesuai dengan prioritas pemanggil. Setelah transaksi selesai, driver binder akan memulihkan prioritas thread binder ke nilai sebelumnya.

Pewarisan prioritas node

Dalam beberapa situasi, seperti yang memerlukan latensi rendah, prioritas transaksi asinkron penting.

Pewarisan prioritas node memungkinkan Anda mengonfigurasi prioritas minimum yang harus digunakan untuk menjalankan semua transaksi di node. Setelah pewarisan prioritas node dikonfigurasi, semua transaksi di node berjalan pada prioritas minimum ini.

Aturan untuk pewarisan prioritas node adalah:

  • Jika transaksi bersifat sinkron, prioritasnya menjadi max(min_node_priority, caller_priority);.

  • Jika transaksi bersifat asinkron, prioritasnya menjadi max(default_priority (nice 0), min_node_priority);.

Mengonfigurasi pewarisan prioritas node

Untuk mengonfigurasi pewarisan prioritas node, gunakan BBinder::setMinSchedulerPolicy.

Pewarisan prioritas real-time

Android menggunakan kebijakan penjadwalan real-time, seperti SCHED_FIFO, untuk menyebabkan thread yang penting untuk latensi menyelesaikan pekerjaannya tepat waktu. Selain itu, beberapa tugas penting latensi Android dibagi menjadi dua atau lebih proses.

Pewarisan prioritas real-time berfungsi sama dengan nilai nice, kecuali:

  • Pewarisan prioritas real-time dinonaktifkan secara default.
  • Nilai prioritas real-time yang lebih besar memiliki prioritas yang lebih tinggi daripada nilai yang lebih kecil.

Mengaktifkan pewarisan prioritas real-time

Pewarisan prioritas real-time harus diaktifkan untuk setiap node menggunakan panggilan BBinder::setInheritRt(true).