2011-11-04 20 views
13

Tôi là người mới bắt đầu với hạt nhân Linux và tôi đang cố gắng tìm hiểu cách thức lịch trình của Linux.Thời gian chờ của Linux CFS (Hoàn toàn hợp lý theo lịch trình)

Tôi đã đọc một số cuốn sách về hạt nhân Linux và đi qua các liên kết từ IBM http://www.ibm.com/developerworks/linux/library/l-cfs/ và tất cả, nhưng tôi vẫn còn lại với một số nghi ngờ.

  1. Trình lập lịch biểu lập lịch tất cả các tác vụ trong thời gian sysctl_sched_latency như thế nào?
  2. Khi một quá trình đánh thức những gì thực sự được thực hiện trong chức năng place_entity?
  3. Khi quá trình đánh thức tại sao vruntime được điều chỉnh bằng cách trừ từ sched_latency? Điều đó không thể dẫn đến các quá trình trong hàng đợi chạy với sự khác biệt lớn trong giá trị vruntime?

Trả lời

10

Thứ nhất thời gian chạy ảo của một nhiệm vụ

  • về mặt lý thuyết là khi nhiệm vụ sẽ bắt đầu lát thời gian tiếp theo của thực hiện trên một lý thuyết hoàn hảo nhiều CPU ren.
  • trong thực tế là thời gian chạy thực tế của nó bình thường đến tổng số chạy nhiệm vụ

1. Làm thế nào để tiến lên lịch tất cả các nhiệm vụ trong thời sysctl_sched_latency?

Nó duy trì một thời gian đặt hàng cây đỏ và đen, nơi tất cả các nhiệm vụ runnable là được sắp xếp theo thời gian chạy ảo của chúng. Các nút ở bên trái đã chạy trong khoảng thời gian ngắn nhất. CFS chọn nhiệm vụ nhiều nhất bên trái và chạy nó, cho đến khi lịch nhiệm vụ hoặc trình lên lịch đánh dấu thì thời gian CPU mà nó đã chạy được thêm vào thời gian chạy ảo của nó. Khi nó không còn là nút ngoài cùng bên trái, thì nhiệm vụ mới có ảo ngắn nhất sẽ được chạy và tác vụ cũ được đặt trước.

2. Khi một quá trình đánh thức những gì thực sự được thực hiện trong hàm place_entity?

phiên bản ngắn:

Khi một quá trình thức dậy chức năng place_entity hoặc lá runtime ảo nhiệm vụ của như nó đã được hoặc tăng nó.

phiên bản Long:

Khi một quá trình thức dậy chức năng place_entity làm những điều sau đây

  1. Khởi tạo thời gian chạy ảo tạm thời để runtime ảo CFS chạy hàng đợi của các nhiệm vụ nhỏ nhất.

  2. Khi ngủ ít hơn một độ trễ đơn lẻ không được tính, khởi tạo biến ngưỡng cho sysctl_sched_latency. Nếu tính năng GENTLE_FAIR_SLEEPERS được bật, thì một nửa giá trị của biến này. Giảm thời gian chạy ảo tạm thời được khởi tạo trước đó bằng giá trị ngưỡng này.

  3. Đảm bảo rằng thời gian chạy ảo tạm thời ít nhất bằng thời gian chạy ảo của tác vụ, bằng cách đặt thời gian chạy ảo được tính thành tối đa của thời gian chạy ảo và thời gian thực của tác vụ.

  4. Đặt thời gian chạy ảo của tác vụ thành thời gian chạy tạm thời.

3. Khi một quá trình đánh thức tại sao vruntime được điều chỉnh bằng cách trừ khỏi sched_latency?

Thời gian chạy ảo bị giảm đi vì giấc ngủ ít hơn một độ trễ đơn lẻ không được tính. Ví dụ: tác vụ không nên thay đổi vị trí của nó trong cây màu đỏ đỏ nếu nó có chỉ ngủ cho một độ trễ lịch biểu duy nhất.

4. Điều đó có thể dẫn đến các quy trình trong hàng đợi chạy với sự khác biệt lớn về giá trị vruntime không?

Tôi tin rằng logic được mô tả trong Bước 3 cho Câu hỏi 2, ngăn ngừa hoặc ít nhất là giảm thiểu điều đó.

Tài liệu tham khảo

sched.c Linux Kernel Source

sched_fair.c Linux Kernel Source

Notes on the CFS Scheduler Design

+0

trả lời cho câu hỏi 1 không thực sự trả lời về CFS lịch trong 'sysctl_sched_latency'. – kavadias

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