Sau khi đọc một số nguồn, tôi vẫn còn bối rối về các luồng cấp độ người dùng và hạt nhân.
Đặc biệt:
Chủ đề có thể tồn tại ở cả cấp độ người dùng và cấp độ nhân
Sự khác biệt giữa cấp độ người dùng và cấp độ kernel là gì?
Sau khi đọc một số nguồn, tôi vẫn còn bối rối về các luồng cấp độ người dùng và hạt nhân.
Đặc biệt:
Chủ đề có thể tồn tại ở cả cấp độ người dùng và cấp độ nhân
Sự khác biệt giữa cấp độ người dùng và cấp độ kernel là gì?
Câu trả lời:
Một trong những vai trò của nhân hệ điều hành đa nhiệm là lập lịch : xác định luồng thực thi nào sẽ thực thi khi nào. Vì vậy, một hạt nhân như vậy có một số khái niệm về chủ đề hoặc quá trình . Một luồng là một đoạn mã liên tiếp đang thực thi và có ngăn xếp riêng và đôi khi là các dữ liệu khác. Trong ngữ cảnh hệ điều hành, mọi người thường sử dụng tiến trình để chỉ một luồng có không gian bộ nhớ riêng và luồng để chỉ một luồng chia sẻ không gian bộ nhớ của nó với các luồng khác. Một quá trình có thể có một hoặc nhiều chủ đề.
Một số hệ điều hành, ví dụ như các hệ thống unix cũ hơn, chỉ cung cấp các quy trình: mỗi luồng mà kernel quản lý có không gian bộ nhớ riêng. Các hệ điều hành khác, ví dụ như hầu hết các hệ thống unix hiện đại, cho phép các quy trình chứa nhiều luồng thực thi: chúng cung cấp một khái niệm cấp độ nhân của các luồng.
Nó cũng có thể cho một quá trình để quản lý luồng riêng của nó. Trong đa luồng hợp tác , mã của mỗi luồng chứa các hướng dẫn để chuyển sang luồng khác. Trong đa luồng ưu tiên , quy trình yêu cầu các thông báo không đồng bộ định kỳ từ kernel và phản ứng với các thông báo này bằng cách chuyển sang một luồng khác. Bằng cách này, đa luồng được thực hiện mà không có sự hợp tác hạt nhân, ở cấp độ người dùng, trong một thư viện.
Một hệ thống có thể cung cấp cả các luồng cấp độ nhân và cấp độ người dùng; cái này được gọi là luồng lai .
Mỗi luồng cấp độ người dùng và hạt nhân đều có những lợi ích và nhược điểm của chúng. Chuyển đổi giữa các luồng cấp độ người dùng thường nhanh hơn, vì nó không yêu cầu đặt lại các bảo vệ bộ nhớ để chuyển sang bộ lập lịch trong kernel và một lần nữa để quay lại quy trình. Điều này chủ yếu quan trọng đối với các hệ thống đồng thời ồ ạt sử dụng một số lượng lớn các luồng rất ngắn, chẳng hạn như một số ngôn ngữ cấp cao ( đặc biệt là Erlang ) và các luồng màu xanh lá cây của chúng . Các luồng cấp người dùng yêu cầu ít hỗ trợ kernel hơn, có thể làm cho kernel đơn giản hơn. Các luồng cấp hạt nhân cho phép một luồng chạy trong khi một luồng khác trong cùng tiến trình bị chặn trong một cuộc gọi hệ thống ; các quy trình với các luồng cấp người dùng phải chú ý không thực hiện chặn các cuộc gọi hệ thống, vì các quy trình này chặn tất cả các luồng của quy trình. Các luồng cấp hạt nhân có thể chạy đồng thời trên các máy đa bộ xử lý, mà các luồng hoàn toàn ở cấp độ người dùng không thể đạt được.
Hãy nghĩ về các luồng cấp kernel là " bộ xử lý ảo " và các luồng cấp người dùng như các luồng đơn giản (bây giờ chúng ta hãy gọi chúng là như vậy). Bây giờ, để một luồng được thực thi, nó đã được gán cho một bộ xử lý phải không? Vì vậy, mỗi luồng được gán cho một bộ xử lý ảo để nó có thể được thực thi.
Đây là sự thật
Tạo một bộ xử lý ảo mới là một chút tốn kém. (Nhân phải tạo một mục trong Khối điều khiển luồng , gán ngăn xếp, v.v.)
Tạo một chủ đề khá đơn giản so với việc tạo một bộ xử lý ảo mới. Nhà phát triển ứng dụng có thể tạo các luồng bằng Thư viện luồng được cung cấp bởi các ngôn ngữ lập trình và được quản lý trong Vùng người dùng . Và các ngôn ngữ khác nhau thực hiện đa luồng theo những cách khác nhau.
Nếu các luồng được ánh xạ lên một bộ xử lý ảo, thì người ta phải cẩn thận không thực hiện cuộc gọi hệ thống chặn trong bất kỳ luồng nào, bởi vì các luồng khác không thể chạy đồng thời nữa.
Hạn chế này có thể được khắc phục nếu có thể tạo thêm một vài bộ xử lý ảo. Bây giờ, các luồng có thể chạy đồng thời (song song nếu có nhiều bộ xử lý thực). Một luồng sẽ không ảnh hưởng đến các luồng khác được ánh xạ trên các bộ xử lý ảo khác.
Trong mô hình sau, một hoặc nhiều luồng có thể được ánh xạ lên bộ xử lý ảo.
Các mô hình trên được đặt tên lần lượt là Many to One, One to One và Many to Many.
Tài liệu tham khảo: Khái niệm hệ điều hành của Galvin et al. Chủ đề: Chủ đề -> Mô hình đa luồng