2011-09-22 7 views
5

Tôi có hai mã C++ được gọi là a và một được gọi là b. Tôi đang chạy trong một 64 bit Linux, bằng cách sử dụng thư viện Boost threading.sản lượng giữa các quy trình khác nhau

tạo 5 luồng nằm trong vòng lặp không kết thúc thực hiện một số thao tác. Mã b tạo 5 chuỗi nằm trong vòng lặp không kết thúc gọi hàm yield().

Tôi đang sử dụng máy lõi tứ ... Khi chỉ gọi một mã, nó nhận được gần 400% mức sử dụng CPU. Khi chỉ gọi số b, nó nhận được gần 400% mức sử dụng CPU. Tôi đã mong đợi nó.

Nhưng khi chạy cùng nhau, tôi đã mong rằng mã b được sử dụng hầu như không có gì của CPU và a sử dụng 400%. Nhưng trên thực tế cả hai đều sử dụng bằng phần của CPU, gần 200%.

Câu hỏi của tôi là, không năng suất() hoạt động giữa quá trình khác nhau? Có cách nào để làm cho nó hoạt động theo cách tôi mong đợi không?

+1

Tôi không có câu trả lời và tôi cho rằng câu hỏi của bạn thú vị vì yêu cầu sched_yield đặt quá trình ở mặt sau của hàng đợi chạy, nhưng điều này có thể thú vị đối với bạn về cách gọi tính hữu ích thực tế của sử dụng sched_yield: http://kerneltrap.org/Linux/Using_sched_yield_Improperly – Kevin

+1

Đoạn mã này ngụ ý rằng phiên bản hạt nhân Linux của bạn quan trọng: http://books.google.com.vn/books?id=k_ocKY0iegsC&pg=PA168&lpg=PA168&dq=sched_yield+ đến + một quá trình + & nguồn = bl & ots = VgCNK6kGIu & sig = gyduzTS_2EY8v8wwwAE8MScSLsg & hl = vi & ei = 68N7TqfOCcXPiAK6qrDVBw & sa = X & oi = book_result & ct = kết quả & resnum = 3 & ved = 0CCgQ6AEwAg # v = onepage & q = sched_yield% 20to% 20another% 20process & f = false – Kevin

Trả lời

2

Linux sử dụng ưu tiên luồng động. Mức độ ưu tiên tĩnh mà bạn đặt bằng tốt đẹp chỉ là giới hạn mức độ ưu tiên động.

Khi chuỗi sử dụng toàn bộ thời gian, hạt nhân sẽ giảm mức ưu tiên và khi chuỗi không sử dụng toàn bộ thời gian của mình (bằng cách thực hiện IO, gọi chờ/lợi nhuận, v.v.) hạt nhân sẽ tăng ưu tiên.

Vì vậy, tôi đoán rằng quá trình b chủ đề có mức độ ưu tiên cao hơn, do đó chúng thực thi thường xuyên hơn.

3

Vì vậy, bạn có 4 lõi đang chạy 4 chủ đề thuộc về A. Có 6 chủ đề trong hàng đợi - 1 A và 5 B. Một trong những chủ đề Một luồng thoát thời gian của nó và trả về hàng đợi. Trình lên lịch chọn chuỗi chủ đề có thể chạy tiếp theo từ hàng đợi. Xác suất mà tread này thuộc về B là gì? 5/6. Ok, thread này được bắt đầu, nó gọi sched_yield() và trả về hàng đợi. Xác suất mà các sợi tiếp theo sẽ là một sợi B một lần nữa? 5/6 một lần nữa!

Quy trình B nhận thời gian CPU lặp đi lặp lại và cũng buộc hạt nhân thực hiện các công tắc ngữ cảnh tốn kém.

sched_yield được thiết kế cho một trường hợp cụ thể - khi một chuỗi tạo một chuỗi khác có thể chạy được (ví dụ: mở một mutex). Nếu bạn muốn B đợi trong khi A đang làm việc trên một cái gì đó quan trọng - hãy sử dụng một số cơ chế đồng bộ có thể đặt B ngủ cho đến khi A đánh thức nó lên