2013-05-06 42 views
28

Tôi đang tìm giá trị của lát thời gian (hoặc lượng tử) của hạt nhân Linux của tôi.Làm thế nào để biết lát thời gian lên lịch Linux?

Có tệp /proc hiển thị thông tin như vậy không?

(Hoặc) Có được xác định rõ trong tiêu đề Linux của bản phân phối của tôi không?

(Hoặc) Có chức năng C của API Linux (có thể là sysinfo) hiển thị giá trị này không?

Xin cảm ơn trước.

Trả lời

25

Thời gian mặc định của Linux cho các quy trình thời gian thực được xác định trong hạt nhân Linux là RR_TIMESLICE trong include/linux/sched/rt.h.

/* 
* default timeslice is 100 msecs (used only for SCHED_RR tasks). 
* Timeslices get refilled after they expire. 
*/ 
#define RR_TIMESLICE   (100 * HZ/1000) 

Lưu ý rằng lượng tử thực tế được phân bổ cho một quá trình đặc biệt may be different hơn giá trị này:

Bạn có thể điều chỉnh "lát" bằng cách điều chỉnh sched_latency_nssched_min_granularity_ns, nhưng lưu ý rằng "lát "không phải là số lượng cố định . Cũng lưu ý rằng các quyết định sử dụng CFS dựa trên trạng thái tức thời . Một nhiệm vụ có thể đã nhận được đầy đủ (biến) "lát" của thời gian CPU, nhưng việc sử dụng sẽ chỉ được kích hoạt nếu có thêm nhiệm vụ xứng đáng, vì vậy "lát" không phải là "tối đa thời gian CPU liên tục" mà bạn có thể mong đợi nó .. nhưng nó là hơi giống nhau.

Tuy nhiên, bạn có thể sử dụng sched_rr_get_interval() để nhận khoảng SCHED_RR cho một quy trình thời gian thực nhất định.

+0

Tuy nhiên có vẻ như 'rt.h' xuất hiện với hạt nhân Linux 3.9. – backlash

+7

Trước ** hạt nhân Linux v3.9 **, định nghĩa của 'RR_TIMESLICE' được đặt trong [include/linux/sched.h] (http://lxr.free-electrons.com/source/include/linux/sched .h? v = 3.8 # L1227). Trước ** Linux kernel v3.4 **, định nghĩa được đặt tên là 'DEF_TIMESLICE' và được đặt trong [kernel/sched/sched.h] (http://lxr.free-electrons.com/source/kernel/sched/ sched.h? v = 3.3 # L43). –

+3

Lưu ý rằng câu trả lời này chỉ liên quan đến các chủ đề được lên lịch với ưu tiên thời gian thực RR –

20

CFS (là trình lên lịch mặc định cho quy trình) không có thời gian cố định, được tính theo thời gian chạy tùy thuộc vào độ trễ được nhắm mục tiêu (sysctl_sched_latency) và số lượng quy trình đang chạy. Timeslice không bao giờ có thể nhỏ hơn mức chi tiết tối thiểu (sysctl_sched_min_granularity).

Timeslice sẽ luôn ở giữa sysctl_sched_min_granularitysysctl_sched_latency, được đặt mặc định là 0,75 mili giây và 6 mili giây tương ứng và được xác định trong kernel/sched/fair.c.

Nhưng thời gian thực tế không được xuất sang không gian người dùng.

+0

Điều này cũng đúng đối với các quy trình theo đợt không? – user239558

+0

Điều này đúng với mọi quá trình chạy dưới bộ lập lịch CFS (không phải là quy trình thời gian thực) –

7

Có một số nhầm lẫn trong câu trả lời được chấp nhận giữa các quy trình SCHED_OTHER (nghĩa là các quy trình hoạt động theo chính sách chia sẻ thời gian thực không theo thời gian thực) và SCHED_RR quy trình.

Các sched_latency_nssched_min_granularity_ns file (được dành cho mục đích gỡ lỗi, và chỉ hiển thị nếu hạt nhân được cấu hình với CONFIG_SCHED_DEBUG) ảnh hưởng đến lịch trình của SCHED_OTHER quy trình. Như đã lưu ý trong câu trả lời của Alexey Shmalko, lát thời gian dưới CFS không cố định (và không được xuất sang không gian người dùng), và sẽ phụ thuộc vào các tham số và các yếu tố hạt nhân như giá trị tốt đẹp của quá trình.

sched_rr_get_interval() trả về giá trị cố định là lượng tử mà quy trình SCHED_RR được đảm bảo nhận được, trừ khi nó được đặt trước hoặc chặn. Trên Linux truyền thống, lượng tử SCHED_RR là 0,1 giây.Kể từ Linux 3.9, giới hạn là adjustable thông qua tệp /proc/sys/kernel/sched_rr_timeslice_ms, trong đó lượng tử được biểu thị dưới dạng giá trị mili giây có giá trị mặc định là 100.

2

Tôi googled vé này về cùng một nghi ngờ về lát thời gian của SCHED_RR trong Linux. Nhưng tôi không thể nhận được câu trả lời rõ ràng cả từ đây và mã nguồn hạt nhân. Sau khi kiểm tra kỹ hơn, tôi đã tìm thấy điểm chính là "RR_TIMESLICE" là lát thời gian mặc định trong jiffies, không phải là mili giây! Vì vậy, lát thời gian mặc định của SCHED_RR luôn là 100ms, bất kể bạn đã cấu hình HZ như thế nào.

Tương tự như giá trị của "/ proc/sys/kernel/sched_rr_timeslice_ms", trong đó giá trị đầu vào trong millisecond, nhưng nó lưu trữ và đầu ra trong jiffies! Vì vậy, khi CONFIG_HZ = 100, bạn sẽ thấy rằng:

# echo 100 > /proc/sys/kernel/sched_rr_timeslice_ms 
# cat /proc/sys/kernel/sched_rr_timeslice_ms 
10 

Hơi bối rối một chút. Hy vọng điều này có thể giúp bạn hiểu điều đó!