Відповіді:
Будь-який ввід / вивід обробляється системним викликом, на який викликається процес. Врешті-решт такий системний виклик спуститься до деякої відповідної функції драйвера пристрою низького рівня для виконання фактичної операції вводу / виводу.
Введення / виведення може бути складним - щоб фактично отримувати дані на пристрій і виходити з нього, можливо, потрібно буде дотримуватися різних кроків у порядку та, можливо, з вимогами до часу. Якщо ці кроки не виконані атомно, наступного разу, коли їх спробують, пристрій може не реагувати, не поводитися чи навіть спричиняти блокування системи. Ці кроки можуть бути різними та унікальними для кожного пристрою, отже, чому так багато драйверів пристроїв.
Добре написаний драйвер пристрою повинен знати, як боротися з пристроєм, який він намагається обслуговувати, тому зазвичай він не повинен мати проблем, якщо немає помилки драйверів, ви використовуєте неправильний драйвер для пристрою або фізичний пристрій виходить з ладу.
Тепер, коли я прочитав книгу "Конструкція операційних систем Unix" Моріса Баха, дозвольте собі відповісти на це питання.
Коротше кажучи, зробити введення / виведення безперебійним - це завдання, щоб завдання вводу / виводу закінчити якнайшвидше, не заважаючи сигналам.
Деякі пов'язані знання, які я отримав із книги:
Деякі кодові шляхи в ядрі позначені безперебійними, в основному тому, що код повинен дотримуватися суворого часу (щоб відповісти на пристрій) або тому, що він робить щось, що не допускає втручання. У випадку з Linux, більшість перших були витіснені в незалежні протектори в ядрі, а другі були здебільшого помилковими (я підозрюю, що вони знаходяться в основному під тиском нинішніх багатопроцесорних машин). Тобто, вже деякий час я не бачив процесу в режимі безперебійного сну.
write(2)
дозволено повертатися достроково, повертаючи фактично записане число байтів, яке може бути меншим за довжину буфера, передану як 3-й аргумент.