Đảo ngượ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ợ 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 giao dịch, kế thừa mức độ ưu tiên nút và kế thừa mức độ ưu tiên theo thời gian thực.
Trang này giải thích các hình thức kế thừa mức độ ưu tiên khác nhau này.
Kế thừa mức độ ưu tiên của giao dịch
Khi thực hiện một 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 phản hồi. Ví dụ: một luồng có giá trị ưu tiên là -19 có thể bị chặn bởi một luồng có giá trị ưu tiên mặc định là 0.
Tính năng kế thừa mức độ ưu tiên 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 phương thức 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 đó.
Thừa kế 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.
Tính nă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 sẽ 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ả 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ề việc 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ẽ là
max(min_node_priority, caller_priority);
.Nếu giao dịch không đồng bộ, thì mức độ ưu tiên sẽ là
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
, để khiến 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 hai hoặc nhiều quy trình.
Tính năng 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ị ưu tiên, ngoại trừ:
- Tính năng kế thừa mức độ ưu tiên theo thời gian thực ở trạng thái tắt theo mặc định.
- Giá trị ưu tiên theo thời gian thực càng lớn thì mức độ ưu tiên càng cao so với 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)
.