Tại sao I / O không bị gián đoạn?


11

Lý do đằng sau làm cho I / O không bị gián đoạn là gì? Điều gì sẽ dẫn đến hậu quả tiêu cực nếu một I / O xử lý quá trình được phép xử lý tín hiệu?


write(2)được phép trả về sớm, trả về số byte thực tế được ghi, có thể nhỏ hơn độ dài bộ đệm được truyền như đối số thứ 3.
Peter Cordes

Câu trả lời:


9

Bất kỳ I / O nào được xử lý bởi một cuộc gọi hệ thống được gọi bởi một quy trình. Cuối cùng, một cuộc gọi hệ thống như vậy sẽ đi xuống một số chức năng trình điều khiển thiết bị cấp thấp thích hợp để thực hiện thao tác I / O thực tế.

I / O có thể khó khăn - để thực sự lấy dữ liệu vào và ra khỏi thiết bị, các bước khác nhau có thể cần phải được thực hiện, theo thứ tự và có thể với các yêu cầu về thời gian. Nếu các bước này không được hoàn thành về mặt nguyên tử, lần sau khi chúng được thử, thiết bị có thể không phản hồi, hoạt động sai hoặc thậm chí khiến hệ thống bị khóa. Các bước này có thể khác nhau và duy nhất cho mỗi thiết bị, do đó có rất nhiều trình điều khiển thiết bị.

Trình điều khiển thiết bị được viết tốt nên biết cách xử lý thiết bị đang cố gắng bảo trì, do đó, thiết bị thường không gặp sự cố trừ khi có lỗi trình điều khiển, bạn đang sử dụng trình điều khiển sai cho thiết bị hoặc thiết bị vật lý bị lỗi.


5

Bây giờ tôi đã đọc cuốn sách "Thiết kế hệ điều hành Unix" của Maurice Bach, hãy để tôi tự trả lời câu hỏi này.

Nói tóm lại, làm cho I / O không bị gián đoạn là nhằm mục đích làm cho nhiệm vụ I / O kết thúc càng sớm càng tốt, mà không bị nhiễu bởi các tín hiệu.

Một số kiến ​​thức liên quan mà tôi có được từ cuốn sách:

  1. Từ "không thể gián đoạn" nên nói đến "giấc ngủ không bị gián đoạn". Khi một quá trình đang trong giấc ngủ không bị gián đoạn, nó KHÔNG thể bị đánh thức bởi các tín hiệu, cũng như không thể xử lý các tín hiệu.
  2. Một quá trình xử lý tín hiệu khi: a. nó đang chạy ở chế độ kernel và sắp trở về chế độ người dùng. b. nó sắp vào và rời khỏi trạng thái ngủ khi giấc ngủ bị gián đoạn.
  3. Điều gì xảy ra khi một quá trình ngủ được đánh thức bởi một tín hiệu? Nó sẽ xử lý tín hiệu, với hành động mặc định là thoát khỏi quá trình. Khi một quá trình đang chờ hoàn thành I / O, tất nhiên bạn không muốn nó thoát sớm.

2

Một số đường dẫn mã trong kernel được đánh dấu không bị gián đoạn, chủ yếu là do mã phải tuân thủ thời gian nghiêm ngặt (để trả lời thiết bị) hoặc vì nó đang làm gì đó không thừa nhận nhiễu. Trong trường hợp của Linux, hầu hết các phiên bản cũ đã bị đẩy ra các lõi trong nhân độc lập và phần thứ hai hầu như bị xóa sổ (tôi nghi ngờ chủ yếu là chịu áp lực từ các máy đa CPU hiện tại). Tức là, đã đến lúc tôi không thấy một quá trình trong giấc ngủ không bị gián đoạn.


3
Hãy thử đọc một đĩa CD bị trầy xước.
Joshua

1
Hoặc gắn với sshfs và sau đó kéo trên dây mạng. Giấc ngủ không thể lặp lại xảy ra, ngay cả ngày nay, khi phương tiện / lưu trữ cơ bản hoạt động. Và nó thường là một cơn đau đẫm máu ở mông để đối phó.
Nubarke
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.