7

Đây là những gì tôi hiểu; vui lòng sửa/thêm vào nó:Chủ đề cấp người dùng (ULTs) và luồng cấp hạt nhân (KLTs) khác nhau liên quan đến việc thực thi đồng thời như thế nào?

Trong ULT thuần túy, quy trình đa luồng cũng tự lập lịch trình chuỗi. Vì vậy, hạt nhân về cơ bản không nhận thấy sự khác biệt và xem xét nó một quá trình đơn luồng. Nếu một chuỗi tạo cuộc gọi hệ thống chặn, toàn bộ quá trình sẽ bị chặn. Ngay cả trên bộ xử lý đa lõi, chỉ một luồng của quy trình sẽ chạy cùng một lúc, trừ khi quá trình này bị chặn. Tôi không chắc chắn làm thế nào ULTs được giúp đỡ nhiều mặc dù.

Trong KLT tinh khiết, ngay cả khi một luồng bị chặn, hạt nhân sẽ lên lịch một luồng (sẵn sàng) khác của cùng một quy trình. (Trong trường hợp KLT tinh khiết, tôi giả định hạt nhân tạo ra tất cả các luồng của quá trình.)

Ngoài ra, sử dụng kết hợp ULT và KLT, ULT được ánh xạ thành KLT như thế nào?

Trả lời

17

Phân tích của bạn là chính xác. Hạt nhân hệ điều hành không có kiến ​​thức về chủ đề cấp người dùng. Từ quan điểm của nó, một quá trình là một hộp đen đục mà đôi khi làm cho các cuộc gọi hệ thống. Do đó, nếu chương trình đó có 100.000 luồng cấp người dùng nhưng chỉ có một luồng hạt nhân, thì quá trình chỉ có thể chạy một luồng cấp người dùng tại một thời điểm bởi vì chỉ có một luồng cấp hạt nhân được liên kết với nó. Mặt khác, nếu một tiến trình có nhiều luồng cấp hạt nhân, thì nó có thể thực hiện nhiều lệnh song song nếu có một máy đa lõi.

Một sự thỏa hiệp phổ biến giữa chúng là yêu cầu chương trình một số chuỗi cấp hạt nhân cố định, sau đó có trình lập lịch trình chuỗi của riêng nó lên các luồng cấp người dùng lên các luồng cấp hạt nhân này khi thích hợp. Bằng cách đó, nhiều ULT có thể thực hiện song song, và chương trình có thể có quyền kiểm soát chi tiết về cách các luồng thực thi.

Đối với cách ánh xạ này hoạt động - có một loạt các lược đồ khác nhau. Bạn có thể tưởng tượng rằng chương trình người dùng sử dụng bất kỳ một trong nhiều hệ thống lập kế hoạch khác nhau. Trong thực tế, nếu bạn làm thay này:

Kernel chủ đề < ---> Processor core

đề tài < ---> Kernel chủ đề

Sau đó, bất kỳ chương trình hệ điều hành có thể sử dụng để ánh xạ các luồng hạt nhân lên lõi cũng có thể được sử dụng để ánh xạ các luồng mức người dùng lên các luồng cấp hạt nhân.

Hy vọng điều này sẽ hữu ích!

+0

Nhưng, một số trang web và sách nói rằng ULT không thể tận dụng lợi thế của đa xử lý và một dòng của bạn nói "Mặt khác, nếu quá trình có nhiều chuỗi cấp hạt nhân, thì có thể thực thi nhiều lệnh song song nếu có một máy đa lõi. " Tôi làm sai ở đâu ? – Garrick

+0

Bạn có thể cung cấp liên kết đến điều đó không? Điều đó nghe có vẻ không chính xác. – templatetypedef

+0

Vui lòng kiểm tra 2 liên kết này http://stackoverflow.com/questions/25582876/what-does-it-mean-by-user-threads-cannot-take-advantage-of-multithreading-or-mu và http: // cs.stackexchange.com/questions/1065/what-is-the-difference-between-user-level-threads-and-kernel-level-threads. Dòng cuối cùng của liên kết thứ 2 nói rằng. Tôi tìm kiếm nhiều hơn một chút và tôi nghĩ nó phụ thuộc vào mô hình 1: 1. Vui lòng sửa tôi, nếu tôi thiếu bất kỳ thông tin chính nào. Cảm ơn !! – Garrick

2

Trước bất kỳ điều gì khác, câu trả lời của templatetypedef thật đẹp; Tôi chỉ muốn mở rộng phản ứng của mình một chút.

Có một khu vực mà tôi cảm thấy cần phải mở rộng một chút: kết hợp của ULT và KLT là. Để hiểu tầm quan trọng (những gì Wikipedia nhãn hybrid threading), hãy xem xét các ví dụ sau:

Xem xét chương trình nhiều luồng (nhiều KLT), nơi có nhiều KLT hơn lõi logic có sẵn. Để sử dụng hiệu quả mọi lõi, như bạn đã đề cập, bạn muốn trình lập lịch biểu chuyển đổi KLT đang chặn với những người trong trạng thái sẵn sàng và không chặn. Điều này đảm bảo cốt lõi là giảm số lượng thời gian nhàn rỗi của nó. Thật không may, việc chuyển đổi KLT là tốn kém cho bộ lập lịch và nó tiêu thụ một lượng thời gian CPU tương đối lớn.

Đây là khu vực có khả năng tạo luồng hỗn hợp có thể hữu ích. Hãy xem xét một chương trình đa luồng với nhiều KLT và ULT. Cũng như templatetypedef lưu ý, chỉ một ULT có thể chạy cùng một lúc cho mỗi KLT. Nếu một ULT đang chặn, chúng tôi vẫn muốn chuyển nó ra cho một cái không bị chặn. May mắn thay, ULT là nhẹ hơn nhiều so với KLT, theo nghĩa là có ít tài nguyên được gán cho một ULT và chúng không yêu cầu sự tương tác với bộ lập lịch hạt nhân. Về cơ bản, nó gần như luôn luôn nhanh hơn để chuyển đổi của ULT hơn là để chuyển ra KLT. Kết quả là, chúng tôi có thể làm giảm đáng kể thời gian không hoạt động của lõi so với ví dụ đầu tiên.

Bây giờ, tất nhiên điều này phụ thuộc vào thư viện luồng đang được sử dụng để triển khai ULT. Có hai cách (mà tôi có thể đưa ra) cho "lập bản đồ" ULT của KLT.

  1. Một bộ sưu tập của ULT của cho tất cả KLT của

    Tình trạng này là lý tưởng trên một hệ thống bộ nhớ chia sẻ. Về cơ bản, có một "hồ bơi" của ULT mà mỗi KLT đều có quyền truy cập. Lý tưởng nhất, bộ lập lịch trình thư viện luồng sẽ gán ULT cho mỗi KLT theo yêu cầu trái ngược với KLT truy cập vào nhóm riêng lẻ. Sau đó có thể gây ra điều kiện chủng tộc hoặc deadlocks nếu không được thực hiện với ổ khóa hoặc một cái gì đó tương tự.

  2. Một bộ sưu tập của ULT của cho mỗi KLT (Qthreads)

    Tình trạng này là lý tưởng trên một hệ thống bộ nhớ phân tán. Mỗi KLT sẽ có một bộ sưu tập của ULT để chạy. Việc rút lại là người dùng (hoặc thư viện luồng) sẽ phải chia ULT giữa KLT. Điều này có thể dẫn đến mất cân bằng tải vì nó không được đảm bảo rằng tất cả các ULT sẽ có cùng một lượng công việc để hoàn thành và hoàn thành khoảng cùng một khoảng thời gian. Giải pháp cho điều này là cho phép di chuyển ULT; đó là, di chuyển ULT giữa KLT.

+0

Tôi đang tìm kiếm các thư viện/API mẫu khác triển khai "luồng lai". Nếu có ai biết về bất kỳ điều gì, xin vui lòng bình luận hoặc chỉnh sửa chúng. –

+0

+1 cho nỗi đau bạn đã thực hiện để viết điều này cho người khác. Chẳng phải thư viện Pthread là một ví dụ về luồng lai? –

+0

Thư viện Linux PThreads gốc cũng như NGPT thay thế được đề xuất do IBM hỗ trợ (Chủ đề POSIX thế hệ tiếp theo) là các triển khai luồng m: n.Tuy nhiên, Linus Torvalds nói rằng nếu các luồng hạt nhân Linux quá béo, thì giải pháp chính xác không phải là lớp phức tạp hơn trên đầu chúng trong không gian người dùng, mà là làm cho chúng gọn hơn và nhanh hơn, và do đó chúng đã làm, và NPTL hiện tại (Native Thư viện luồng POSIX) đã giành được thư viện 1: 1. Trong máy ảo BEAM Erlang, một máy ảo trên mỗi lõi CPU được kích hoạt, mỗi máy chủ trong một luồng riêng biệt và các quy trình Erlang được lên lịch giữa chúng. –

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