2008-12-12 36 views
5

5, 100, 1000?Có bao nhiêu luồng đồng thời trong một ứng dụng?

Tôi đoán, "nó phụ thuộc", nhưng về cái gì?

Điều gì phổ biến trong các ứng dụng chạy dưới dạng trình nền/dịch vụ máy chủ?

Giới hạn cứng là gì?

Cho rằng máy có thể xử lý khối lượng công việc tổng thể, làm thế nào để tôi xác định xem có bao nhiêu luồng trên không bắt đầu có tác động đến hiệu suất?

Điểm khác biệt quan trọng giữa hệ điều hành là gì?

Điều gì khác cần được xem xét?

Tôi hỏi vì tôi muốn sử dụng các luồng trong ứng dụng để sắp xếp các thành phần phụ của ứng dụng không chia sẻ dữ liệu và được thiết kế để thực hiện công việc của chúng song song. Vì ứng dụng cũng sẽ sử dụng các nhóm luồng để song song một số nhiệm vụ, tôi đã tự hỏi tại thời điểm nào tôi nên bắt đầu nghĩ về số lượng các luồng sẽ chạy tổng cộng.

Tôi biết quy tắc n + 1 là hướng dẫn để xác định số lượng chuỗi đồng thời hoạt động trên cùng một tác vụ để đạt được hiệu suất. Tuy nhiên, tôi muốn sử dụng các chủ đề giống như một quy trình có thể sử dụng các quy trình trong phạm vi rộng hơn, i. e. để tổ chức các nhiệm vụ độc lập không nên can thiệp lẫn nhau.

Trong this related question, một số người khuyên bạn nên giảm thiểu số lượng chủ đề vì độ phức tạp được thêm vào. Với tôi, dường như các chủ đề cũng có thể giúp giữ cho mọi thứ được sắp xếp trật tự hơn và thực sự giảm nhiễu. Đúng không?

+0

Có lẽ bạn có thể đăng thêm thông tin về môi trường hoạt động của mình? Kiến trúc CPU, kích thước không gian địa chỉ, hệ điều hành, các mẫu sử dụng ứng dụng, tải dự kiến ​​- những điều này tạo ra tất cả sự khác biệt trên thế giới. –

+0

Không, xin lỗi, điều đó thực sự sẽ nằm ngoài quan điểm của tôi. Ứng dụng tôi đang viết được thiết kế cho một số môi trường và tôi muốn biết những điều tôi nên tìm kiếm, vì vậy tôi có thể đánh giá tốt hơn các vấn đề môi trường cụ thể. –

Trả lời

6

Tôi không thể trả lời câu hỏi của bạn về "số tiền là bao nhiêu" nhưng tôi đồng ý rằng bạn không nên sử dụng đề tài cho mọi tác vụ có thể.

Số tối ưu số lượng chủ đề cho hiệu suất của ứng dụng là (n + 1), trong đó n là số lượng bộ xử lý/lõi máy tính/máy quét của bạn.

Số tiền chủ đề thực tế của bạn khác với n + 1, số tiền tối ưu ít hơn và nhận được tài nguyên hệ thống của bạn bị lãng phí khi tính toán chuỗi.

Vì vậy, thông thường bạn sử dụng 1 luồng cho giao diện người dùng, 1 chuỗi cho một số tác vụ chung và (n + 1) chủ đề cho một số tác vụ tính toán lớn.

+0

Vâng, tôi biết quy tắc n + 1 là hướng dẫn để xác định số lượng chủ đề đồng thời hoạt động trên cùng một tác vụ để đạt được hiệu suất. Tuy nhiên, tôi muốn sử dụng các chủ đề giống như một quy trình có thể sử dụng các quy trình trong phạm vi rộng hơn, i. e. để tổ chức các nhiệm vụ độc lập không nên can thiệp lẫn nhau. –

+0

Điều đó tùy thuộc vào loại nhiệm vụ của chúng. Nhưng trong 99% các trường hợp, bạn có thể thực hiện nó với 1-2 chủ đề. Ví dụ: nếu bạn tạo một số máy chủ trò chơi, nơi đang đi bộ trên đường phố của 1k + NPC, bạn thường lặp qua hàng đợi. Vì vậy, bạn nhận được một hàng đợi của NPC, và khi một thread được giải phóng, phải mất 1 NPC từ hàng đợi. – bezmax

+0

Số lượng chủ đề tối ưu thay đổi * rộng rãi * tùy thuộc vào ứng dụng đang hoạt động. Nếu nó có nhiều IO bị ràng buộc thì số lượng chủ đề tối ưu có thể cao hơn đáng kể so với số lượng lõi. Tương tự, ứng dụng của bạn có thể có một số luồng trong trạng thái chờ/chờ. –

0

Lớp học ThreadPool của Microsoft giới hạn 25 chủ đề cho mỗi bộ xử lý. Giới hạn được dựa trên context switching giữa các chủ đề và memory consumed theo từng chuỗi. Vì vậy, đó là một hướng dẫn tốt nếu bạn đang ở trên nền tảng Windows.

1

Thực ra Ajmastrean hơi lạc hậu. Trích dẫn từ riêng hồ bơi link

Các chủ đề của mình có kích thước mặc định của 250 đề người lao động mỗi sẵn bộ xử lý , và 1000 I/O hoàn đề. Số lượng các chủ đề trong hồ sơ chủ đề có thể được thay đổi bằng cách sử dụng phương pháp Set2axSetMaxThreads.

Nhưng nói chung, tôi nghĩ 25 thực sự là nơi mà luật giảm dần (và khả năng lập trình để theo dõi những gì đang diễn ra) bắt đầu có hiệu lực. Mặc dù Max là đúng, miễn là tất cả các chủ đề đang thực hiện tính toán không chặn n + 1 là số tối ưu, trong thế giới thực, hầu hết các nhiệm vụ luồng tôi thực hiện có xu hướng được thực hiện trên các công cụ với một số loại IO.

+0

Tôi không lỗi thời, Microsoft đang đợi trước. Ở đây trong Big-Corporation, chúng tôi vẫn sử dụng .NET 2.0 Framework. –

+0

Thực ra kích thước hồ bơi đã được thay đổi trong .NET 2.0. Chúng tôi vẫn còn bị mắc kẹt trong khuôn khổ đó. –

1

Cũng phụ thuộc vào kiến ​​trúc của bạn. Ví dụ. trong NVIDIA GPGPU lib CUDA bạn có thể đặt trên một chủ đề đa xử lý 8 chủ đề 512 mô phỏng. Bạn có thể hỏi tại sao chỉ định mỗi bộ xử lý vô hướng 64 luồng? Câu trả lời là dễ dàng: Nếu tính toán không phải là tính toán bị ràng buộc nhưng bộ nhớ IO bị ràng buộc, bạn có thể ẩn các độ trễ mem bằng cách thực hiện các chủ đề khác. Tương tự áp dụng cho các CPU bình thường. Tôi có thể nhớ rằng đề xuất cho tùy chọn song song để tạo "-j" là sử dụng khoảng 1,5 lần số lõi bạn có. Nhiều nhiệm vụ biên dịch là gánh nặng IO nặng nề và nếu một tác vụ phải chờ đĩa cứng, mem ... bất cứ điều gì, CPU có thể hoạt động trên một luồng khác.

Tiếp theo bạn phải xem xét việc chuyển đổi nhiệm vụ/luồng tốn kém đến mức nào. Ví dụ. nó được cung cấp miễn phí, trong khi CPU phải thực hiện một số công việc cho một chuyển đổi ngữ cảnh. Vì vậy, nói chung bạn phải ước tính nếu hình phạt cho hai công tắc chuyển mạch dài hơn thời gian mà luồng sẽ chặn (phụ thuộc nhiều vào các ứng dụng của bạn).

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