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)
.