2013-10-04 18 views
5

Tôi đã đọc về Linux Kernel và CFS scheduler trong kernel. Tôi đã xem qua vruntime (thời gian chạy ảo) là khái niệm cốt lõi đằng sau lịch trình CFS. Tôi đọc từ “Phát triển hạt nhân Linux” và cũng từ các blog khác trên internet nhưng không thể hiểu các tính toán cơ bản sau số vruntime. vruntime thuộc về một quy trình cụ thể hay không thuộc về một nhóm quá trình có cùng giá trị đẹp. Yếu tố trọng số là gì và được tính như thế nào? Tôi đã đi qua tất cả các khái niệm này nhưng không thể hiểu được. Sự khác nhau giữa vruntime và * min_vruntime * là gì?Khái niệm về vruntime trong CFS

Trả lời

9

vruntime là theo chủ đề; nó là một thành viên được lồng trong task_struct.

Về cơ bản, vruntime là thước đo "thời gian chạy" của luồng - lượng thời gian đã sử dụng trên bộ xử lý. Toàn bộ quan điểm của CFS là công bằng cho tất cả; do đó, loại bản ngã của boils xuống đến một điều đơn giản: (trong số các nhiệm vụ trên một runqueue nhất định) nhiệm vụ với vruntime thấp nhất là nhiệm vụ mà xứng đáng nhất để chạy, do đó chọn nó là 'tiếp theo'. (Việc thực hiện thực tế được thực hiện bằng cách sử dụng một rbtree cho hiệu quả).

Cân nhắc các yếu tố khác nhau - như ưu tiên, giá trị tốt đẹp, nhóm cgroups, v.v. - tính toán vruntime không phải là thẳng về phía trước như một số gia tăng đơn giản. Tôi khuyên bạn nên đọc phần có liên quan trong "Professional Linux Kernel Architecture", Mauerer, Wrox Press - nó được giải thích chi tiết.

Vui lòng xem bên dưới một cách nhanh chóng để tóm tắt một số điều này.

tài nguyên khác: Documentation/scheduler/sched-design-CFS.txt

nhanh tóm tắt - tính vruntime: (dựa trên cuốn sách)

  • Hầu hết các công việc được thực hiện trong kernel/sched_fair.c: __ update_curr ()

  • Được gọi trên bộ đếm thời gian đánh dấu

  • cập nhật thời gian thực và ảo 'hiện tại' vừa chi cho các bộ xử lý

  • Đối với công việc mà chạy ở mức ưu tiên mặc định, tức là, đẹp giá trị 0, thời gian vật lý và ảo dành giống hệt

  • Không vì vậy đối với các nhiệm vụ ở mức ưu tiên khác (mức độ ưu tiên); do đó việc tính toán vruntime bị ảnh hưởng bởi mức độ ưu tiên của dòng điện sử dụng hệ số trọng lượng tải

    delta_exec = (unsigned long) (now - curr-> exec_start); // ... delta_exec_weighted = calc_delta_fair (delta_exec, curr); curr-> vruntime + = delta_exec_weighted;

Bỏ một số làm tròn và tràn kiểm tra, những gì calc_delta_fair làm là để tính toán giá trị nhất định theo công thức sau:

delta_exec_weighed = delta_exec * (NICE_0_LOAD/curr->load.weight) 

Có điều là, nhiệm vụ quan trọng hơn (những người có một giá trị đẹp thấp) sẽ có trọng số lớn hơn; do đó, bằng các phương trình trên, vruntime tính đến chúng sẽ nhỏ hơn (do đó có chúng enqueued nhiều hơn bên trái trên rbtree!).

+0

Mục đích của min_vruntime là gì? – iammurtaza

+0

@iammurtaza: vruntime tối thiểu (tôi đang sử dụng tunable/proc/sys/kernel/sched_min_granularity_ns) thường (trên Ubuntu gần đây ít nhất) ~ 2,25ms. Nếu điều này không có mặt, 2 tác vụ có thể "ping-pong" cứ sau vài micro giây và tắt bộ vi xử lý. Một đảm bảo tối thiểu để ở trên cpu là cần thiết để giảm thiểu hành vi này thrashing. – kaiwan

1

Vruntime là thời gian chạy ảo của quá trình giúp theo dõi lượng thời gian mà quy trình đã chạy. Vruntime là thành viên của cấu trúc sched_entity được định nghĩa trong include/linux/sched.h

min_vruntime đại diện cho vruntime tối thiểu của runqueue cfs. Nó đại diện cho tối thiểu của tất cả các vruntime của các quá trình được lên kế hoạch trên rằng runfsue cfs. Min_vruntime là thành viên của cấu trúc cfs_rq được định nghĩa trong include/linux/sched.h

Mục đích của min_vruntime là chọn quy trình tiếp theo trong runqueue cfs để chạy. Để công bằng cho tất cả các quy trình, bộ lập lịch CFS chọn quá trình với vruntime tối thiểu để thực hiện trước.

Liên kết để bao gồm/linux/sched.h là http://lxr.free-electrons.com/source/include/linux/sched.h

Các vấn đề liên quan