2013-07-01 38 views
11

Api pthread tối nghĩa cho chủ đề ưu tiên không chỉ dễ hiểu, mà còn không hoạt động trên Android.thay đổi mức độ ưu tiên của chuỗi gốc trên Android bằng c/C++

Vì vậy, có cách nào để tôi giảm hoặc tăng mức ưu tiên của chuỗi không?

int currentPolicy; 
struct sched_param sched; 
status = pthread_getschedparam(pthread_self(), &currentPolicy, &sched); 
printf("sched.sched_priority:%d currentPolicy:%d", sched.sched_priority, currentPolicy); 
printf("priority min/max:%d/%d", sched_get_priority_min(currentPolicy), sched_get_priority_max(currentPolicy)); 

kết quả đầu ra:

sched.sched_priority: 0 currentPolicy: 0

ưu tiên min/max: 0/0

Ngoài ra, không có vấn đề gì tôi làm, pthread_setschedparam luôn trả về lỗi cho tôi (Đối số không hợp lệ). Trong mã của tôi, tôi cần phải giảm ưu tiên của chuỗi xử lý của tôi để đảm bảo rằng các chủ đề khác sử dụng thời gian cpu hơn. Hoặc, cách khác, tôi có thể tăng ưu tiên luồng của chủ đề khác mà tôi muốn sử dụng càng nhiều CPU so với các luồng khác trong tiến trình của tôi.

Có cách nào để tôi làm điều đó không? Tôi chỉ sử dụng mã C++ gốc.

Chỉnh sửa: Từ bài đăng này có vẻ như chuỗi của Android là một số loại quy trình trọng lượng nhẹ và để sửa đổi mức độ ưu tiên cho chúng setpriority nên được sử dụng. Có vẻ như chức năng hoạt động (getpriority trước và sau chỉ ra rằng ưu tiên đã được sửa đổi). Tuy nhiên, tôi không thấy hiệu ứng mong đợi trong ứng dụng của mình.

+0

"* ... pthread_setschedparam luôn trả về lỗi cho tôi (đối số không hợp lệ). *", Vì vậy bạn có thể cho chúng tôi biết những gì bạn đã chuyển vào hàm để trả về 'EINVAL' không? – alk

+0

cho currentPolicy Tôi đã cố gắng chuyển tất cả các giá trị có sẵn (0, 1, 2, 3). Đối với sched.sched_priority tôi đã cố gắng thiết lập giá trị khác nhau (-10, 10 vv). Tất cả thất bại. – Pavel

Trả lời

8

Đây là câu trả lời đơn giản: sử dụng int nice(int increment). Nó tuyên bố trong unistd.h

đây là đoạn code của hàm từ Android:

int nice(int increment) 
{ 
    int priority = getpriority(PRIO_PROCESS, 0); 
    return setpriority(PRIO_PROCESS, 0, priority+increment); 
} 

vậy, setpriority có thể được sử dụng để thiết lập ưu tiên thread.

Tôi thực sự có sự khác biệt như mong đợi trong mã của tôi bằng cách sử dụng nice(-10) hoặc nice(10)

+1

nơi tôi nên đặt mã này? là nó cho các chủ đề hoặc quá trình? Ngoài ra, giá trị trả lại là gì? thanks – RonTLV

+0

FWIW trông giống như điều này được khai báo trong '' – nmr

+0

@nmr 5 năm trước, có thể không phải là trường hợp – Pavel

7

Chủ đề Android là chủ đề Linux. Không có gì đặc biệt về họ.

setpriority() làm thay đổi giá trị "đẹp" của chủ đề, điều này ảnh hưởng đến mức độ ưu tiên mà chuỗi được lên lịch.

pthread_setschedparam() cũng có thể được sử dụng để thay đổi chính sách .

Nói chung, bạn không thể tăng mức độ ưu tiên hoặc thay đổi chính sách của mình mà không có đặc quyền nâng cao (CAP_SYS_NICE). Bạn có thể hạ thấp hoặc nâng nó trở lại mức ưu tiên "bình thường".

Nếu bạn sử dụng adb shell ps -t -p bạn có thể xem mức độ ưu tiên được chỉ định cho mỗi chuỗi. Thông tin này cũng được bao gồm trong các bãi chứa Dalvik.

Sử dụng Dalvik setpriority() để tạm thời tăng mức độ ưu tiên của chuỗi GC nếu cần (để tránh sự đảo ngược ưu tiên). Nếu bạn nhìn vào this bit of code xung quanh dòng 625 bạn có thể nhìn thấy nó. Bạn cũng có thể xem cuộc gọi tới set_sched_policy(), một chức năng thư viện của Android có thay đổi là cgroup chuỗi đang ở.

+1

Thật gần. 'nice (int)' nên được sử dụng trên android sử dụng setpriority. Mọi thứ khác không hoạt động. Tôi cũng đã cố gắng tìm kiếm toàn bộ mã nguồn Android và các chức năng khác không được sử dụng. – Pavel

0

Không có cách nào để thiết lập các ưu tiên của một thread POSIX trong Android. Các hàm nice()setpriority() định cấu hình mức độ ưu tiên của một quy trình chứ không phải của một chuỗi đơn lẻ.

+1

không đúng, tôi đã tự xác minh nó. tốt đẹp và thiết lập ưu tiên (mặc định) áp dụng cho quá trình hiện tại mà trong thế giới bản địa android một LWP Linux. sự nhầm lẫn của bạn có thể xuất phát từ thực tế là các ưu tiên được kế thừa bởi tất cả các chuỗi được khởi chạy. vì vậy nếu bạn thiết lập prio trước khi tung ra chủ đề con/công nhân, tất cả sẽ có prio đó. – voidStar

+0

Mua không có nghĩa là bạn có thể thay đổi chính sách/mức độ ưu tiên của một chuỗi nhất định sau khi tạo/chạy. –