Câu trả lời:
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.
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:
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.
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.