Perbedaan antara panggilan sistem yang lambat dan panggilan sistem yang cepat

13

Apa perbedaan antara panggilan sistem yang lambat dan panggilan sistem yang cepat? Saya telah belajar bahwa panggilan sistem yang lambat dapat memblokir jika proses menangkap beberapa sinyal, karena sinyal yang tertangkap dapat membangunkan panggilan sistem yang diblokir, tetapi saya tidak dapat benar-benar memahami mekanisme ini. Setiap contoh akan dihargai.

KayKay
sumber

Jawaban:

19

Sebenarnya ada tiga gradasi dalam panggilan sistem.

  1. Beberapa panggilan sistem segera kembali. "Segera" berarti bahwa satu-satunya yang mereka butuhkan adalah sedikit waktu prosesor. Tidak ada batasan untuk berapa lama mereka dapat mengambil (kecuali dalam sistem real-time ), tetapi panggilan ini kembali segera setelah mereka dijadwalkan cukup lama.
    Panggilan ini biasanya disebut non-pemblokiran . Contoh panggilan non-blocking panggilan yang hanya membaca sedikit sistem negara, atau membuat perubahan sederhana untuk keadaan sistem, seperti getpid, gettimeofday, getuidatau setuid. Beberapa panggilan sistem dapat memblokir atau tidak memblokir tergantung pada kondisinya; misalnya readtidak pernah memblokir jika file tersebut adalah pipa atau tipe lain yang mendukung pembacaan non-pemblokiran dan O_NONBLOCKflag ditetapkan.
  2. Beberapa panggilan sistem mungkin perlu waktu untuk diselesaikan, tetapi tidak selamanya. Contoh tipikal adalah sleep.
  3. Beberapa panggilan sistem tidak akan kembali sampai beberapa peristiwa eksternal terjadi. Panggilan-panggilan ini dikatakan memblokir . Sebagai contoh, readmemanggil deskriptor file blocking adalah blocking, dan begitu juga wait.

Perbedaan antara panggilan sistem "cepat" dan "lambat" dekat dengan non-pemblokiran vs pemblokiran, tetapi kali ini dari sudut pandang pelaksana kernel. Syscall cepat adalah salah satu yang diketahui dapat menyelesaikan tanpa memblokir atau menunggu. Ketika kernel menemukan syscall cepat, ia tahu itu dapat mengeksekusi syscall segera dan menjaga proses yang sama dijadwalkan. (Dalam beberapa sistem operasi dengan multitasking non-preemptive , syscall cepat mungkin non-preemptive; ini tidak terjadi pada sistem unix normal.) Di sisi lain, syscall yang lambat berpotensi membutuhkan menunggu tugas lain untuk diselesaikan, jadi kernel harus bersiap untuk menghentikan proses panggilan dan menjalankan tugas lain.

Beberapa case agak abu-abu. Misalnya pembacaan disk ( readdari file biasa) biasanya dianggap non-pemblokiran, karena tidak menunggu proses lain; hanya menunggu disk, yang biasanya hanya membutuhkan sedikit waktu untuk menjawab, tetapi tidak akan memakan waktu lama (jadi kasus 2 di atas). Tetapi dari perspektif kernel, prosesnya harus menunggu driver disk untuk menyelesaikan, jadi itu pasti syscall lambat.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
terima kasih banyak! tetapi jika file tersebut adalah sebuah pipa, apakah membaca file non-blocking? lihat bahwa www2.hawaii.edu/ ~ esb
KayKay
ini menandakan "lambat membaca / menulis (misalnya pada pipa atau terminal)"
KayKay
@ Kayay: Untuk pipa, Anda dapat memiliki keduanya, tergantung pada keadaan O_NONBLOCKbendera. Jika flag diset, syscall dapat selesai tanpa menunggu hal lain, jadi ini bukan pemblokiran, dan kernel dapat memperlakukannya sebagai syscall cepat.
Gilles 'SO- stop being evil'
maksudmu itu tergantung pada panji O_NONBLOCK!
KayKay
3

Panggilan sistem yang lambat adalah sesuatu seperti TCP socket read () - jika Anda tidak memiliki O_ASYNC (atau apa pun) yang diset, itu bisa menunggu selamanya.

Panggilan sistem yang cepat adalah sesuatu seperti gettimeofday () atau getpid (), yang keduanya mengembalikan informasi ke proses yang segera tersedia kernel.

Disk membaca termasuk dalam kategori panggilan sistem lambat. Jika suatu proses membaca () pada file disk yang benar, deskriptor file, kernel mungkin harus membaca dalam satu atau lebih blok disk untuk memenuhi pembacaan. Bergantung pada struktur di-disk sistem file yang mendasarinya, ini mungkin berarti membaca di-disk-inode untuk mendapatkan nomor blok disk dari "blok tidak langsung", membaca blok tidak langsung untuk mendapatkan blok data dan kemudian membaca blok data itu sendiri . Cukup memakan waktu, setidaknya dalam hal siklus CPU per akses disk, hari ini mungkin lebih buruk daripada di Hari Tua yang Baik.

Saya sudah lama tidak melihat ini, tetapi "bagian bawah" dari kode driver perangkat drive disk Unix lama akan memblokir sinyal / interupsi sehingga lebih mudah untuk mempertahankan integritas sistem file pada disk. Kadang-kadang, driver buggy atau disk yang gagal tidak akan pernah memberikan blok disk proses yang diminta, dan proses tidur selamanya. Bahkan kill -9 tidak melakukan apa-apa untuk itu.

Bruce Ediger
sumber