Là chủ đề hạt nhân quá trình và daemon?


10

Từ Kiến trúc hạt nhân Linux của Mauerer,

Chủ đề hạt nhân là các quá trình được bắt đầu trực tiếp bởi chính kernel. Họ ủy thác một hàm kernel cho một tiến trình riêng biệt và thực thi nó ở đó trong '' song song '' cho các tiến trình khác trong hệ thống (và trên thực tế, song song với việc thực thi chính kernel). Chủ đề hạt nhân thường được gọi là daemon (kernel) . Chúng được sử dụng để thực hiện, ví dụ, các tác vụ sau:

  • Để định kỳ đồng bộ hóa các trang bộ nhớ đã sửa đổi với thiết bị khối mà các trang bắt nguồn (ví dụ: các tệp được ánh xạ bằng mmap).
  • Để ghi các trang bộ nhớ vào vùng trao đổi nếu chúng hiếm khi được sử dụng.
  • Để quản lý các hành động hoãn lại.
  • Để thực hiện các tạp chí giao dịch cho các hệ thống tập tin.

Về cơ bản, có hai loại luồng nhân:

  • Loại 1 - Chuỗi được bắt đầu và đợi cho đến khi kernel yêu cầu thực hiện một hành động cụ thể.
  • Loại 2 - Sau khi bắt đầu, luồng chạy theo các khoảng thời gian định kỳ, kiểm tra việc sử dụng một tài nguyên cụ thể và thực hiện hành động khi mức sử dụng vượt quá hoặc giảm dưới giá trị giới hạn đã đặt. Nhân sử dụng loại luồng này cho các nhiệm vụ giám sát liên tục.
  1. Vì sách của Mauer nói rằng các luồng nhân là các tiến trình, tôi nghĩ rằng chúng phải được chạy ở chế độ người dùng, thay vì chế độ lõi. (hoặc tôi có sai không? Một quy trình có thể chạy ở chế độ người dùng hoặc chế độ kernel vào các thời điểm khác nhau hay chỉ một chế độ không?)

    Nhưng Hiểu biết về Linux Kernel của Bovet cho biết các luồng kernel chỉ chạy trong chế độ kernel (xem trích dẫn bên dưới). Các khái niệm về "chuỗi nhân" trong hai cuốn sách có cùng một khái niệm không?

    Các hệ thống Unix truyền thống ủy thác một số tác vụ quan trọng để chạy các tiến trình không liên tục, bao gồm xóa bộ đệm đĩa, tráo đổi các trang không sử dụng, phục vụ các kết nối mạng, v.v. Thật vậy, nó không hiệu quả để thực hiện các nhiệm vụ này theo kiểu tuyến tính nghiêm ngặt; cả chức năng của chúng và các quá trình người dùng cuối đều nhận được phản hồi tốt hơn nếu chúng được lên lịch trong nền. Do một số quy trình hệ thống chỉ chạy trong Chế độ hạt nhân, nên các hệ điều hành hiện đại ủy thác các chức năng của chúng cho các luồng nhân , không bị vướng với bối cảnh Chế độ người dùng không cần thiết. Trong Linux, các luồng nhân khác với các quy trình thông thường theo các cách sau:

    • Các luồng nhân chỉ chạy trong Chế độ hạt nhân, trong khi các quy trình thông thường chạy thay thế ở Chế độ hạt nhân và ở Chế độ người dùng.
    • Vì các luồng nhân chỉ chạy trong Chế độ hạt nhân, chúng chỉ sử dụng các địa chỉ tuyến tính lớn hơn PAGE_OFFSET. Mặt khác, các quy trình thông thường sử dụng tất cả bốn gigabyte địa chỉ tuyến tính, ở Chế độ người dùng hoặc Chế độ hạt nhân.
  2. Cuốn sách của Mauer cho biết các luồng nhân được khởi động trực tiếp bởi kernel và dường như cũng nói rằng daemon là từ đồng nghĩa của các luồng kernel. Vì vậy, tôi nghĩ rằng daemon phải được bắt đầu trực tiếp bởi kernel.

    Nhưng https://unix.stackexchange.com/a/193918/674 nói rằng screentrình nền của nó được bắt đầu bởi screengiao diện người dùng (xem trích dẫn bên dưới). Tôi nghĩ screengiao diện người dùng là một quá trình, thay vì kernel. Các khái niệm daemontrong cuốn sách của Mauerer và trong câu trả lời được liên kết có cùng một khái niệm không?

    Khi bạn lần đầu tiên bắt đầu screen, bạn thực sự bắt đầu một giao diện người dùng (ui), theo mặc định sẽ tạo ra một trình nền (trình quản lý phiên).

  3. Nói chung, Làm thế nào để bạn hiểu các khái niệm về "chuỗi nhân", "quá trình" và "daemon", mối quan hệ của chúng và sự khác biệt của chúng?


Tim, woow bạn đang thực hiện một số nghiên cứu lớn khi tôi đang theo dõi bạn từ vài ngày.
rdʒɑ

Câu trả lời:


10

Đầu tiên: Tín dụng đi /programming/15983872/difference-b between-user-level-and-kernel-supported-reads

Chủ đề người dùng và chủ đề Kernel hoàn toàn giống nhau. (Bạn có thể thấy bằng cách nhìn vào / Proc / và thấy rằng các chuỗi nhân cũng ở đó.)

Một luồng người dùng là một chuỗi thực thi mã không gian người dùng. Nhưng nó có thể gọi vào không gian kernel bất cứ lúc nào. Nó vẫn được coi là một luồng "Người dùng", mặc dù nó đang thực thi mã hạt nhân ở mức bảo mật cao.

Chuỗi hạt nhân là một chuỗi chỉ chạy mã hạt nhân và không được liên kết với quy trình không gian người dùng. Chúng giống như "UNIX daemon", ngoại trừ chúng là các daemon chỉ có kernel. Vì vậy, bạn có thể nói rằng kernel là một chương trình đa luồng. Ví dụ, có một luồng nhân để trao đổi. Điều này buộc tất cả các vấn đề hoán đổi để có được "tuần tự hóa" thành một luồng duy nhất.

Nếu một luồng người dùng cần một cái gì đó, nó sẽ gọi vào kernel, đánh dấu luồng đó là ngủ. Sau đó, luồng trao đổi tìm thấy dữ liệu, vì vậy nó đánh dấu luồng người dùng là có thể chạy được. Sau đó, "luồng người dùng" trở về từ kernel trở lại userland như thể không có gì xảy ra.

Trong thực tế, tất cả các luồng bắt đầu trong không gian kernel, bởi vì hoạt động clone () xảy ra trong không gian kernel. (Và có rất nhiều kế toán hạt nhân phải làm trước khi bạn có thể 'quay lại' một quy trình mới trong không gian người dùng.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.