2012-05-16 20 views
9

Chúng tôi đang sử dụng phiên bản hạt nhân 2.4-20 và chúng tôi cần tính số lượng người dùng đang hoạt động, ở chế độ hạt nhân. Mục tiêu là thay đổi lịch trình, vì vậy chúng tôi đang ở trong sched.c, sửa đổi lịch biểu() chức năng.cách đếm số người dùng đang hoạt động trong hạt nhân

Điều chúng tôi làm là tính số người dùng trong macro list_for_each.

list_for_each(tmp, &runqueue_head) { 
    p = list_entry(tmp, struct task_struct, run_list); 
    if (can_schedule(p, this_cpu)) { 
     if (unique(p->uid)) add_new_user(p->uid); 
     int weight = goodness(p, this_cpu, prev->active_mm); 
     if (weight > c) 
      c = weight, next = p; 
    } 
} 

về cơ bản là thêm người dùng duy nhất vào danh sách. Tuy nhiên, chúng tôi nhận được kết quả ngẫu nhiên. Có cách nào cụ thể để giải quyết vấn đề này?

Cảm ơn bạn.

+4

Bạn có ý nghĩa gì với 'kết quả ngẫu nhiên'? – ArjunShankar

+0

Lúc đầu, chúng tôi tính người dùng trong hàm goodness(), ở đó chúng tôi có số lượng tùy ý (mặc dù chúng tôi có 4 người dùng cùng một lúc, nhưng chúng tôi có thể nhận được 1 người dùng). trong lịch biểu(), chúng tôi dường như có giá trị nhất quán nhưng chúng tôi không chắc chắn, vì lịch biểu() được chạy thường xuyên, chúng tôi cần lấy mẫu (một lần trong 5000 lượt). Tôi đoán không có trường nào trong kernel chứa người dùng đang hoạt động hiện tại? nếu không, cách tốt nhất để đếm chúng là gì? Cám ơn phản hồi của bạn. –

+0

Cảm ơn bạn đã làm rõ. Tôi không biết câu trả lời cho điều này. Ý định của tôi là chỉ ra rằng câu hỏi không hoàn toàn rõ ràng. Tôi muốn đề nghị chỉnh sửa điều này vào câu hỏi. Chúc may mắn! – ArjunShankar

Trả lời

1

Bạn có thể thử đếm người dùng bên trong macro for_each_task. Điều này dẫn đến việc đếm những người dùng có nhiệm vụ bị chặn do I/O hoặc bất kỳ lý do nào khác. Điều này sẽ cung cấp kết quả tốt hơn vì bạn không thể đảm bảo có thể đếm những người dùng chạy các quy trình tương tác nếu bạn sử dụng hàng đợi chạy.

+0

có ý nghĩa. nhưng trước tiên chúng tôi đã tính người dùng trong chức năng tốt, đó có thể là nguyên nhân dẫn đến kết quả ngẫu nhiên. Tôi không có lời giải thích cho điều đó. Đối với một số lý do, for_each_task trong chức năng lịch biểu hoạt động. Cảm ơn! –

0

Điều này có hiệu quả không? ai | awk '{print $ 1}' | sort -ud

+0

bạn có thể tính số. – Keshi

+0

Tôi đang ở trong hạt nhân, tôi không thể sử dụng các cuộc gọi hệ thống cũng như các chương trình đầu cuối. –