Sự khác biệt giữa các cuộc gọi hệ thống chậm và các cuộc gọi hệ thống nhanh


13

Sự khác biệt giữa các cuộc gọi hệ thống chậm và cuộc gọi hệ thống nhanh là gì? Tôi đã học được rằng cuộc gọi hệ thống chậm có thể chặn nếu quá trình bắt được một số tín hiệu, bởi vì các tín hiệu bị bắt có thể đánh thức cuộc gọi hệ thống bị chặn, nhưng tôi không thể hiểu chính xác cơ chế này. Bất kỳ ví dụ sẽ được đánh giá cao.

Câu trả lời:


19

Trong thực tế, có ba cấp độ trong các cuộc gọi hệ thống.

  1. Một số cuộc gọi hệ thống trở lại ngay lập tức. Ngay lập tức, có nghĩa là điều duy nhất họ cần là một chút thời gian xử lý. Không có giới hạn cứng đối với thời gian họ có thể mất (ngoại trừ trong các hệ thống thời gian thực ), nhưng các cuộc gọi này sẽ trở lại ngay khi chúng được lên lịch đủ lâu.
    Các cuộc gọi này thường được gọi là không chặn . Ví dụ về các cuộc gọi không chặn những cuộc gọi mà chỉ cần đọc một chút trạng thái hệ thống, hoặc thực hiện một sự thay đổi đơn giản để trạng thái hệ thống, chẳng hạn như getpid, gettimeofday, getuidhoặc setuid. Một số cuộc gọi hệ thống có thể bị chặn hoặc không chặn tùy theo hoàn cảnh; ví dụ: readkhông bao giờ chặn nếu tệp là một đường ống hoặc loại khác hỗ trợ đọc không chặn và O_NONBLOCKcờ được đặt.
  2. Một vài cuộc gọi hệ thống có thể mất một lúc để hoàn thành, nhưng không phải là mãi mãi. Một ví dụ điển hình là sleep.
  3. Một số cuộc gọi hệ thống sẽ không trở lại cho đến khi một số sự kiện bên ngoài xảy ra. Những cuộc gọi này được cho là đang chặn . Ví dụ, readđược gọi trên một mô tả tập tin chặn đang chặn, và như vậy là wait.

Sự khác biệt giữa các cuộc gọi hệ thống của Fast fast và và chậm chậm gần với việc không chặn so với chặn, nhưng lần này theo quan điểm của người thực hiện kernel. Một tòa nhà cao tầng nhanh là một tòa nhà được biết là có thể hoàn thành mà không cần chặn hoặc chờ đợi. Khi kernel gặp một tòa nhà nhanh, nó biết rằng nó có thể thực thi tòa nhà ngay lập tức và giữ nguyên quy trình theo lịch trình. (Trong một số hệ điều hành không ưu tiên multitasking, syscalls nhanh có thể không ưu tiên;. Đây không phải là trường hợp trong các hệ thống unix bình thường) Mặt khác, một syscall chậm có khả năng đòi hỏi phải chờ đợi cho một nhiệm vụ để hoàn thành, vì vậy hạt nhân phải chuẩn bị để tạm dừng quá trình gọi và chạy một nhiệm vụ khác.

Một số trường hợp là một chút của một khu vực màu xám. Ví dụ, một đĩa đọc ( readtừ một tệp thông thường) thường được coi là không chặn, vì nó không chờ quá trình khác; nó chỉ chờ đĩa, thường chỉ mất một ít thời gian để trả lời, nhưng sẽ không mất mãi mãi (vì vậy đó là trường hợp 2 ở trên). Nhưng từ quan điểm của kernel, quá trình này phải đợi trình điều khiển đĩa hoàn tất, vì vậy đây chắc chắn là một tòa nhà chậm.


cảm ơn rất nhiều Nhưng nếu tập tin là một đường ống, việc đọc tập tin không bị chặn? xem www2.hawaii.edu/~esb/2007spring.ics612/apr10.html
KayKay

nó biểu thị "đọc / ghi chậm (ví dụ: trên đường ống hoặc thiết bị đầu cuối)"
KayKay

@KayKay: Đối với một đường ống, bạn có thể có cả hai, tùy thuộc vào trạng thái của O_NONBLOCKcờ. Nếu cờ được đặt, tòa nhà có thể hoàn thành mà không phải chờ đợi bất cứ điều gì khác, vì vậy nó không bị chặn và hạt nhân có thể coi nó là một tòa nhà nhanh.
Gilles 'SO- đừng trở nên xấu xa'

ý bạn là nó phụ thuộc vào cờ O_NONBLOCK!
KayKay

3

Cuộc gọi hệ thống chậm là một cái gì đó giống như một ổ cắm TCP đọc () - nếu bạn không cài đặt O_ASYNC (hoặc bất cứ thứ gì), nó có thể chờ đợi mãi mãi.

Một cuộc gọi hệ thống nhanh là một cái gì đó như gettimeofday () hoặc getpid (), cả hai đều trả lại thông tin cho quá trình mà kernel có sẵn ngay lập tức.

Đĩa đọc thuộc danh mục các cuộc gọi hệ thống chậm. Nếu một quá trình thực hiện đọc () trên một tệp đĩa thực, mô tả tệp, hạt nhân có thể phải đọc trong một hoặc nhiều khối đĩa để đáp ứng việc đọc. Tùy thuộc vào cấu trúc trên đĩa của hệ thống tệp bên dưới, điều này có thể có nghĩa là đọc mã trên đĩa để lấy số khối của "khối gián tiếp", đọc khối gián tiếp để lấy khối dữ liệu và sau đó tự đọc khối dữ liệu . Khá tốn thời gian, ít nhất là về chu kỳ CPU trên mỗi lần truy cập đĩa, có thể ngày nay còn tệ hơn so với thời kỳ cũ.

Tôi đã không thấy điều này từ lâu, nhưng "nửa dưới" của mã trình điều khiển thiết bị ổ đĩa Unix cũ sẽ chặn tín hiệu / ngắt để dễ duy trì tính toàn vẹn của hệ thống tệp trên đĩa. Đôi khi, trình điều khiển bị lỗi hoặc lỗi đĩa sẽ không bao giờ cung cấp khối đĩa mà một quy trình đã yêu cầu và quá trình này đã ngủ mãi mãi. Ngay cả một kill -9 cũng không làm gì với 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.