2010-11-10 48 views
31

Ai đó có thể vui lòng giải thích sự khác biệt giữa mô hình luồng ưu tiên và mô hình luồng không ưu tiên?Chủ đề ưu tiên Vs Chủ đề không ưu tiên

Theo hiểu biết của tôi:

  • mô hình luồng Non Preemptive: Khi một thread được bắt đầu nó không thể dừng lại hoặc điều khiển không thể được chuyển sang chủ đề khác cho đến khi thread đã hoàn thành nhiệm vụ của mình.
  • Mô hình luồng ưu tiên: Thời gian chạy được phép điều khiển bằng tay và từ bất kỳ lúc nào. Chủ đề ưu tiên cao hơn được ưu tiên hơn các chuỗi ưu tiên thấp hơn.

Có thể ai đó xin vui lòng:

  1. Giải thích nếu sự hiểu biết là đúng.
  2. Giải thích những ưu điểm và nhược điểm của cả hai mô hình.
  3. Ví dụ về thời điểm sử dụng nội dung sẽ thực sự hữu ích.
  4. Nếu tôi tạo một chuỗi trong Linux (hệ thống v hoặc Pthread) mà không đề cập đến bất kỳ tùy chọn nào (có bất kỳ ??) theo mặc định, mô hình luồng được sử dụng là mô hình luồng ưu tiên không?

Trả lời

27
  1. Không, hiểu biết của bạn không hoàn toàn chính xác. Chủ đề không được ưu tiên (gọi là hợp tác xã) thường tự kiểm soát năng suất để cho các luồng khác chạy trước khi chúng kết thúc (mặc dù chủ đề đó gọi tới số yield() (hoặc bất kỳ thứ gì) để thực hiện điều đó xảy ra.
  2. Thông thường sử dụng preemptive.Nếu bạn thấy thiết kế của bạn có rất nhiều chi phí chuyển đổi luồng, các đề tài hợp tác sẽ là một tối ưu hóa có thể.) tình huống, đây sẽ là một khoản đầu tư khá lớn với số tiền hoàn trả tối thiểu.
  3. Có, theo mặc định bạn sẽ nhận được luồng ưu tiên, mặc dù nếu bạn nhìn xung quanh gói CThreads, nó hỗ trợ luồng hợp tác. Rất ít người đủ (bây giờ) muốn đề hợp tác xã mà tôi không chắc chắn nó được cập nhật trong vòng thập kỷ qua mặc dù ...
+2

Chỉ cần lưu ý về yield(): không sử dụng nó trên Linux vì nó dẫn đến hiệu suất khủng khiếp. Một chuỗi được tạo ra sẽ được đẩy vào mặt sau của lịch trình luồng để chuỗi sẽ không được lên lịch cho đến khi mọi thứ khác trong toàn bộ hệ thống * đã có cơ hội. –

+0

Trong sự hiểu biết của tôi khi quá trình chính tạo ra hai chủ đề, họ sẽ thực hiện song song. Vì vậy, "Không ưu tiên luồng mô hình" thực hiện việc thực hiện như thế, (finish_thread_1) -> (finish_thread_2) -> main()? Tôi có nghĩa là sau khi thread 1 hoàn thành thread 2 sẽ bắt đầu sau đó sau khi hoàn thành, main() phương pháp sẽ gọi. Điều này có đúng không? Nếu vậy thì việc sử dụng "Chủ đề không ưu tiên" là gì? – rakeshNS

+0

@rakeshNS: các chủ đề không bắt buộc (hợp tác) có nghĩa là một luồng chạy cho đến khi nó gọi một số chức năng mà buộc/cho phép chuyển sang một luồng khác. Trong một số trường hợp, đó là một hàm 'yield' rõ ràng. Trong những trường hợp khác, cho phép các luồng khác chạy ẩn trong một số hàm khác.Ví dụ, trong Windows 16 bit, khi bạn gọi 'GetMessage', các luồng/quy trình khác có thể chạy (chúng được coi là các tiến trình, nhưng tất cả chúng đều dùng chung một không gian địa chỉ ...) –

13

Chủ đề không bắt buộc cũng được gọi là chủ đề hợp tác. Một ví dụ trong số này là POE (Perl). Một ví dụ khác là Mac OS cổ điển (trước OS X). Chủ đề hợp tác có độc quyền sử dụng CPU cho đến khi họ cung cấp cho nó lên. Trình lên lịch sau đó chọn một chuỗi khác để chạy.

Chủ đề ưu tiên có thể tự nguyện từ bỏ CPU giống như các hợp tác xã, nhưng khi không, nó sẽ được lấy từ chúng và trình lên lịch sẽ bắt đầu một chuỗi khác. POSIX & chủ đề SysV thuộc thể loại này.

Ưu điểm lớn của chuỗi hợp tác có hiệu quả cao hơn (trên máy đơn lõi, ít nhất) và xử lý đồng thời dễ dàng hơn: nó chỉ tồn tại khi bạn kiểm soát, do đó không cần khóa.

Ưu điểm lớn của các chủ đề ưu tiên là khả năng chịu lỗi tốt hơn: một luồng đơn không mang lại không ngăn tất cả các luồng khác thực thi. Cũng thường hoạt động tốt hơn trên các máy đa lõi, vì nhiều luồng thực thi cùng một lúc. Cuối cùng, bạn không phải lo lắng về việc đảm bảo bạn liên tục sinh sản. Điều đó có thể thực sự gây phiền nhiễu bên trong, ví dụ, một vòng lặp crunching số lượng lớn.

Bạn có thể kết hợp chúng, tất nhiên. Một chuỗi preemptive duy nhất có thể có nhiều luồng hợp tác chạy bên trong nó.

+0

Win16 cũng được hợp tác luồng. –

+1

@johnc Tôi đã khôi phục bản chỉnh sửa của bạn. "Exists" được dự định ở đó - đồng thời (nhiều chủ đề chạy cùng một lúc) chỉ tồn tại khi bạn cho phép một luồng khác chạy một cách rõ ràng bằng cách sinh lãi. "Thoát" không có ý nghĩa. Tôi cũng không chắc tại sao bạn thay đổi * không * thành * không phải là * ... – derobert

+1

@derobet Tốt rồi. Đó là một bản chỉnh sửa được đề xuất có vẻ hợp lý vào thời điểm đó, mặc dù do lỗi đánh máy trong đề xuất, tôi đã chỉnh sửa lại. Vào thời điểm tôi liên kết từ 'yield' với từ 'exit' thay vì 'exist'. Thành thật mà nói, đó là lỗi chính tả; 'not -> is'n not' (hoặc tương tự) khiến tôi chấp nhận và chỉnh sửa đề xuất. Tôi xin lỗi vì nỗi ám ảnh của tôi về chính tả chính xác đã khiến tôi làm hỏng câu trả lời của bạn – johnc

5

Nếu bạn sử dụng không ưu tiên nó không có nghĩa là quá trình mà không làm bối cảnh chuyển mạch khi quá trình đang chờ I/O. Người điều phối sẽ chọn một quy trình khác theo mô hình lập lịch biểu. Trong mô hình này, chúng ta phải tin tưởng quá trình.

không ưu tiên:

chuyển đổi bối cảnh 1.less = ít trên đầu đó có thể là hợp lý trong mô hình phi preemptive

2.It dễ dàng hơn để xử lý vì nó có thể được xử lý trên single-core vi xử lý

ưu tiên:

Ưu điểm:

1.In mô hình này, chúng tôi có ưu tiên có thể giúp chúng ta có quyền kiểm soát nhiều hơn vào quá trình

chạy

2.We có thể xem đồng thời tốt hơn

3.we có thể xử lý một hệ thống gọi mà không ngăn chặn toàn bộ hệ thống

Nhược điểm:

1.We cần thuật toán phức tạp để khóa và chúng tôi có vấn đề phần quan trọng mà nên được xử lý

2.Often một chi phí lớn mà chúng tôi phải trả