2014-08-31 19 views
6

Tôi đang viết một ứng dụng sử dụng thư viện của bên thứ ba để thực hiện tính toán nặng.Giảm chuyển đổi ngữ cảnh giữa các chủ đề có cùng mức độ ưu tiên

Thư viện này triển khai thực hiện song song nội bộ và sinh ra các chuỗi số nhất định. Tôi muốn chạy một số (dynamic count) trường hợp của thư viện này và do đó kết thúc với khá nhiều oversubscribing cpu.

Có cách nào tôi có thể tăng "lượng tử thời gian" của tất cả các chuỗi trong quá trình sao cho ví dụ: tất cả các chủ đề có mức độ ưu tiên bình thường hiếm khi chuyển đổi ngữ cảnh (lợi nhuận) trừ khi chúng được mang lại một cách rõ ràng thông qua ví dụ: semaphores?

Bằng cách đó, tôi có thể tránh được hầu hết chi phí hoạt động của việc oversubscribing CPU. Lưu ý rằng trong trường hợp này, tôi không quan tâm nếu một chuỗi bị bỏ đói trong vài giây.

EDIT:

Một cách phức tạp để thực hiện việc này là thực hiện lập lịch trình theo cách thủ công.

  1. Liệt kê tất cả các chuỗi có mức độ ưu tiên cụ thể (ví dụ: bình thường).
  2. Tạm dừng tất cả.
  3. Tạo vòng lặp tiếp tục/tạm dừng các chủ đề, ví dụ: 40 ms và đảm bảo không có luồng mor nào hơn số cpu hiện tại đang chạy.

Bất kỳ hạn chế lớn nào với phương pháp này? Bạn không chắc chắn chi phí của việc tiếp tục/đình chỉ một chủ đề là gì?

+0

Các cá thể lib có phụ thuộc lẫn nhau không? Nếu không, tại sao bạn không thể tránh quá tải các lõi có sẵn bằng cách chạy như nhiều chủ đề như lõi theo cách của một hồ bơi thread? –

+0

Cũng vì số lượng các cá thể thay đổi động rất khó. Tôi sẽ cần phải khởi tạo/reinitialize thư viện nhiều lần để thay đổi số lượng chủ đề phụ thuộc vào tải hiện tại. – ronag

+0

Nếu bạn sử dụng một threadpool, số lượng các cá thể thư viện chạy cùng một lúc sẽ giống như số lượng các chủ đề trong nhóm. Các thể hiện thư viện khác sẽ chỉ xếp hàng cho đến khi các chủ đề của pool có sẵn để xử lý chúng. Có vẻ như không có điểm trong việc áp dụng CPU cho một thể hiện nếu kết quả là quá tải? –

Trả lời

4

Không có gì đặc biệt bạn cần làm. Bất kỳ trình lên lịch nào cũng sẽ không cho phép các công tắc ngữ cảnh không được yêu cầu sử dụng một phần đáng kể tài nguyên CPU. Không nên sử dụng bất kỳ hệ điều hành nào không có bộ lập lịch phong nha.

Chi phí hoạt động của việc đăng ký vượt quá CPU là không phải là chi phí của các công tắc ngữ cảnh không được thực hiện. Tại sao? Bởi vì lịch trình chỉ đơn giản là có thể tránh những người. Trình lập lịch biểu chỉ thực hiện một chuyển đổi ngữ cảnh không bắt buộc khi có một lợi ích. Các chi phí thực hiện là:

  1. Nó có thể mất nhiều thời gian để hoàn thành một công việc vì làm việc nhiều hơn sẽ được thực hiện trên các công việc khác giữa khi công việc được bắt đầu và khi công việc kết thúc.

  2. Chủ đề bổ sung tiêu thụ bộ nhớ cho ngăn xếp của chúng và các thông tin theo dõi khác có liên quan.

  3. Chủ đề khác thường có ý nghĩa nhiều hơn (ví dụ, khi bộ nhớ được cấp phát) có thể có nghĩa là nhiều công tắc ngữ cảnh bắt buộc hơn.

Bạn chỉ muốn thay đổi hành vi của lịch trình khi bạn biết điều gì đó quan trọng mà người lên lịch không biết. Không có gì giống như đang diễn ra ở đây. Vì vậy, hành vi mặc định là những gì bạn muốn.

+0

Wel .. nó kinda phụ thuộc vào số lượng dữ liệu có thể cần phải được tải lại vào bộ đệm lõi. Chúng tôi không biết số tiền đó có thể là từ bài đăng OP: ( –

+0

Không, nhưng những người thiết kế bộ lập lịch biết bộ nhớ cache lớn đến mức nào.Vì vậy, họ có thể dễ dàng đảm bảo rằng không có quá nhiều thiết bị chuyển mạch bối cảnh không thể bắt buộc mà việc tải lại bộ đệm lõi là đáng kể. Và, tất nhiên, trừ khi họ không đủ năng lực, họ đã làm chính xác điều này. –

+0

Nó có thể không đáng kể, trên Windows anyway - Tôi đã thử nghiệm này. –

2

Bất kỳ hạn chế lớn nào với phương pháp này? Bạn không chắc chắn chi phí của tiếp tục/tạm ngừng một chuỗi là gì?

, sơ yếu lý lịch/đình chỉ thread hoạt động rất rất nguy hiểm thực hiện trong sử dụng chế độ của chương trình. Vì vậy, nó không nên được sử dụng (hầu như không bao giờ). Hơn nữa, chúng ta không nên sử dụng những khái niệm này để đạt được thứ gì đó mà bất kỳ trình lên lịch hiện đại nào cũng có cho chúng ta. Điều này cũng được đề cập trong bài viết khác của câu hỏi này.

Ở trên áp dụng cho bất kỳ hệ điều hành nào, nhưng từ thẻ bài SO, có vẻ như nó đã được yêu cầu cho hệ thống dựa trên Microsoft Windows. Bây giờ nếu chúng ta đọc về SuspendThread() từ MSDN, chúng tôi nhận được những điều sau đây:..

"Chức năng này được thiết kế chủ yếu để sử dụng bởi bộ dò lỗi Nó được không có ý định được sử dụng để đồng bộ hóa thread Calling SuspendThread trên một sợi sở hữu một đối tượng đồng bộ hóa, chẳng hạn như một mutex hoặc phần quan trọng, có thể dẫn đến bế tắc nếu chuỗi cuộc gọi cố gắng lấy một đối tượng đồng bộ thuộc sở hữu của một chuỗi bị treo ".

Vì vậy, hãy xem xét kịch bản trong đó chuỗi đã thu được một số tài nguyên (phần ngầm. Không mã..bằng thư viện hoặc chế độ hạt nhân), và nếu chúng ta tạm dừng chuỗi, điều này sẽ dẫn đến tình trạng bế tắc bí ẩn. quá trình sẽ chờ đợi tài nguyên cụ thể đó. Thực tế là chúng tôi không chắc chắn (bất kỳ lúc nào) trong chương trình của chúng tôi rằng loại tài nguyên nào được thu thập bởi bất kỳ chuỗi chạy nào, chuỗi tạm dừng/tiếp tục không phải là ý tưởng hay.

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