Đảo ngược mức độ ưu tiên là tình huống trong đó một giao dịch có mức độ ưu tiên cao bị trì hoãn bởi một tác vụ có mức độ ưu tiên thấp vì tác vụ có mức độ ưu tiên thấp giữ một tài nguyên mà tác vụ có mức độ ưu tiên cao cần. Để giảm thiểu tình trạng đảo ngược mức độ ưu tiên, Android hỗ trợ việc chạy các luồng ở nhiều mức độ ưu tiên thông qua 3 hình thức kế thừa mức độ ưu tiên: kế thừa mức độ ưu tiên của giao dịch, kế thừa mức độ ưu tiên của nút và kế thừa mức độ ưu tiên theo thời gian thực.
Trang này giải thích về các hình thức kế thừa mức độ ưu tiên này.
Kế thừa mức độ ưu tiên của giao dịch
Khi thực hiện lệnh gọi liên kết đồng bộ, một luồng có mức độ ưu tiên cao có thể bị chặn bởi một luồng có mức độ ưu tiên thấp cho đến khi luồng có mức độ ưu tiên thấp gửi câu trả lời. Ví dụ: một luồng có giá trị nice là -19 có thể bị chặn bởi một luồng có giá trị nice mặc định là 0.
Kế thừa mức độ ưu tiên của giao dịch khắc phục vấn đề này vì trình điều khiển liên kết tạm thời thay đổi mức độ ưu tiên của luồng liên kết xử lý giao dịch để khớp với mức độ ưu tiên của trình gọi. Khi giao dịch hoàn tất, trình điều khiển liên kết sẽ khôi phục mức độ ưu tiên của luồng liên kết về giá trị trước đó.
Kế thừa mức độ ưu tiên của nút
Trong một số trường hợp, chẳng hạn như những trường hợp yêu cầu độ trễ thấp, mức độ ưu tiên của các giao dịch không đồng bộ là rất quan trọng.
Kế thừa mức độ ưu tiên của nút cho phép bạn định cấu hình mức độ ưu tiên tối thiểu mà tất cả các giao dịch trên một nút phải chạy. Sau khi bạn định cấu hình tính năng kế thừa mức độ ưu tiên của nút, tất cả các giao dịch trên nút sẽ chạy ở mức độ ưu tiên tối thiểu này.
Các quy tắc về kế thừa mức độ ưu tiên của nút là:
Nếu giao dịch là đồng bộ, thì mức độ ưu tiên sẽ trở thành
max(min_node_priority, caller_priority);.Nếu giao dịch là không đồng bộ, thì mức độ ưu tiên sẽ trở thành
max(default_priority (nice 0), min_node_priority);.
Định cấu hình tính năng kế thừa mức độ ưu tiên của nút
Để định cấu hình tính năng kế thừa mức độ ưu tiên của nút, hãy sử dụng BBinder::setMinSchedulerPolicy.
Kế thừa mức độ ưu tiên theo thời gian thực
Android sử dụng các chính sách lập lịch theo thời gian thực, chẳng hạn như SCHED_FIFO, để các luồng quan trọng về độ trễ hoàn thành công việc đúng hạn. Ngoài ra, một số công việc quan trọng về độ trễ của Android được chia thành 2 hoặc nhiều quy trình.
Kế thừa mức độ ưu tiên theo thời gian thực hoạt động giống hệt như các giá trị nice, ngoại trừ:
- Tính năng kế thừa mức độ ưu tiên theo thời gian thực bị tắt theo mặc định.
- Các giá trị ưu tiên theo thời gian thực lớn hơn có mức độ ưu tiên cao hơn các giá trị nhỏ hơn.
Bật tính năng kế thừa mức độ ưu tiên theo thời gian thực
Bạn phải bật tính năng kế thừa mức độ ưu tiên theo thời gian thực cho từng nút bằng lệnh gọi BBinder::setInheritRt(true).