Mối quan hệ giữa các cuộc gọi hệ thống, tin nhắn truyền và ngắt là gì?


15

Tôi đang đọc bài viết Wikipedia để quản lý quy trình . Tôi tập trung vào Linux. Tôi không thể tìm ra mối quan hệ và sự khác biệt giữa cuộc gọi hệ thống, tin nhắn truyền và ngắt, trong các khái niệm và mục đích của chúng. Có phải tất cả đều cho các quy trình thực hiện yêu cầu kernel cho tài nguyên và dịch vụ?

Một số trích dẫn từ bài báo và một số khác:

  1. Có hai cách có thể để HĐH lấy lại quyền kiểm soát bộ xử lý trong quá trình thực thi chương trình để HĐH thực hiện phân bổ lại hoặc cấp phát:

    1. Quá trình đưa ra một cuộc gọi hệ thống (đôi khi được gọi là ngắt phần mềm); ví dụ: yêu cầu I / O xảy ra yêu cầu truy cập một tệp trên đĩa cứng.
    2. Một sự cố gián đoạn phần cứng xảy ra; ví dụ, một phím được nhấn trên bàn phím hoặc hết giờ (được sử dụng trong đa nhiệm ưu tiên).
  2. Có hai kỹ thuật mà một chương trình thực thi trong chế độ người dùng có thể yêu cầu các dịch vụ của kernel:

    * System call
    * Message passing
    
  3. ngắt là một tín hiệu không đồng bộ cho biết sự cần thiết phải chú ý hoặc một sự kiện đồng bộ trong phần mềm cho thấy sự cần thiết phải thay đổi trong thực thi.

    Một ngắt phần cứng làm cho bộ xử lý lưu trạng thái thực thi của nó và bắt đầu thực thi một trình xử lý ngắt. Các ngắt phần mềm thường được triển khai như các hướng dẫn trong tập lệnh, điều này gây ra chuyển đổi ngữ cảnh sang trình xử lý ngắt tương tự như ngắt phần cứng.


2
Câu hỏi rất hay!
Stéphane Gimenez

Câu trả lời:


12
  1. Tất cả các hệ điều hành hiện đại đều hỗ trợ đa nhiệm. Điều này có nghĩa là hệ thống có thể thực hiện nhiều quy trình cùng một lúc; hoặc song song giả (khi chỉ có một CPU khả dụng) hoặc hiện nay với CPU đa lõi là song song (một tác vụ / lõi).

    Hãy lấy trường hợp đơn giản hơn chỉ có một CPU có sẵn. Điều này có nghĩa là nếu bạn thực thi cùng một lúc hai quy trình khác nhau (giả sử trình duyệt web và trình phát nhạc) thì hệ thống không thực sự có thể thực thi chúng cùng một lúc. Điều gì xảy ra là CPU luôn chuyển đổi từ quá trình này sang quá trình khác; nhưng điều này đang xảy ra cực kỳ nhanh, do đó bạn không bao giờ nhận thấy nó.

    Bây giờ hãy giả sử rằng trong khi hai quá trình đó đang thực thi, bạn nhấn nút đặt lại (bad boy). CPU sẽ ngay lập tức dừng bất cứ điều gì đang làm và khởi động lại hệ thống. Xin chúc mừng: bạn đã tạo ra một ngắt.

    Trường hợp tương tự khi bạn đang lập trình và muốn yêu cầu dịch vụ từ CPU. Sự khác biệt là trong trường hợp này bạn thực thi mã phần mềm - thường là các thủ tục thư viện đang thực hiện các cuộc gọi hệ thống (ví dụ fopenđể mở tệp).

    Do đó, 1 mô tả hai cách khác nhau để thu hút sự chú ý từ CPU.

  2. Hầu hết các hệ điều hành hiện đại đều hỗ trợ hai chế độ thực thi: chế độ người dùng và chế độ kernel. Theo mặc định, một hệ điều hành chạy trong chế độ người dùng. Chế độ người dùng rất hạn chế. Ví dụ, tất cả I / O đều bị cấm; do đó, bạn không được phép mở tệp từ đĩa cứng. Tất nhiên điều này không bao giờ xảy ra trong thực tế, bởi vì khi bạn mở một tệp, hệ điều hành sẽ chuyển từ chế độ kernel sang chế độ kernel. Trong chế độ kernel, bạn có toàn quyền kiểm soát phần cứng.

    Nếu bạn đang tự hỏi tại sao hai chế độ đó tồn tại, câu trả lời đơn giản nhất là để bảo vệ. Các hệ điều hành dựa trên vi nhân (ví dụ MINIX 3) có hầu hết các dịch vụ của chúng chạy ở chế độ người dùng, điều này làm cho chúng ít gây hại hơn. Các hạt nhân nguyên khối (như Linux) có hầu hết tất cả các dịch vụ của chúng chạy ở chế độ kernel. Do đó, trình điều khiển gặp sự cố trong MINIX 3 dường như không thể làm sập toàn bộ hệ thống, trong khi điều này không phải là bất thường trong Linux.

    Các cuộc gọi hệ thống là nguyên thủy được sử dụng trong các hạt nhân nguyên khối (mô hình dữ liệu dùng chung) để chuyển từ chế độ người dùng sang chế độ kernel. Truyền tin nhắn là nguyên thủy được sử dụng trong microkernels (mô hình máy khách / máy chủ). Nói chính xác hơn, trong một thông báo, các lập trình viên hệ thống cũng sử dụng các cuộc gọi hệ thống để thu hút sự chú ý từ CPU. Truyền tin nhắn chỉ hiển thị cho các nhà phát triển hệ điều hành. Các hạt nhân nguyên khối sử dụng các cuộc gọi hệ thống nhanh hơn nhưng kém tin cậy hơn, trong khi các hạt nhân sử dụng chuyển tin nhắn chậm hơn nhưng cách ly lỗi tốt hơn.

    Vì vậy, 2 đề cập đến hai cách khác nhau để chuyển từ chế độ người dùng sang chế độ kernel.

  3. Để sửa lại, cách phổ biến nhất để tạo ra một ngắt phần mềm, hay còn gọi là bẫy, là bằng cách thực hiện một cuộc gọi hệ thống. Mặt khác, các ngắt được tạo ra hoàn toàn bằng phần cứng.

    Khi chúng ta làm gián đoạn CPU (bằng phần mềm hoặc bằng phần cứng), nó cần lưu ở đâu đó trạng thái hiện tại - quá trình mà nó thực thi và tại thời điểm nó dừng lại - nếu không nó sẽ không thể tiếp tục quá trình khi chuyển trở lại . Đó được gọi là chuyển đổi ngữ cảnh và nó có ý nghĩa: Trước khi bạn tắt máy tính để làm việc khác, trước tiên bạn cần đảm bảo rằng bạn đã lưu tất cả các chương trình / tài liệu của mình, v.v để bạn có thể tiếp tục từ điểm bạn đã dừng lần sau bạn sẽ bật nó lên :)

    Do đó, 3 giải thích những gì cần phải được thực hiện sau khi thực hiện một cái bẫy hoặc một ngắt và hai trường hợp tương tự như thế nào.


1
Cảm ơn! (1) Trong 1, bạn có nghĩa là hai cách thu hút sự chú ý từ CPU là ngắt phần mềm (chương trình với ví dụ cuộc gọi hệ thống) và ngắt phần cứng (ví dụ về phím đặt lại)? (2) Trong 2, bạn có nghĩa là cuộc gọi hệ thống và tin nhắn truyền qua là hai cách làm gián đoạn phần mềm? (3) Có đúng là mục đích của ngắt phần mềm là để xử lý yêu cầu tài nguyên và dịch vụ kernel, và mục đích của ngắt phần cứng là không ? Nếu có, mục đích của phần cứng bị gián đoạn là gì?
Tim

1
(1) Đúng. (2) Chà, các cuộc gọi hệ thống và chuyển tin nhắn là hai kỹ thuật khác nhau có thể được sử dụng để đạt được Giao tiếp liên tiến trình. Nhưng sự thật là cả hai đều dựa trên phần mềm, do đó để thu hút sự chú ý từ CPU mà bạn thực hiện bẫy (ngắt phần mềm). (3) Theo một nghĩa nào đó, có. Một ví dụ về yêu cầu dịch vụ kernel đang thực hiện thủ tục thư viện (sẽ được dịch thành 1 hoặc nhiều cuộc gọi hệ thống) như creatđể tạo một tệp mới. Một ví dụ về ngắt là máy in gửi tín hiệu đến CPU để thông báo cho nó rằng việc in đã hoàn tất.
sakisk

1
Cảm ơn! Về (3), bạn có nghĩa là không? Mục đích chung của ngắt phần cứng và ngắt phần mềm là gì?
Tim

1
Thiết lập lại hệ thống không phải là một ngắt; Nó không lưu trạng thái để tiếp tục sau.
psusi

1
@faif reset và NMI (Non Maskable Interrupt) là hai chân khác nhau trên CPU. Cái sau gây ra một ngắt, có nghĩa là để lưu trạng thái và nhảy đến xử lý. Cái trước khởi tạo CPU (cố ý loại bỏ tất cả trạng thái) giống như khi bật nguồn (thiết lập lại được tự động khẳng định khi bật nguồn). Vì một phần của định nghĩa của ngắt là nó lưu trạng thái, nên thiết lập lại không đáp ứng định nghĩa đó.
psusi

9

Các cuộc gọi hệ thống, chuyển tin nhắn (như được mô tả trong bài viết Wikipedia) và ngắt là tất cả những điều gây ra chuyển đổi ngữ cảnh hoặc chuyển từ chế độ người dùng sang chế độ kernel. Như bạn có thể biết:

  • chế độ kernel: các chương trình có chế độ xem bộ nhớ phẳng hoặc thực và các chương trình có thể đọc / ghi tự do cho tất cả bộ nhớ và tất cả các thiết bị phần cứng trực tiếp mà không bị hạn chế.

  • chế độ người dùng: các chương trình có chế độ xem ảo hóa bộ nhớ, các chương trình không thể đọc / ghi tự do vào tất cả bộ nhớ và không thể đọc / ghi trực tiếp các thiết bị phần cứng. Để có thêm bộ nhớ hoặc truy cập các thiết bị phần cứng, chương trình chế độ người dùng phải gọi kernel. Các cuộc gọi hệ thống và chuyển tin nhắn là hai phương thức để thực hiện việc này.

Các cuộc gọi hệ thống liên quan đến việc thực hiện một lệnh CPU cụ thể hoặc bộ hướng dẫn, làm cho CPU nhảy (địa chỉ trả lại lần đầu tiên trên ngăn xếp) đến một địa chỉ được xác định trước (không thể ghi vào chế độ người dùng) và chuyển CPU từ chế độ người dùng sang chế độ kernel (đổ chuông 3 đến vòng 0 trong kiến ​​trúc Intel).

Các ngắt phần cứng làm nhiều việc tương tự, chúng làm cho CPU nhảy (lần đầu tiên lưu địa chỉ trả về trên ngăn xếp) đến một địa chỉ được xác định trước và chuyển CPU từ chế độ người dùng sang chế độ kernel. Vì vậy, trong nhiều CPU, cơ chế tương tự có thể được gọi bằng phần mềm (được gọi là "ngắt phần mềm") và có thể được sử dụng cho các cuộc gọi CPU.

Truyền tin nhắn ngụ ý (ít nhất là với tôi) rằng hạt nhân là một "quy trình đang chạy" sẽ nhận được một dòng tin nhắn và tồn tại một chức năng có thể truy cập ở chế độ người dùng sẽ gửi các tin nhắn đó. Hoặc có thể là chức năng "gửi" chỉ chuyển các giá trị trên ngăn xếp và lần tiếp theo hạt nhân có quyền kiểm soát (nếu một khối quá trình hoặc xảy ra gián đoạn), nó sẽ bật các thông báo ra khỏi ngăn xếp và gửi đến các thường trình bên trong.

Trong kiến ​​trúc vi hạt mà "nhân" thực tế rất nhỏ và hầu hết các chức năng mà nhân cung cấp được chuyển đến các quy trình "máy chủ", tất cả các chức năng này có thể đang chạy đồng thời trên hệ thống nhiều CPU, một cái gì đó như thế này có thể nhiều hơn hữu ích hơn so với cách tiếp cận cuộc gọi hệ thống cũ đơn giản. Phiên dịch và định tuyến "thông điệp" đến "máy chủ" hạt nhân thích hợp sẽ là một trong số ít công việc của hạt nhân.


3
Chế độ kernel sử dụng cùng một bảng trang và thể hiện cùng một chế độ xem bộ nhớ ảo như chế độ người dùng. Sự khác biệt là nó có quyền truy cập vào các trang được đánh dấu là bị hạn chế ở chế độ kernel.
psusi

5

Truyền tin nhắn là một khái niệm cấp cao hơn của một quá trình gửi tin nhắn đến một quá trình khác. Nó được thực hiện bởi một cuộc gọi hệ thống (kernel), yêu cầu kernel chuyển thông điệp đến tiến trình khác. Các cuộc gọi hệ thống yêu cầu kernel thực hiện các dịch vụ khác nhau cho quy trình. Chúng được thực hiện bởi một bẫy phần mềm / hệ thống, khiến cpu lưu một số trạng thái trên ngăn xếp để nó có thể quay lại sau, sau đó chuyển sang chế độ kernel và chuyển sang xử lý kernel.

Cả hai ngắt phần cứng và phần mềm đều khiến cpu lưu trạng thái, chuyển sang chế độ kernel và chuyển sang một trình xử lý được xác định cho ngắt đó. Sự khác biệt là các ngắt phần cứng được tạo ra bởi phần cứng bên ngoài khi chúng cần được chú ý, chẳng hạn như bàn phím cho biết phím đã được nhấn. Trình xử lý bàn phím sau đó có thể đọc cổng IO của bàn phím để xem phím nào được nhấn và thực hiện hành động thích hợp, sau đó quay lại chương trình bị gián đoạn.

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.