Jawaban:
Setiap I / O ditangani oleh panggilan sistem yang dipanggil oleh suatu proses. Akhirnya panggilan sistem semacam itu akan mengalir ke beberapa fungsi driver perangkat tingkat rendah yang sesuai untuk melakukan operasi I / O yang sebenarnya.
I / O bisa rumit - untuk benar-benar mendapatkan data masuk dan keluar dari perangkat, berbagai langkah mungkin perlu diikuti, agar dan mungkin dengan persyaratan waktu. Jika langkah-langkah ini tidak diselesaikan secara atomis, pada saat mereka dicoba, perangkat mungkin tidak merespons, berperilaku salah, atau bahkan menyebabkan sistem terkunci. Langkah-langkah ini mungkin berbeda dan unik untuk setiap perangkat, karenanya mengapa ada begitu banyak driver perangkat.
Pengandar perangkat yang ditulis dengan baik harus tahu cara menangani perangkat yang dicoba untuk diservis, sehingga biasanya tidak akan mengalami masalah kecuali ada bug driver, Anda menggunakan driver yang salah untuk perangkat, atau perangkat fisik gagal.
Sekarang saya telah membaca buku "Desain Sistem Operasi Unix" oleh Maurice Bach, izinkan saya menjawab pertanyaan ini sendiri.
Singkatnya, membuat I / O tidak terputus adalah untuk tujuan membuat tugas I / O selesai ASAP, tanpa diganggu oleh sinyal.
Beberapa pengetahuan terkait yang saya peroleh dari buku:
Beberapa jalur kode di kernel ditandai tidak dapat diganggu gugat, sebagian besar karena kode harus mematuhi waktu yang ketat (untuk menjawab perangkat) atau karena melakukan sesuatu yang tidak menerima gangguan. Dalam kasus Linux, sebagian besar yang pertama telah didorong ke tapak independen di dalam kernel, dan yang kedua sebagian besar telah diberantas (saya menduga sebagian besar di bawah tekanan dari mesin multi-CPU saat ini). Yaitu, sudah beberapa waktu sekarang saya belum melihat proses dalam tidur tanpa gangguan.
write(2)
diizinkan untuk kembali lebih awal, mengembalikan jumlah byte sebenarnya yang ditulis, yang bisa kurang dari panjang buffer yang dilewati sebagai argumen ke-3.