2011-12-26 26 views
32

Tiêu đề có thể không đủ rõ ràng vì tôi không biết cách xác định câu hỏi của mình.Thư viện Pthread có thực sự là giải pháp chủ đề người dùng không?

Tôi hiểu Pthread là thư viện chuỗi đáp ứng tiêu chuẩn POSIX (về POSIX, xem wikipedia: http://en.wikipedia.org/wiki/Posix). Nó có sẵn trong hệ điều hành giống Unix.

Về chủ đề, tôi đọc rằng có ba mô hình khác nhau:

tài mức chủ đề: hạt nhân không biết điều đó. Người dùng tự tạo/thực hiện/hủy các luồng.

Chủ đề cấp hạt nhân: hạt nhân trực tiếp hỗ trợ nhiều luồng điều khiển trong một quy trình.

Quy trình trọng lượng nhẹ (LWP): được lên lịch bởi hạt nhân nhưng có thể được giới hạn với chuỗi người dùng.

Bạn có thấy sự nhầm lẫn của tôi không? Khi tôi gọi pthread_create() để tạo chuỗi, tôi có tạo chuỗi cấp người dùng không? Tôi đoán vậy. Vì vậy, tôi có thể nói, Pthread cung cấp một giải pháp mức người dùng cho các chủ đề? Nó không thể thao tác hạt nhân/LWP?

Trả lời

22

Q: Tôi hiểu pthread là một cuộc họp thư viện thread POSIX tiêu chuẩn

A: Có. Trên thực tế, "pthreads" là viết tắt của "chủ đề Posix": http://en.wikipedia.org/wiki/Pthreads

Q: Nó có sẵn trong Unix-like OS.

A: Trên thực tế, nó có sẵn cho nhiều hệ điều hành khác nhau ... bao gồm Windows, MacOS ... và, tất nhiên, Linux, BSD và Solaris.

Q: Về chủ đề, tôi đọc rằng có ba mô hình khác nhau

Bây giờ bạn đang nhận được mờ. "Chủ đề" là một thuật ngữ rất chung chung. Có rất nhiều, nhiều mô hình khác nhau. Và nhiều, nhiều cách khác nhau bạn có thể mô tả và/hoặc thực hiện "chủ đề". Bao gồm các nội dung như mô hình luồng Java hoặc mô hình luồng Ada.

Hỏi: Khi tôi gọi pthread_create() để tạo chuỗi, tôi có tạo một chuỗi cấp người dùng không?

A: Vâng: Mọi thứ bạn làm trong không gian người dùng được "bảo vệ" trong "không gian người dùng" riêng tư của riêng bạn.

Q: Chủ đề cấp người dùng: hạt nhân không biết.

A: No.Kernel biết mọi thứ :)

Q: Kernel đề cấp: hạt nhân trực tiếp hỗ trợ nhiều chủ đề của kiểm soát trong quy trình.

A: Vâng, có một thứ như "chuỗi hạt nhân".

Và, khi điều đó xảy ra, Linux làm cho việc sử dụng hạt nhân mở rộng. Ví dụ, mỗi tiến trình đơn lẻ trong một hệ thống Linux là một "chuỗi hạt nhân". Và mọi pthread do người dùng tạo ra cũng được thực hiện như một "chuỗi hạt nhân" mới. Như là "chủ đề công nhân" (hoàn toàn vô hình đối với bất kỳ quy trình cấp người dùng nào).

Nhưng đây là một chủ đề nâng cao bạn KHÔNG cần phải hiểu để sử dụng hiệu quả pthreads. Dưới đây là một cuốn sách tuyệt vời mà thảo luận này - và nhiều chủ đề khác - một cách chi tiết:

Linux Kernel Development, Robert Love

Hãy nhớ rằng: "pthreads" là một giao diện. Cách triển khai của nó phụ thuộc vào nền tảng. Linux sử dụng các luồng hạt nhân; Windows sử dụng các chủ đề Win32, v.v.

+14

Bạn đang tạo ra một số sự nhầm lẫn ở đây? 1. Original Poster chưa bao giờ hỏi về các chi tiết cụ thể của Linux 2. Kernel không biết mọi thứ, đặc biệt là trong ngữ cảnh của User Level Threads, bởi vì chúng không được sắp xếp theo kernel, chúng khá "chuyển" qua thư viện, Pthreads trong trường hợp này. 3. Thuật ngữ "Chủ đề" là chung chung. Đúng, nhưng, câu hỏi là nhiều hơn về hệ điều hành và giao diện ứng dụng trong bối cảnh của chủ đề, câu trả lời nên được về trừu tượng nói. –

+1

Thật vậy, câu trả lời này là chỉ bằng phẳng sai. Hạt nhân không * không * biết về các luồng không gian người dùng; nếu tạo một luồng yêu cầu thông báo cho kernel về nó (thông qua một syscall), thì các luồng của bạn sẽ không còn là "userspace" nữa. Câu trả lời đúng ở đây bao gồm http://stackoverflow.com/a/12169068/1424877 và http://stackoverflow.com/a/27581327/1424877; và http://stackoverflow.com/a/8639239/1424877 là một biểu hiện tốt đẹp của các phần chính xác của câu trả lời này (nhưng thiếu các chi tiết Linux để làm cho các chi tiết khác thực sự hữu ích cho OP). – Quuxplusone

-1

Pthreads chỉ là giao diện chuẩn cho các thư viện luồng. Cho dù chuỗi hệ điều hành hoặc chuỗi nhẹ được tạo tùy thuộc vào thư viện bạn sử dụng. Tuy nhiên, vị khách đầu tiên của tôi sẽ là các chủ đề của bạn là các luồng hệ điều hành “thực”.

+1

Câu trả lời này có vẻ đúng về mặt kỹ thuật, nhưng không cung cấp bất kỳ thông tin hữu ích nào. – Quuxplusone

10

pthreads, mỗi lần, không thực sự là một thư viện luồng. pthreads là giao diện mà một thư viện luồng cụ thể thực hiện, sử dụng các tài nguyên đồng thời có sẵn trên nền tảng đó. Vì vậy, có một thực hiện pthreads trên Linux, trên bsd, trên solaris, vv, và trong khi giao diện (các tập tin tiêu đề và ý nghĩa của các cuộc gọi) là như nhau, việc thực hiện của mỗi khác nhau.

Vì vậy, những gì pthread_create thực sự, về mặt đối tượng luồng hạt nhân, khác nhau giữa các hệ điều hành và triển khai thư viện pthread. Tại một xấp xỉ đầu tiên, bạn không cần phải biết (đó là thứ mà trừu tượng pthread cho phép bạn không cần biết). Cuối cùng bạn có thể cần phải nhìn thấy "phía sau bức màn", nhưng đối với hầu hết người dùng pthread đó là không cần thiết.

Nếu bạn muốn biết việc triển khai thực hiện/cụ thể nào, trên một hệ điều hành cụ thể, bạn sẽ cần làm rõ câu hỏi của mình. Những gì Solaris và Linux làm, ví dụ, là rất khác nhau.

24

@ paulsm4 Tôi nghi ngờ về nhận xét của bạn rằng hạt nhân biết mọi điều. Trong bối cảnh cụ thể của các chủ đề mức người dùng, hạt nhân không biết thực tế là một điều như vậy đang xảy ra. Lập lịch trình của một cấp người dùng được duy trì bởi chính người dùng (thông qua giao diện được cung cấp bởi một thư viện) và hạt nhân kết thúc chỉ phân bổ một luồng hạt nhân duy nhất cho toàn bộ quá trình. Kernel sẽ xử lý quá trình như một luồng đơn và bất kỳ cuộc gọi chặn nào bằng một trong các luồng sẽ kết thúc chặn tất cả các luồng của quá trình đó. Tham khảo http://www.personal.kent.edu/~rmuhamma/OpSystems/Myos/threads.htm

4

Trong Linux, pthread là implemented as a lightweight process. Kernel (v2.6 +) thực sự được triển khai với NPTL. Hãy để tôi trích dẫn nội dung wiki:

NPTL là thư viện chủ đề 1 × 1, trong chủ đề do người dùng tạo (thông qua hàm thư viện pthread_create()) tương ứng với các thực thể có thể lập lịch trong hạt nhân (nhiệm vụ, trong trường hợp Linux). Đây là triển khai luồng có thể đơn giản nhất.

Vì vậy, pthread trong hạt nhân Linux thực sự được triển khai làm luồng hạt nhân.

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