Mengapa saya / O tidak dapat diganggu?

11

Apa alasan di balik membuat I / O tidak terputus? Apa konsekuensi negatifnya jika proses yang menangani I / O diizinkan menangani sinyal?

twimo
sumber
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.
Peter Cordes

Jawaban:

9

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.

LawrenceC
sumber
5

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:

  1. Kata "tidak terputus" harus merujuk pada "tidur tanpa gangguan". Ketika suatu proses dalam tidur tanpa gangguan, itu TIDAK dapat dibangunkan oleh sinyal, juga tidak dapat menangani sinyal.
  2. Suatu proses menangani sinyal ketika: a. itu berjalan dalam mode kernel dan akan kembali ke mode pengguna. b. itu akan memasuki dan meninggalkan kondisi tidur ketika tidur dapat disela.
  3. Apa yang terjadi ketika proses tidur dibangunkan oleh sinyal? Itu akan menangani sinyal, dengan aksi default yang keluar dari proses. Ketika suatu proses menunggu penyelesaian I / O, Anda tentu saja tidak ingin itu keluar sebelum waktunya.
twimo
sumber
2

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.

vonbrand
sumber
3
Coba baca CD yang tergores.
Joshua
1
Atau pemasangan dengan sshfs dan kemudian menarik kabel jaringan. Tidur tanpa gangguan memang terjadi, bahkan saat ini, ketika media / penyimpanan yang mendasarinya bertindak. Dan biasanya rasa sakit yang berdarah di pantat untuk berurusan dengan.
Nubarke