Có nhiều giải pháp hướng tới việc triển khai các luồng "không gian người dùng". Có thể là gorang.org goroutines, các chủ đề màu xanh lá cây của python, các đồng bộ của C#, các quá trình của erlang vv. Ý tưởng là cho phép lập trình đồng thời ngay cả với một số lượng hạn chế hoặc một số chủ đề.
Đây là lớp trừu tượng. Nó dễ dàng hơn cho nhiều người để nắm bắt khái niệm này và sử dụng nó hiệu quả hơn trong nhiều tình huống. Nó cũng dễ dàng hơn cho nhiều máy (giả định một trừu tượng tốt), kể từ khi mô hình di chuyển từ chiều rộng để kéo trong nhiều trường hợp. Với pthreads (như một ví dụ), bạn có tất cả các điều khiển. Với các mô hình luồng khác, ý tưởng là sử dụng lại các luồng, cho quá trình tạo một tác vụ đồng thời không tốn kém và sử dụng một mô hình luồng hoàn toàn khác nhau. Nó dễ dàng hơn để tiêu hóa mô hình này; có ít hơn để tìm hiểu và đo lường, và kết quả nói chung là tốt.
Điều tôi không hiểu là tại sao các chuỗi hệ điều hành lại quá đắt? Như tôi thấy nó, dù là cách nào bạn cũng phải lưu ngăn xếp của nhiệm vụ (chuỗi hệ điều hành, hoặc chủ đề của người dùng), đó là vài chục kilobyte, và bạn cần một bộ lập lịch để di chuyển giữa hai nhiệm vụ.
Tạo chuỗi là tốn kém và ngăn xếp yêu cầu bộ nhớ. Đồng thời, nếu quá trình của bạn đang sử dụng nhiều luồng, thì chuyển đổi ngữ cảnh có thể giết hiệu suất. Vì vậy, các mô hình luồng nhẹ trở nên hữu ích vì một số lý do. Tạo một chuỗi hệ điều hành đã trở thành một giải pháp tốt cho các tác vụ vừa và lớn, lý tưởng ở các số thấp. Đó là hạn chế và tốn khá nhiều thời gian để duy trì.
Chủ đề công việc/luồng/chủ đề người dùng không cần phải lo lắng về việc chuyển đổi ngữ cảnh hoặc tạo chuỗi. Nó thường "tái sử dụng tài nguyên khi nó trở nên có sẵn, nếu nó chưa sẵn sàng ngay bây giờ - cũng, xác định số lượng chủ đề hoạt động cho máy này".
Chủ đề cấp cao hơn (IMO) rất đắt vì chúng không được các kỹ sư sử dụng đúng cách - hoặc có quá nhiều và có rất nhiều chuyển ngữ cảnh, cạnh tranh cho cùng một tập hợp tài nguyên, nhiệm vụ quá nhỏ. Phải mất nhiều thời gian hơn để hiểu cách sử dụng các luồng hệ điều hành một cách chính xác và cách áp dụng tốt nhất cho bối cảnh thực thi của chương trình.
Hệ điều hành cung cấp cả hai chức năng này miễn phí.
Chúng có sẵn, nhưng chúng không miễn phí. Chúng rất phức tạp và rất quan trọng đối với hiệu suất tốt. Khi bạn tạo một chuỗi hệ điều hành, nó được đưa ra thời gian 'sớm' - tất cả các quá trình 'thời gian được chia giữa các chủ đề. Đó không phải là trường hợp phổ biến với chủ đề người dùng. Nhiệm vụ thường được đặt ra khi tài nguyên không có sẵn. Điều này làm giảm chuyển đổi ngữ cảnh, bộ nhớ và tổng số luồng phải được tạo. Khi nhiệm vụ thoát ra, luồng này được gán cho một luồng khác.
xem xét tương tự này phân bố thời gian:
- Giả sử bạn đang ở một casino. Có một số người muốn thẻ.
- Bạn có một số đại lý cố định. Có ít đại lý hơn những người muốn thẻ.
- Không phải lúc nào cũng có đủ thẻ cho mọi người tại bất kỳ thời điểm nào.
- Mọi người cần tất cả các thẻ để hoàn thành trò chơi/tay của họ. Họ trả lại thẻ cho người chia bài khi trò chơi/bàn tay của họ hoàn tất.
Bạn sẽ yêu cầu các đại lý phân phối thẻ như thế nào?
Trong bộ lập lịch hệ điều hành, điều này sẽ dựa trên mức độ ưu tiên (luồng). Mỗi người sẽ được cấp một thẻ tại một thời điểm (thời gian CPU), và ưu tiên sẽ được đánh giá liên tục.
Những người đại diện cho công việc hoặc công việc của chủ đề. Các thẻ đại diện cho thời gian và tài nguyên. Các đại lý đại diện cho các chủ đề và tài nguyên.
Bạn sẽ xử lý nhanh nhất thế nào nếu có 2 đại lý và 3 người? và nếu có 5 đại lý và 500 người? Làm thế nào bạn có thể giảm thiểu chạy ra khỏi thẻ để đối phó? Với chủ đề, thêm thẻ và thêm đại lý không phải là giải pháp mà bạn có thể phân phối 'theo yêu cầu'. Thêm CPU tương đương với việc thêm đại lý. Thêm chủ đề tương đương với các đại lý giao dịch thẻ cho nhiều người hơn tại một thời điểm (tăng chuyển đổi ngữ cảnh). Có một số chiến lược để xử lý thẻ nhanh hơn, đặc biệt là sau khi bạn loại bỏ nhu cầu của mọi người đối với thẻ trong một khoảng thời gian nhất định. Nó sẽ không được nhanh hơn để đi đến một bảng và đối phó với một người hoặc người cho đến khi trò chơi của họ được hoàn thành nếu tỷ lệ đại lý cho người dân là 1/50? So sánh điều này để truy cập tất cả các bảng dựa trên mức độ ưu tiên và điều phối lượt truy cập giữa tất cả các đại lý (phương pháp tiếp cận hệ điều hành). Điều đó không ngụ ý hệ điều hành là ngu xuẩn - nó ngụ ý rằng việc tạo ra một chuỗi hệ điều hành là một kỹ sư bổ sung thêm nhiều người và nhiều bảng hơn, có khả năng nhiều hơn các đại lý có thể xử lý hợp lý. May mắn thay, các ràng buộc có thể được dỡ bỏ trong nhiều trường hợp bằng cách sử dụng các mô hình đa luồng khác và trừu tượng hóa cao hơn.
Tại sao chuỗi hệ điều hành lại đắt hơn chủ đề "xanh"? Lý do cho sự suy giảm hiệu suất giả định là gì do có một chuỗi hệ điều hành chuyên dụng cho mỗi "nhiệm vụ"?
Nếu bạn đã phát triển thư viện luồng cấp thấp quan trọng hiệu suất (ví dụ: pthreads), bạn sẽ nhận ra tầm quan trọng của việc sử dụng lại (và triển khai nó trong thư viện dưới dạng mô hình có sẵn cho người dùng). Từ góc độ đó, tầm quan trọng của các mô hình đa luồng bậc cao là một giải pháp/tối ưu hóa đơn giản và rõ ràng dựa trên việc sử dụng thế giới thực cũng như lý tưởng rằng thanh nhập cho việc áp dụng và sử dụng đa luồng có hiệu quả có thể được hạ xuống. Nó không phải là chúng đắt tiền - mô hình và hồ bơi của chủ đề nhẹ là một giải pháp tốt hơn cho nhiều vấn đề, và một trừu tượng thích hợp hơn cho các kỹ sư không hiểu chủ đề tốt. Sự phức tạp của đa luồng được đơn giản hóa rất nhiều (và thường có hiệu suất cao hơn trong việc sử dụng thế giới thực) theo mô hình này. Với các luồng hệ điều hành, bạn có nhiều quyền kiểm soát hơn, nhưng cần phải cân nhắc nhiều hơn để sử dụng chúng một cách hiệu quả nhất có thể - chú ý đến việc xem xét này có thể phản ánh đáng kể việc thực hiện/triển khai của chương trình. Với sự trừu tượng mức cao hơn, nhiều phức tạp này được giảm thiểu bằng cách thay đổi hoàn toàn dòng chảy của việc thực thi tác vụ (width vs pull).
Chúng không chỉ được coi là đắt tiền, chúng được. Tôi tin rằng một số chủ đề màu xanh lá cây (Haskell's?) Chỉ nặng một vài kilobyte, nghĩa là nhỏ hơn hàng trăm lần. Một vấn đề khác: Python tiêu chuẩn không phải là màu xanh lá cây - họ có một số vấn đề với đa luồng do GIL, nhưng họ vẫn là chủ đề hệ điều hành thực sự (có thể bạn đang nghĩ về 'greenlets'? Đó là một câu chuyện khác nhau, và thực sự tương tự như màu xanh lá cây chủ đề). – delnan
@delnan OK, tôi đã nghe điều đó. Nhưng tôi vẫn không chắc tại sao chúng đắt hơn. Cả hai cần phải lưu ngăn xếp và để làm chuyển đổi ngữ cảnh (bỏ qua GIL, có rất nhiều ví dụ không python). –