2013-02-25 20 views
5

Tôi là người mới trên Linux Kernel. Hiện tại, tôi đã xem xét các mã nhàn rỗi và có một câu hỏi. Khi bộ xử lý không có bất kỳ taks trong runqueue riêng của họ sau đó nó có thể đi vào chế độ nhàn rỗi, cụ thể WFI (wating cho gián đoạn). (Tất cả những gì tôi đề cập là về kiến ​​trúc ARM không phải là X86. Vì vậy, có điều gì đó không đúng với X86.) Sau khi ở trạng thái WFI, có thể bộ vi xử lý khác (không nhàn rỗi) muốn lan truyền . . Vào thời điểm đó, một bộ xử lý bận rộn làm cho nhiệm vụ bị im lặng. Theo quan điểm của tôi, khi nhiệm vụ được imigrated, bộ xử lý nhàn rỗi nên thức dậy immidiatley để xử lý nhiệm vụ. đúng? Tuy nhiên, tôi không thể tìm thấy bất kỳ mã nào đánh thức bộ xử lý nhàn rỗi nhưng chỉ tìm thấy mã về đăng ký tác vụ cho runleue của bộ xử lý nhàn rỗi.Làm thế nào để nhân Linux ngừng hoạt động nhàn rỗi lên khi nhiệm vụ mới được tạo ra?

Tôi muốn biết cơ chế nào đằng sau việc đánh thức bộ xử lý khi có nhiệm vụ mới. Hoặc nó chỉ di chuyển công việc từ hàng đợi này sang hàng đợi khác hơn là để cho đến khi được đánh thức bởi một số IRQ không thể đoán trước?

Xin chỉ cho tôi biết sự thật :)

Trả lời

6

WFI là một hướng dẫn đồng bộ xử lý đặc biệt cho ARM. Ví dụ:

ENTRY(cpu_arm946_do_idle) 
     mcr  p15, 0, r0, c7, c0, 4   @ Wait for interrupt 
     mov  pc, lr 

Không liên quan gì đến Linux (trực tiếp).

Có nhiệm vụ idle đặc biệt chạy lệnh WFI trên ARM, nếu không có việc phải làm. Nhiệm vụ idle là nhiệm vụ Linux ưu tiên thấp nhất, được lên lịch nếu không có gì khác. Nếu WFI được thực hiện bởi idle, một số trình điều khiển sẽ bị gián đoạn (có thể là bộ hẹn giờ) khi không có việc gì để thực hiện. Trong trường hợp SMP, nó sẽ không đi đến idle nếu có các quy trình khác có thể được di chuyển; lịch trình kiểm tra này. Nếu tải lên cao, thì bộ xử lý bận cần phải wake các thiết bị khác; Trong trường hợp ARM bị gián đoạn. Thông thường, xử lý này nằm ở vòm/vòm /kernel/process.c. Ví dụ: x86default_idle(). Tôi không biết chi tiết về cách hoạt động của các tác phẩm x86 nhưng bạn có thể xem nguồn.

Đối với câu hỏi của bạn Làm thế nào để nhân Linux ngừng hoạt động nhàn rỗi khi tác vụ mới được tạo?, câu trả lời là không. Chỉ fork() (và một số chức năng tương tự) có thể tạo một nhiệm vụ mới; ban đầu từ nhiệm vụ init và sau đó là một trong số đó là trẻ em. Nếu bạn có công việc cron, công việc sẽ lên lịch hẹn giờ trước khi đến sleep/idle. Bộ hẹn giờ này sẽ đánh thức hệ thống, lập lịch lại cron và sau đó cron sẽ gọi fork(), để tạo tác vụ mới.

cơ chế có liên quan khác là cpufreq, cpuidle, kernel/power, vv

Các thật luôn là khách quan/chủ quan và chắc chắn không phải là toàn cầu.Chỉ cho tôi số metric cho số sự thật và tôi có thể hiển thị cho bạn sự thật.

0

chỉ cần đặt cờ của CPU như mã bên dưới sau khi tạo chuỗi.

= > thread's task_struct->flags |= PF_WAKE_UP_IDLE; 
+0

Đây là chủ đề được đánh thức, không phải để đánh thức CPU. Cờ PF_WAKE_UP_IDLE không có trong hạt nhân Linux phiên bản 3.18 trở lên. – Zhifei

0

xem phương thức select_task_rq_fair(), là phương thức CFS :: select_task_rq(). Đây là trường hợp điển hình nhất mà người lên lịch đánh thức nhiệm vụ nhàn rỗi để cân bằng lại hàng đợi chạy.

0

smp_send_reschedule() sẽ gửi IPI_RESCHEDULE tới bộ xử lý không hoạt động. Điều này sẽ đánh thức nó từ wfi. Nó được gọi từ vài nơi, một ví dụ là wake_up_process -> try_to_wake_up -> try_to_wake_up -> ttwu_queue -> ttwu_queue_remote (tên hàm từ kernel 3.4).

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