Tại sao không phải Chủ đề xanh?


33

Mặc dù tôi biết các câu hỏi về vấn đề này đã được đề cập (ví dụ: https://stackoverflow.com/questions/5713142/green-threads-vs-non-green-threads ), tôi không cảm thấy mình đã có câu trả lời thỏa đáng .

Câu hỏi là: tại sao JVM không hỗ trợ các chủ đề xanh nữa?

Nó nói điều này trên Câu hỏi thường gặp về Java kiểu mã :

Một luồng màu xanh lá cây đề cập đến một chế độ hoạt động cho Máy ảo Java (JVM) trong đó tất cả các mã được thực thi trong một luồng của hệ điều hành.

Và điều này trên java.sun.com :

Nhược điểm là sử dụng các luồng màu xanh lá cây có nghĩa là các luồng hệ thống trên Linux không bị lợi dụng và do đó máy ảo Java không thể mở rộng được khi thêm CPU bổ sung.

Dường như với tôi, JVM có thể có một nhóm các quy trình hệ thống bằng với số lượng lõi và sau đó chạy các luồng màu xanh lá cây trên đó. Điều này có thể cung cấp một số lợi thế lớn khi bạn có số lượng luồng rất lớn thường chặn (chủ yếu là do số lượng luồng của JVM hiện tại giới hạn số lượng luồng).

Suy nghĩ?


5
Đối với tôi, câu hỏi dường như: Tại sao chủ đề màu xanh lá cây? Tại sao lại giới thiệu đa luồng bằng cách mô phỏng nó ở mức JVM thông qua nhiều quy trình? Đó là rất nhiều đau đớn và chi phí cho việc dường như không có lợi ích gì ngoài việc cho phép các lập trình viên hào phóng hơn với các chủ đề sinh sản (và tôi không tin đó là một lợi thế).

4
Vâng, đó là về một mô hình lập trình đồng thời có quy mô. Hiện tại, trong Java, nếu bạn muốn khả năng mở rộng, bạn chuyển sang NIO với nhóm luồng của riêng bạn. Ít nhất, đó là sự hiểu biết của tôi.
redjamjar

3
Sự hiện diện của những thứ như < akka.io > hỗ trợ các chủ đề nhẹ cũng khiến tôi nghĩ rằng có nhu cầu. Trên thực tế, chỉ cần tìm thấy một cuộc thảo luận khá tốt ở đây < stackoverflow.com/questions/7458782/ trên >
redjamjar

2
@delnan Vì chuyển đổi ngữ cảnh cho chi phí chủ đề gốc. Chủ đề màu xanh lá cây có ít chi phí hơn cho chuyển đổi ngữ cảnh và đồng bộ hóa quá trình. Ngoài ra, số lượng luồng màu xanh lá cây thực tế là không giới hạn (có thể là hàng trăm nghìn trong số chúng mà không quá căng thẳng cho quá trình VM), trong khi số lượng luồng gốc bị hạn chế bởi hệ điều hành và bộ nhớ.
permeakra

Phải mất một thời gian dài trước khi JVM hỗ trợ các luồng gốc trực tiếp. Chủ đề xanh là giải pháp trung gian cho đến lúc đó.
Thorbjørn Ravn Andersen

Câu trả lời:


29

Tôi nhớ JVM từ bỏ các luồng màu xanh lá cây và chuyển sang các luồng gốc. Điều này là vì hai lý do đơn giản: các luồng màu xanh lá cây là rác rưởi và cần phải hỗ trợ bộ xử lý đa lõi với nỗ lực hạn chế của nhà phát triển có sẵn tại Sun.

Đây là một sự xấu hổ - các chủ đề màu xanh lá cây cung cấp một sự trừu tượng tốt hơn nhiều, cho phép đồng thời là một công cụ hữu ích không phải là một vấp ngã. Nhưng các chủ đề màu xanh lá cây không được sử dụng nếu một số rào cản không thể vượt qua:

  • họ phải sử dụng tất cả các lõi cpu có sẵn cho họ

  • chuyển đổi bối cảnh phải rẻ

  • I / O có thể chặn bất kỳ luồng nào tham gia vào nó, nhưng không phải bất kỳ luồng nào khác và chắc chắn không phải tất cả các luồng khác, đó là trường hợp trong một số triển khai ban đầu.

Tôi thường tự hỏi tại sao đa luồng lại khó khăn như vậy trong Java nhưng giờ nó đã trở nên rõ ràng hơn - cuối cùng là để chuyển sang các luồng gốc, đó là:

  • giỏi sử dụng tất cả các lõi cpu

  • giỏi thực sự đồng thời, cung cấp I / O độc lập, v.v.

  • chậm chuyển đổi ngữ cảnh (so với triển khai luồng xanh tốt nhất)

  • tham lam khủng khiếp với bộ nhớ, do đó hạn chế số lượng có thể sử dụng tối đa của chúng

  • một sự trừu tượng kém cho bất kỳ cơ sở nào để thể hiện thế giới thực, tất nhiên là rất đồng thời.

Ngày nay, rất nhiều thời gian lập trình viên bây giờ đi vào việc mã hóa I / O không chặn, tương lai, v.v ... Thật xấu hổ khi chúng ta không có mức độ trừu tượng tốt hơn.

Để so sánh, bên cạnh Erlang, ngôn ngữ Go mới thực hiện tốt công việc đồng thời rất lớn. Ông nội của tất cả họ vẫn là Occam , vẫn là một dự án nghiên cứu đang diễn ra.


chúng ta đã đi được bao xa kể từ thời điểm bạn đăng bài: O
Dmitry

3
Than ôi, Rust là một ngôn ngữ khác từ bỏ trừu tượng đồng thời tốt hơn. Họ cũng quyết định chuyển từ chủ đề hợp tác sang chủ đề bản địa.
Rick-777

2
@ Rick-777 Rust quá thấp để làm điều đó.
Malcolm

15

Một quá trình giả mạo nhiều chủ đề có rất nhiều vấn đề. Một trong số đó là tất cả các luồng giả mạo bị đình trệ trên bất kỳ lỗi trang nào.

Sự thay thế mà bạn đề xuất, một nhóm các quy trình, có một số ưu điểm và một số nhược điểm. Lợi thế lớn nhất, sự cô lập của các 'chủ đề', thực sự sẽ không giúp bạn có nhiều ở đây. Nhược điểm lớn, cực kỳ khó thực hiện và đồng bộ hóa kém hiệu quả hơn, là kẻ giết người thỏa thuận ở đây.

Tuy nhiên, tôi đồng ý rằng tồn tại một số ứng dụng (không phải Java) trong đó một nhóm các quy trình mà bạn có thể sử dụng như một nhóm các luồng (nhưng với sự cô lập nhiều hơn) sẽ là một điều tuyệt vời. Chủ đề chia sẻ khá nhiều thứ. Với các quy trình, bạn có thể chọn cụ thể những gì để chia sẻ. Theo hiểu biết của tôi, không ai đã nỗ lực để thực hiện nó.


Occam tuyên bố sẽ cung cấp điều này. Đó là một ngôn ngữ quan trọng trong thập niên 80, nhưng bị thiếu kinh phí phát triển và do đó chỉ trở thành một lĩnh vực nghiên cứu. Nhưng ý tưởng của nó về đồng thời vẫn vững chắc như bây giờ và vẫn chưa được cải thiện.
Rick-777

Nếu bạn là "đa luồng" a la golang (lập lịch loại "M: N") thì về mặt lý thuyết chỉ có một luồng màu xanh lá cây bị chặn bởi một lỗi trang vì các luồng khác có thể "nhặt chùng" (các luồng màu xanh lá cây khác). .. softwareengineering.stackexchange.com/questions/222642/ từ
rogerdpack

13

Sẽ không có lợi ích gì cho một mã Java trung bình. Java không phải là Erlang và các lập trình viên Java không có cùng suy nghĩ như các lập trình viên Erlang. Ngôn ngữ không bao giờ có ý định được sử dụng theo cách này.

Nếu bạn muốn xử lý nhẹ thực sự - sử dụng Erlang và tạo hàng ngàn luồng giao tiếp qua tin nhắn. Trong Java, bạn sẽ có một tá các luồng chia sẻ một bộ nhớ chung với các biến và ngữ nghĩa. Nó chỉ là một mô hình lập trình khác nhau, được thiết kế cho một loạt các vấn đề khác nhau.


Vì vậy, để làm rõ mặc dù, đó là một cách tiếp cận hữu ích trong Erlang. Và, bỏ qua các vấn đề của tư duy Java, nó thực sự có thể giúp gì?
redjamjar

1
@redjamjar, không chắc là hữu ích trong Java, bản thân ngôn ngữ không hoàn toàn phù hợp cho việc sử dụng đó và lợi thế chính (và duy nhất) của nó - cơ thể rộng lớn sẵn sàng sử dụng các thư viện - sẽ không phù hợp với người ngoài hành tinh như vậy phương pháp lập trình.
SK-logic

Phải, nếu bạn muốn mô hình đó, chỉ cần sử dụng Erlang, nó sẽ là một thứ tự cường độ dễ dàng hơn
Zachary K

1
Java! = JVM, chỉ cần nói :)
Kamil Tomšík

1
@Bane, những "lợi thế" này chỉ tồn tại nếu bạn không có gì để so sánh
SK-logic
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.