2009-04-19 49 views
11

Tôi đang cố gắng để hiểu cách linux syscall sched_setaffinity() hoạt động. Đây là một câu hỏi tiếp theo từ câu hỏi của tôi here.Sched_setaffinity() hoạt động như thế nào?

Tôi có this guide, giải thích cách sử dụng syscall và có ví dụ khá gọn gàng (đang hoạt động!).

Vì vậy, tôi đã tải xuống Linux 2.6.27.19 kernel sources.

Tôi đã thực hiện 'grep' cho các dòng chứa syscall đó và tôi nhận được 91 kết quả. Không hứa hẹn.

Cuối cùng, tôi đang cố gắng để hiểu làm thế nào hạt nhân có khả năng thiết lập các con trỏ chỉ dẫn cho một lõi cụ thể (hoặc bộ xử lý.)

Tôi quen thuộc với các chương trình như thế nào đơn lõi-sợi đơn công việc. Người ta có thể đưa ra hướng dẫn 'jmp foo' và điều này về cơ bản đặt IP thành địa chỉ bộ nhớ của nhãn 'foo'. Nhưng khi có nhiều lõi, người ta phải nói "lấy lệnh tiếp theo tại địa chỉ bộ nhớ foo, và đặt con trỏ chỉ dẫn cho số lõi 2 để bắt đầu thực hiện ở đó."

Ở đâu, trong mã lắp ráp, chúng tôi có chỉ định lõi nào thực hiện thao tác đó không?

Quay lại mã hạt nhân: điều gì quan trọng ở đây? Tệp 'kernel/sched.c' có một hàm gọi là sched_setaffinity(), nhưng trả về kiểu "long" - không phù hợp với số manual page của nó. Vậy điều gì quan trọng ở đây? Mô-đun nào trong số các mô-đun này hiển thị hướng dẫn lắp ráp Mô-đun nào đang đọc 'task_struct', nhìn vào thành viên 'cpus_allowed', và sau đó dịch thành một lệnh? (Tôi cũng đã thử qua nguồn glibc - nhưng tôi nghĩ rằng nó chỉ thực hiện cuộc gọi đến mã hạt nhân để hoàn thành nhiệm vụ này.)

Trả lời

9

sched_setaffinity() chỉ cần cho bộ lập lịch biết CPU nào là quy trình/luồng được phép chạy, sau đó gọi lại lịch biểu.

Trình lên lịch thực sự chạy trên từng CPU, do đó, nó sẽ có cơ hội quyết định nhiệm vụ nào sẽ thực thi tiếp theo trên CPU cụ thể đó.

Nếu bạn quan tâm đến cách bạn thực sự có thể gọi một số mã trên các CPU khác, tôi đề nghị bạn hãy xem smp_call_function_single(). Trong trường hợp chúng tôi muốn gọi một cái gì đó trên một CPU khác, điều này gọi là generic_exec_single(). Sau đó, chỉ cần thêm hàm vào hàng đợi cuộc gọi của CPU mục tiêu và buộc sắp xếp lại lịch biểu thông qua một số công cụ IPI (nếu hàng đợi trống).

Điểm mấu chốt là: không có biến thể SMP thực tế của hướng dẫn _jmp_. Thay vào đó, mã chạy trên các CPU khác hợp tác để hoàn thành nhiệm vụ.

1

Ở đâu, trong mã lắp ráp, chúng tôi có chỉ định lõi nào thực hiện thao tác đó không?

Không có hội đồng nào tham gia ở đây. Mỗi nhiệm vụ (thread) được gán cho một CPU (hoặc lõi trong thuật ngữ của bạn) tại một thời điểm. Để ngừng chạy trên một CPU cụ thể và tiếp tục trên một CPU khác, nhiệm vụ phải "migrate" (cũng this). Khi một tác vụ di chuyển từ một CPU này sang CPU khác, bộ lập lịch picks CPU không hoạt động trong số các CPU được cho phép bởi sched_setaffinity().

Không có hướng dẫn lắp ráp ma thuật nào được ban hành.Hạt nhân có một cái nhìn cấp thấp hơn về phần cứng, mỗi CPU là một đối tượng riêng biệt, rất khác so với cách nó trông giống như các quy trình không gian người dùng (trong không gian người dùng, CPU gần như vô hình).

4

Tôi nghĩ rằng điều bạn không hiểu là hạt nhân đang chạy trên tất cả lõi CPU. Tại mỗi ngắt hẹn giờ (~ 1000 mỗi giây), bộ lập lịch chạy trên mỗi CPU và chọn một quá trình để chạy. Không có một CPU nào bằng cách nào đó bảo những người khác bắt đầu chạy một tiến trình. sched_setaffinity() hoạt động bằng cách chỉ đặt cờ trên quy trình. Bộ lập lịch đọc những lá cờ này và sẽ không chạy quá trình đó trên CPU của nó nếu nó được thiết lập không.

+0

Bỏ qua nhận xét này – kumar

+0

<< Tại mỗi timer ngắt (~ 1000 per second), chức năng lịch chạy trên mỗi CPU và chọn một quá trình để chạy. Tôi có câu hỏi ở đây: Trình lập lịch biểu là một đoạn mã thực thi trong hạt nhân, Một đoạn mã luôn thực thi tại CPU đơn tại bất kỳ thời điểm nào. Vì vậy, đó có nghĩa là scheduler (gọi bởi bộ đếm thời gian ngắt) chuyển đổi giữa CPU ... Sau đó, có nghĩa là nếu tôi có nhiều CPU nó là chi phí trên không chạy scheduler trên TẤT CẢ CPU .... bit nhầm lẫn ở đây. – kumar

+0

Các CPU khác nhau chạy các bản sao khác nhau của bộ lập lịch. Bộ đếm thời gian gián đoạn được nâng lên trên mỗi CPU riêng lẻ. Vì vậy, nếu bạn có 4 CPU, bạn có 4 bộ lập lịch. Trên thực tế mã của lịch trình là như nhau, nhưng dữ liệu là khác nhau. – osgx

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