2009-07-24 41 views

Trả lời

40

Khi họ nói bản đồ, nghĩa là mỗi chuỗi hạt nhân được gán cho một số chuỗi chủ đề chế độ người dùng nhất định.

Chuỗi hạt nhân được sử dụng để cung cấp các dịch vụ đặc quyền cho các ứng dụng (chẳng hạn như cuộc gọi hệ thống). Chúng cũng được kernel sử dụng để theo dõi tất cả những gì đang chạy trên hệ thống, bao nhiêu tài nguyên được phân bổ cho quá trình nào và lên lịch cho chúng.

Nếu ứng dụng của bạn sử dụng nhiều cuộc gọi hệ thống, nhiều chuỗi người dùng hơn cho mỗi chuỗi hạt nhân và ứng dụng của bạn sẽ chạy chậm hơn. Điều này là do chuỗi hạt nhân sẽ trở thành một nút cổ chai, vì tất cả các cuộc gọi hệ thống sẽ đi qua nó. Mặt khác, nếu các chương trình của bạn hiếm khi sử dụng các cuộc gọi hệ thống (hoặc các dịch vụ hạt nhân khác), bạn có thể gán một số lượng lớn các luồng người dùng cho một chuỗi hạt nhân mà không bị phạt nhiều.

Bạn có thể tăng số lượng chuỗi hạt nhân, nhưng điều này bổ sung phí vào hạt nhân nói chung, vì vậy trong khi các chuỗi riêng lẻ sẽ phản hồi nhanh hơn đối với các cuộc gọi hệ thống, toàn bộ hệ thống sẽ trở nên chậm hơn.

Đó là lý do tại sao điều quan trọng là phải tìm sự cân bằng tốt giữa số lượng chuỗi hạt nhân và số lượng chuỗi người dùng trên mỗi chuỗi hạt nhân.

+13

Điều này không đúng trên hầu hết các hệ điều hành hiện đại, ví dụ như Linux. Các luồng người dùng * trở thành * các luồng hạt nhân khi chúng gọi một cuộc gọi hệ thống. Không có cách nào để thiếu các luồng hạt nhân để gây ra vấn đề được thảo luận và, trong mọi trường hợp, đó không phải là "bản đồ" có nghĩa là gì trong ngữ cảnh này. (Nó không liên quan gì đến việc chạy mã hạt nhân hoặc dịch vụ hạt nhân, đó là về các thực thể lập lịch trình hạt nhân có sẵn để chạy mã người dùng.) –

+2

Tôi sẵn sàng xem tài liệu có quy định khác, nhưng tôi không đồng ý với bạn. Nếu một luồng người dùng _became_ là một luồng hạt nhân, điều đó sẽ rất nguy hiểm, vì bất kỳ chương trình nào có thể thực thi mã hạt nhân tùy ý. Thay vào đó, luồng người dùng yêu cầu một dịch vụ (gọi hệ thống) từ nhân, và hạt nhân quản lý nó từ đó. – samoz

+2

Bối rối một lần nữa bằng cách bình luận ở trên. Vì vậy, đó là một trong nó ? Chủ đề người dùng trở thành chủ đề hạt nhân hoặc có một chuỗi hạt nhân riêng biệt tương ứng với mỗi luồng người dùng? Nếu có hai chủ đề sẽ không phải là bối cảnh chuyển đổi mỗi lần giữa chủ đề người dùng và chủ đề hạt nhân? Thuật ngữ 'Lập bản đồ' vẫn chưa rõ ràng. Có một cơ sở dữ liệu được duy trì để theo dõi các ánh xạ này không? – lucent

14

Chủ đề người dùng được quản lý trong không gian người dùng - điều đó có nghĩa là lên lịch, chuyển đổi, v.v. không phải từ hạt nhân.

Vì, cuối cùng, hạt nhân OS chịu trách nhiệm chuyển ngữ cảnh giữa "đơn vị thực thi" - chuỗi người dùng của bạn phải được liên kết (tức là "bản đồ") với đối tượng có thể lên lịch hạt nhân - chuỗi hạt nhân [+1].

Vì vậy, cho các luồng người dùng N - bạn có thể sử dụng các luồng hạt nhân N (bản đồ 1: 1). Điều đó cho phép bạn tận dụng lợi thế của phần cứng đa nhân (xử lý trên nhiều CPU) và là một thư viện khá đơn giản - về cơ bản chỉ trì hoãn hầu hết công việc cho nhân. Tuy nhiên, nó làm cho ứng dụng của bạn di động giữa các hệ điều hành vì bạn không trực tiếp gọi các hàm chuỗi hạt nhân. Tôi tin rằng Chủ đề POSIX (PThreads) là thực thi * nix ưa thích, và nó tuân theo bản đồ 1: 1 (làm cho nó hầu như tương đương với một luồng hạt nhân). Tuy nhiên, điều đó không được đảm bảo vì nó phụ thuộc vào việc triển khai thực hiện (lý do chính để sử dụng PThreads là tính di động giữa các hạt nhân).

Hoặc bạn chỉ có thể sử dụng 1 chuỗi hạt nhân. Điều đó sẽ cho phép bạn chạy trên hệ điều hành không đa nhiệm, hoặc hoàn toàn chịu trách nhiệm lên lịch. Windows 'User Mode Scheduling là một ví dụ về bản đồ N: 1 này.

Hoặc, bạn có thể ánh xạ tới một số chuỗi hạt nhân tùy ý - một bản đồ N: M. Windows có Fibers, cho phép bạn ánh xạ các sợi N thành các luồng hạt nhân M và lập kế hoạch cho chúng. Một threadpool cũng có thể là một ví dụ về điều này - N workitems cho M chủ đề.

[+1] Quy trình có ít nhất 1 chuỗi hạt nhân, là đơn vị thực thi thực tế. Ngoài ra, một luồng hạt nhân phải được chứa trong một tiến trình. Hệ điều hành phải lập lịch chủ đề để chạy - không phải là quy trình.

19

http://www.informit.com/articles/printerfriendly.aspx?p=25075

Chủ đề Thực hiện trong tài khoản Space

Có hai cách chính để thực hiện một đề gói: trong không gian người dùng và trong kernel. Sự lựa chọn là gây tranh cãi vừa phải, và một thực hiện lai cũng có thể. Bây giờ chúng ta sẽ mô tả các phương pháp này, cùng với những ưu điểm và nhược điểm của chúng.

Phương pháp đầu tiên là đặt gói chủ đề hoàn toàn vào không gian người dùng. Hạt nhân không biết gì về chúng. Theo như hạt nhân là có liên quan, nó được quản lý bình thường, đơn luồng quy trình. Lợi thế đầu tiên và rõ ràng nhất là gói chủ đề cấp người dùng có thể được triển khai trên hệ điều hành không hỗ trợ luồng. Tất cả các hệ điều hành được sử dụng để rơi vào thể loại này, và ngay cả bây giờ một số vẫn còn làm.

Tất cả các triển khai này đều có cùng cấu trúc chung, được minh họa trong hình 2-8 (a). Các luồng chạy trên đỉnh của một hệ thống thời gian chạy, là một tập hợp các thủ tục quản lý các luồng. Chúng ta đã thấy bốn trong số đó là: thread_create, thread_exit, thread_wait và thread_yield, nhưng thường có nhiều hơn.

Khi chuỗi được quản lý trong không gian người dùng, mỗi quy trình cần có một bảng chuỗi riêng để theo dõi các chuỗi trong quá trình đó. Bảng này tương tự với bảng xử lý của hạt nhân, ngoại trừ việc nó chỉ theo dõi các thuộc tính cho mỗi luồng như bộ đếm chương trình của mỗi luồng, con trỏ ngăn xếp, thanh ghi, trạng thái, vv Bảng chủ đề được quản lý bởi hệ thống thời gian chạy. Khi một luồng được chuyển sang trạng thái sẵn sàng hoặc trạng thái bị chặn, thông tin cần thiết để khởi động lại nó được lưu trữ trong bảng chủ đề, giống hệt như cách hạt nhân lưu trữ thông tin về các quy trình trong bảng tiến trình.

Khi một luồng làm một thứ gì đó có thể làm cho nó bị chặn cục bộ, ví dụ, chờ một luồng khác trong quá trình hoàn thành một số công việc, nó gọi thủ tục hệ thống thời gian chạy. Thủ tục này kiểm tra xem thread có được đặt vào trạng thái bị chặn hay không. Nếu vậy, nó lưu trữ các thanh ghi của chủ đề (tức là, riêng của nó) trong bảng chủ đề, tìm trong bảng cho một luồng sẵn sàng để chạy, và tải lại sổ đăng ký máy với các giá trị đã lưu của luồng mới. Ngay khi con trỏ ngăn xếp và bộ đếm chương trình đã được chuyển, luồng mới sẽ tự động trở lại. Nếu máy có hướng dẫn để lưu trữ tất cả các thanh ghi và một lệnh khác để tải tất cả, toàn bộ công tắc chủ đề có thể được thực hiện trong một số hướng dẫn. Thực hiện chuyển đổi luồng như thế này ít nhất là một thứ tự cường độ nhanh hơn so với bẫy hạt nhân và là một đối số mạnh mẽ có lợi cho các gói chủ đề cấp người dùng.

Tuy nhiên, có một sự khác biệt chính với quy trình. Khi một luồng được chạy xong cho thời điểm này, ví dụ, khi nó gọi thread_yield, mã của thread_yield có thể lưu thông tin của luồng trong chính bảng chủ đề. Hơn nữa, nó có thể gọi trình lên lịch trình chuỗi để chọn một luồng khác để chạy. Thủ tục lưu trạng thái của luồng và trình lên lịch chỉ là các thủ tục cục bộ, vì vậy việc gọi chúng là hiệu quả hơn nhiều so với thực hiện một cuộc gọi hạt nhân. Trong số các vấn đề khác, không cần bẫy, không cần chuyển đổi ngữ cảnh, bộ nhớ cache không cần phải được xóa, và cứ thế. Điều này làm cho việc lập lịch trình luồng rất nhanh.

Chủ đề cấp người dùng cũng có các lợi thế khác. Chúng cho phép mỗi quá trình có thuật toán lập lịch tùy chỉnh của riêng nó. Đối với một số ứng dụng, ví dụ, những người có chủ đề bộ thu gom rác, không phải lo lắng về một chuỗi đang bị dừng tại một thời điểm bất tiện là một điểm cộng. Họ cũng mở rộng quy mô tốt hơn, vì các luồng hạt nhân luôn đòi hỏi một số không gian bảng và không gian ngăn xếp trong hạt nhân, có thể là một vấn đề nếu có một số lượng lớn các luồng.

Mặc dù hiệu suất tốt hơn, gói chủ đề cấp người dùng có một số vấn đề lớn.Đầu tiên trong số này là vấn đề về cách thực hiện các cuộc gọi hệ thống chặn. Giả sử một chủ đề đọc từ bàn phím trước khi bất kỳ phím nào bị trúng. Cho phép các chủ đề thực sự thực hiện cuộc gọi hệ thống là không thể chấp nhận, vì điều này sẽ ngăn chặn tất cả các chủ đề. Một trong những mục tiêu chính của việc có chủ đề ở nơi đầu tiên là cho phép mỗi người sử dụng các cuộc gọi chặn, nhưng để ngăn chặn một chủ đề bị chặn không ảnh hưởng đến những người khác. Với việc chặn các cuộc gọi hệ thống, khó có thể thấy được mục tiêu này có thể đạt được dễ dàng như thế nào.

Tất cả cuộc gọi hệ thống có thể được thay đổi thành không chặn (ví dụ: đọc trên bàn phím sẽ chỉ trả lại 0 byte nếu không có ký tự nào đã được đệm), nhưng yêu cầu thay đổi đối với hệ điều hành là không hấp dẫn. Bên cạnh đó, một trong các đối số cho các luồng cấp người dùng chính xác là chúng có thể chạy với các hệ điều hành hiện có. Ngoài ra, việc thay đổi ngữ nghĩa của đọc sẽ yêu cầu thay đổi đối với nhiều chương trình người dùng.

Một giải pháp thay thế khác có thể xảy ra trong trường hợp có thể báo trước nếu cuộc gọi bị chặn. Trong một số phiên bản của UNIX, một cuộc gọi hệ thống, chọn, tồn tại, cho phép người gọi để biết liệu một đọc tiềm năng sẽ chặn. Khi có cuộc gọi này, đọc thủ tục thư viện có thể được thay thế bằng một thủ tục mới đầu tiên thực hiện cuộc gọi chọn và sau đó chỉ thực hiện cuộc gọi đọc nếu nó an toàn (tức là, sẽ không chặn). Nếu cuộc gọi đọc sẽ chặn, cuộc gọi sẽ không được thực hiện. Thay vào đó, một luồng khác được chạy. Lần sau, hệ thống thời gian chạy được kiểm soát, nó có thể kiểm tra lại để xem liệu đọc có an toàn hay không. Cách tiếp cận này đòi hỏi phải viết lại các phần của thư viện gọi hệ thống, không hiệu quả và không phù hợp, nhưng có rất ít sự lựa chọn. Mã được đặt xung quanh cuộc gọi hệ thống để thực hiện việc kiểm tra được gọi là áo khoác hoặc trình bao bọc.

Hơi giống với vấn đề chặn cuộc gọi hệ thống là vấn đề lỗi trang. Chúng ta sẽ nghiên cứu chúng trong Chap. 4. Đối với thời điểm này, nó là đủ để nói rằng máy tính có thể được thiết lập theo cách mà không phải tất cả các chương trình là trong bộ nhớ chính cùng một lúc. Nếu chương trình gọi hoặc nhảy đến một lệnh không có trong bộ nhớ, lỗi trang xảy ra và hệ điều hành sẽ đi và nhận lệnh bị thiếu (và các hàng xóm của nó) từ đĩa. Điều này được gọi là lỗi trang. Nếu một luồng gây ra lỗi trang, hạt nhân, thậm chí không biết về sự tồn tại của các luồng, tự nhiên chặn toàn bộ quá trình cho đến khi hoàn thành đĩa I/O, thậm chí mặc dù các chủ đề khác có thể chạy được.

Một vấn đề khác với gói luồng cấp người dùng là nếu luồng bắt đầu chạy, không có luồng nào khác trong quá trình đó sẽ chạy trừ khi chuỗi đầu tiên tự nguyện từ bỏ CPU. Trong một quá trình duy nhất, không có ngắt đồng hồ, làm cho nó không thể lên lịch trình quy trình round-robin thời trang (thay phiên nhau). Trừ khi một sợi đi vào hệ thống thời gian chạy của ý chí tự do của riêng nó, người lên lịch sẽ không bao giờ có cơ hội. Một trong những giải pháp có thể cho vấn đề của các chủ đề chạy mãi là phải có hệ thống thời gian chạy yêu cầu một tín hiệu đồng hồ (ngắt) mỗi giây một lần để kiểm soát nó, nhưng điều này cũng quá thô lỗ và lộn xộn đối với chương trình. Các ngắt đồng hồ định kỳ ở tần số cao hơn không phải lúc nào cũng có thể, và ngay cả khi chúng có, tổng chi phí có thể là đáng kể. Hơn nữa, một sợi cũng có thể cần một ngắt đồng hồ, gây trở ngại cho việc sử dụng đồng hồ của hệ thống thời gian chạy.

Lý do khác, và có lẽ là đối số tàn phá nhất đối với chủ đề cấp người dùng, là các lập trình viên thường muốn chủ đề chính xác trong các ứng dụng mà chuỗi chủ đề thường xuyên, ví dụ như trong một máy chủ Web đa luồng. Những chủ đề này liên tục thực hiện các cuộc gọi hệ thống. Khi một cái bẫy đã xảy ra với hạt nhân để thực hiện cuộc gọi hệ thống, hầu như không có công việc nào để hạt nhân chuyển đổi chủ đề nếu cũ đã bị chặn và việc hạt nhân thực hiện điều này giúp loại bỏ nhu cầu liên tục thực hiện các cuộc gọi hệ thống kiểm tra xem liệu các cuộc gọi hệ thống đã đọc có an toàn hay không. Đối với các ứng dụng về cơ bản hoàn toàn là CPU bị ràng buộc và hiếm khi chặn, điểm có chủ đề là gì? Không ai nghiêm túc đề xuất tính toán số nguyên tố đầu tiên hoặc chơi cờ vua bằng cách sử dụng chủ đề bởi vì không có gì để đạt được bằng cách làm theo cách đó.

0
  • Đây là câu hỏi về triển khai thư viện chuỗi.
  • Trong Linux, một chuỗi (hoặc tác vụ) có thể ở trong không gian người dùng hoặc trong không gian hạt nhân. Quá trình nhập không gian hạt nhân khi nó yêu cầu hạt nhân để làm một cái gì đó bởi syscall (đọc, viết hoặc ioctl).
  • Ngoài ra còn có một chuỗi hạt nhân chạy luôn trong không gian hạt nhân và không đại diện cho bất kỳ quá trình người dùng nào.
0

Theo WikipediaOracle, chủ đề người dùng cấp thực sự trong một lớp gắn trên các chủ đề hạt nhân; không phải là mà các luồng hạt nhân thực thi cùng với các chủ đề cấp người dùng nhưng nói chung, các thực thể duy nhất thực sự được thực thi bởi bộ xử lý/hệ điều hành là chuỗi hạt nhân.

Ví dụ: giả sử rằng chúng tôi có một chương trình có 2 luồng cấp người dùng, cả hai được ánh xạ tới (tức là được gán) cùng một chuỗi hạt nhân. Đôi khi, chuỗi hạt nhân chạy chuỗi cấp người dùng đầu tiên (và được nói rằng hiện tại là luồng hạt nhân này được ánh xạ tới chuỗi cấp người dùng đầu tiên) và một số lần khác luồng chủ đề chạy chuỗi cấp người dùng thứ hai. Vì vậy, chúng tôi nói rằng chúng tôi có hai chủ đề cấp người dùng được ánh xạ cho cùng một chuỗi hạt nhân.

Là một :

Cốt lõi của một hệ điều hành được gọi là của nó kernel, vì vậy các chủ đề ở cấp hạt nhân (tức là chủ đề mà kernel biết và quản lý) được gọi là đề hạt nhân, các cuộc gọi đến lõi hệ điều hành cho các dịch vụ có thể được gọi là các cuộc gọi hạt nhân, và .... Mối quan hệ xác định duy nhất giữa hạt nhânmọi thứ là chúng liên quan chặt chẽ đến lõi hệ điều hành, không có gì khác.

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