Penyebab Interupsi
6. Read-write, read only, atau write only: Beberapa perangkat memungkinkan baik input-output dua arah, tapi beberapa lainnya
7.12 Struktur Data Kernel
Kernel membutuhkan informasi keadaan tentang penggunakan komponen M/K. Kernel menggunakan banyak struktur yang mirip untuk melacak koneksi jaringan, komunikasi perangkat karakter, dan aktivitas M/K lainnya.
UNIX menyediakan akses sistem berkas untuk beberapa entiti, seperti berkas pengguna, raw devices, dan alamat tempat proses. Walaupun tiap entiti ini didukung sebuah operasi baca, semantiknya berbeda untuk tiap entiti. Seperti untuk membaca berkas pengguna, kernel perlu memeriksa buffer cache sebelum memutuskan apakah akan melaksanakan I/O disk. Untuk membaca sebuah raw disk, kernel perlu untuk memastikan bahwa ukuran permintaan adalah kelipatan dari ukuran sektor disk, dan masih terdapat di dalam batas sektor. Untuk memproses citra, cukup perlu untuk mengkopi data ke dalam memori. UNIX mengkapsulasikan perbedaan-perbedaan ini di dalam struktur yang seragam dengan menggunakan teknik object oriented.
Beberapa sistem operasi bahkan menggunakan metode object oriented secara lebih ekstensif. Sebagai contoh, Windows NT menggunakan implementasi message-passing untuk M/K. Sebuah permintaan I/O akan dikonversikan ke sebuah pesan yang dikirim melalui kernel kepada M/K manager dan kemudian ke device driver, yang masing-masing dapat mengubah isi pesan. Untuk output, isi message adalah data yang akan ditulis. Untuk input, message berisikan buffer untuk menerima data. Pendekatan message-passing ini dapat menambah overhead, dengan perbandingan dengan teknik prosedural yang membagi struktur data, tetapi akan mennyederhanakan struktur dan design dari sistem M/K tersebut dan menambah fleksibilitas.
Kesimpulannya, subsistem M/K mengkoordinasi kumpulan-kumpulan service yang banyak sekali, yang tersedia dari aplikasi maupun bagian lain dari kernel. Subsistem M/K mengawasi:
1. Managemen nama untuk berkas dan perangkat. 2. Kontrol akses untuk berkas dan perangkat.
3. Kontrol operasi, contoh: model yang tidak dapat dikenali. 4. Alokasi tempat sistem berkas.
5. Alokasi perangkat. 6. Buffering, caching, spooling. 7. Penjadualan M/K
8. Mengawasi status perangkat, error handling, dan kesalahan dalam recovery.
9. Konfigurasi dan utilisasi driver device 7.13 Penanganan Permintaan M/K
Di bagian sebelumnya, kita mendeskripsikan handshaking antara device driver dan pengendali perangkat, tapi kita tidak menjelaskan bagaimana Sistem Operasi menyambungkan permintaan aplikasi untuk menyiapkan jaringan menuju sektor disk yang spesifik.
Sistem Operasi yang modern mendapatkan fleksibilitas yang signifikan dari tahapan-tahapan tabel lookup di jalur diantara permintaan dan pengendali perangkat physical. Kita dapat mengenalkan perangkat dan driver baru ke komputer tanpa harus meng-compile ulang kernelnya. Sebagai fakta, ada beberapa sistem operasi yang mampu untuk me-load device drivers yang diinginkan. Pada waktu boot, sistem mula-mula meminta bus perangkat keras untuk menentukan perangkat apa yang ada, kemudian sistem me-load ke dalam driver yang sesuai; baik sesegera mungkin, maupun ketika diperlukan oleh sebuah permintaan M/K.
Sistem V UNIX mempunyai mekanisme yang menarik, yang disebut streams, yang membolehkan aplikasi untuk men-assemble pipeline dari kode driver secara dinamis. Sebuah stream adalah sebuah koneksi full duplex antara sebuah device driver dan sebuah proses user-level. Stream terdiri atas sebuah stream head yang merupakan antarmuka dengan user process, sebuah driver end yang mengontrol perangkat, dan nol atau lebih stream modules di antara mereka. Modules dapat didorong ke stream untuk menambah fungsionalitas di sebuah layered fashion. Sebagai gambaran sederhana, sebuah proses dapat membuka sebuah alat port serial melalui sebuah stream, dan dapat mendorong ke sebuah modul untuk memegang edit input. Stream dapat digunakan untuk interproses dan komunikasi jaringan. Faktanya, di Sistem V, mekanisme soket diimplementasikan dengan stream.
Berikut dideskripsikan sebuah lifecycle yang tipikal dari sebuah permintaan pembacaan blok:
1. Sebuah proses mengeluarkan sebuah blocking read system call ke sebuah berkas deskriptor dari berkas yang telah dibuka sebelumnya. 2. Kode system-call di kernel mengecek parameter untuk kebenaran.
Dalam kasus input, jika data telah siap di buffer cache, data akan dikembalikan ke proses dan permintaan M/K diselesaikan.
3. Jika data tidak berada dalam buffer cache, sebuah physical M/K akan bekerja, sehingga proses akan dikeluarkan dari antrian jalan (run queue) dan diletakkan di antrian tunggu (wait queue) untuk alat, dan permintaan M/K pun dijadualkan. Pada akhirnya, subsistem M/K mengirimkan permintaan ke device driver. Bergantung pada sistem operasi, permintaan dikirimkan melalui call subrutin atau melalui pesan in-kernel.
4. Device driver mengalokasikan ruang buffer pada kernel untuk menerima data, dan menjadualkan M/K. Pada akhirnya, driver mengirim perintah ke pengendali perangkat dengan menulis ke register device control.
5. Pengendali perangkat mengoperasikan perangkat keras perangkat untuk melakukan transfer data.
6. Driver dapat menerima status dan data, atau dapat menyiapkan transfer DMA ke memori kernel. Kita mengasumsikan bahwa transfer diatur oleh sebuah DMA controller, yang menggunakan interupsi ketika transfer selesai.
7. Interrupt handler yang sesuai menerima interupsi melalui tabel vektor-interupsi, menyimpan sejumlah data yang dibutuhkan, menandai device driver, dan kembali dari interupsi.
8. Device driver menerima tanda, menganalisa permintaan M/K mana yang telah diselesaikan, menganalisa status permintaan, dan menandai subsistem M/K kernel yang permintaannya telah terselesaikan. 9. Kernel mentransfer data atau mengembalikan kode ke ruang alamat
dari proses permintaan, dan memindahkan proses dari antrian tunggu kembali ke antrian siap.
Proses tidak diblok ketika dipindahkan ke antrian siap. Ketika penjadual (scheduler) mengembalikan proses ke CPU, proses meneruskan eksekusi pada penyelesaian dari system call.
7.14 I/O Streams
I/O stream adalah suatu mekanisme pengiriman data secara bertahap dan terus menerus melalui suatu aliran data dari proses ke peranti (begitu pula sebaliknya).
I/O Stream terdiri dari:
1. stream head yang berhubungan langsung dengan proses. 2. driver ends yang mengatur peranti-peranti
3. stream modules yang berada di antara stream head dan driver end, yang bertugas menyampaikan data ke driver end melalui write queue, maupun menyampaikan data ke proses melalui read queue dengan cara message passing.
Untuk memasukkan ke dalam stream digunakan ioctl() system call, sedangkan untuk menuliskan data ke peranti digunakan write()/ putmsg() system calls, dan untuk membaca data dari peranti digunakan read()/ getmsg() system calls.
7.15 Kinerja MK
M/K adalah faktor penting dalam kinerja sistem. M/K sering meminta CPU untuk mengeksekusi device-driver code dan menjadual proses secara efisien sewaktu memblock dan unblock. Hasil context switch men-stress ke CPU dan hardware cache-nya. M/K juga memberitahukan ketidakefisienan mekanisme penanganan interupsi dalam kernel, dan M/K me-load down memory bus saat data copy antara pengendali dan memori fisik, dan juga saat copy antara kernel buffers dan application data space. Mengkopi dengan semua permintaan ini adalah salah satu kekhawatiran dalam arsitektur komputer.
Walaupun komputer modern dapat menangani beribu-ribu interupsi per detik, namun penanganan interupsi adalah pekerjaan yang sulit. Setiap interupsi mengakibatkan sistem melakukan perubahan status, mengeksekusi interrupt handler lalu mengembalikan statusnya kembali. M/K yang terprogram dapat lebih efisien dibanding interrupt-driven I/O, jika waktu cycle yang dibutuhkan untuk busy-waiting tidak berlebihan. M/K yang sudah selesai biasanya meng-unblock sebuah proses lalu membawanya ke full overhead of context switch.
Network traffic juga dapat menyebabkan high context-switch rate. Coba diperhatikan, misalnya sebuah remote login dari sebuah mesin ke mesin lainnya. Setiap karakter yang diketikkan pada local machine harus dikirim ke remote machine. Pada local machine karakter akan diketikkan, lalu keyboard interrupt dibuat, dan karakter melewati interrupt handler menuju device-driver lalu ke kernel, setelah itu ke proses. Proses memanggil network I/O system call untuk mengirim karakter ke remote machine. Karakter lalu melewati local kernel, menuju ke lapisan-lapisan network yang membuat paket network, lalu ke network device driver. Network device driver mengirim paket itu ke network controller, yang mengirim karakter dan membuat interupsi. Interupsi kemudian dikembalikan ke kernel supaya I/O system call dapat selesai.
Sekarang remote system's network hardware sudah menerima paket, dan interupsi dibuat. Karakter di-unpack dari network protocol dan dikirim ke network daemon yang sesuai. Network daemon mengidentifikasi remote login session mana yang terlibat, dan mengirim paket ke subdaemon yang sesuai untuk session itu. Melalui alur ini, ada context switch dan state switch (lihat Gambar, “Gambar Komunikasi Interkomputer”). Biasanya, penerima mengirim kembali karakter ke pengirim.
Gambar 7-7 Gambar Komunikasi Interkomputer Gambar ini diadaptasi dari [Silberschatz2002, halaman 484].
Developer Solaris mengimplementasikan kembali telnet daemon menggunakan kernel-thread untuk menghilangkan context switch yang terlibat dalam pemindahan karakter dari daemon ke kernel. Sun memperkirakan bahwa perkembangan ini akan menambah jumlah maksimum network logins dari beberapa ratus hingga beberapa ribu (pada server besar).
Sistem lain menggunakan front-end processor yang terpisah untuk terminal M/K, supaya mengurangi beban interupsi pada main CPU. Misalnya, sebuah terminal concentrator dapat mengirim sinyal secara bersamaan dari beratus-ratus terminal ke satu port di large computer. Sebuah I/O channel adalah sebuah CPU yang memiliki tujuan khusus yang ditemukan pada mainframe dan pada sistem high-end lainnya. Kegunaan dari I/O channel adalah untuk meng-offload I/O work dari main CPU. Prinsipnya adalah channel tersebut menjaga supaya lalu lintas data lancar, sehingga main CPU dapat bebas memproses data. Seperti device controller dan DMA controller yang ada pada smaller computer, sebuah channel dapat memproses program-program yang umum dan kompleks, jadi channel dapat digunakan untuk workload tertentu.
Kita dapat menggunakan beberapa prinsip untuk menambah efisiensi M/K: 1. Mengurangi context switch.
2. Mengurangi jumlah pengsalinan data dalam memori sewaktu pengiriman antara peranti dan aplikasi.
3. Mengurangi jumlah interupsi dengan menggunakan transfer besar-besaran, smart controller, dan polling (jika busy-waiting dapat diminimalisir).
4. Menambah konkurensi dengan menggunakan pengendali atau channel DMA yang sudah diketahui untuk meng-offload kopi data sederhana dari CPU.
5. Memindahkan processing primitives ke perangkat keras, supaya operasi pada device controller konkuren dengan CPU dan operasi bus. 6. Keseimbangan antara CPU, memory subsystem, bus dan kinerja M/K,
karena sebuah overload pada salah satu area akan menyebabkan keterlambatan pada yang lain.
Kompleksitas peranti berbeda-beda, misalnya mouse. Mouse adalah peranti yang sederhana. Pergerakan mouse dan button click diubah menjadi nilai numerik yang dikirim dari perangkat keras (melalui mouse device driver) menuju aplikasinya. Kebalikan dari mouse, fungsionalitas yang disediakan NT disk device driver sangatlah kompleks. NT disk device driver tidak hanya mengatur individual disk, tapi juga mengimplementasikan RAID array. Untuk dapat melakukannya, NT disk device driver mengubah read atau pun write request dari aplikasi menjadi coordinated set of disk I/O operations. Terlebih lagi, NT disk device driver mengimplementasikan penanganan error dan algoritma data-recovery, lalu mengambil langkah-langkah untuk mengoptimalkan kinerja disk, karena kinerja penyimpanan sekunder adalah hal penting untuk keseluruhan kinerja sistem.
Kapan fungsionalitas M/K dapat diimplementasikan? Pada device hardware, device driver, atau pada aplikasi perangkat lunak?
Mula-mula kita implementasikan eksperimen algoritma M/K pada application level, karena application code lebih fleksibel, dan application bug tidak membuat sistem crash. Terlebih lagi dengan mengembangkan kode pada application level, kita dapat menghindari reboot atau pun reload device driver setiap mengganti kode. Bagaimana pun juga sebuah implementasi pada application level dapat tidak efisien, karena overhead of context switch, dan karena aplikasi tidak dapat menerima kemudahan dari internal kernel data structure dan fungsionalitas kernel (seperti internal kernel messaging, threading, dan locking yang efisien). Ketika algoritma application level memperlihatkan kegunaannya, kita dapat mengimplementasikan kembali kernel, sehingga dapat menambah kinerja. Akan tetapi, usaha pengembangan sulit dilakukan karena sistem operasi kernel adalah sistem perangkat lunak yang besar dan kompleks.
Terlebih lagi, dalam pengimplementasian internal kernel harus di-debug secara hati-hati untuk menghindari data corrupt dan sistem crash.
Kinerja tertinggi dapat didapatkan dengan cara implementasi spesial dalam perangkat keras, baik dalam peranti atau pun pengendali. Kerugian dari implementasi perangkat keras termasuk kesulitan dan pengorbanan dari membuat kemajuan atau dari pembetulan bug, dan bertambahnya development time (dalam satuan bulan, bukan hari), dan berkurangnya fleksibilitas.
Misalnya, sebuah hardware RAID controller mungkin saja tidak memberikan izin kepada kernel untuk mempengaruhi urutan atau pun lokasi dari individual block reads and writes, walaupun kernel memiliki informasi tertentu tentang workload yang mampu membuat kernel meningkatkan kinerja M/K.
Rangkuman
Subsistem kernel M/K menyediakan layanan yang berhubungan langsung dengan perangkat keras. Layanan Penjadualan M/K mengurutkan antrian permintaan pada tiap perangkat dengan tujuan untuk meningkatkan efisiensi dari sistem dan waktu respon rata-rata yang harus dialami oleh aplikasi.
Ada tiga alasan melakukan layanan Buffering, yaitu menyangkut perbedaan kecepatan produsen-konsumen, perbedaan ukuran transfer data dan dukungan copy semantics untuk aplikasi M/K. Fungsi buffering dan caching memiliki perbedaan dalam hal tujuan. Caching menyimpan salinan data asli pada area memori dengan tujuan agar bisa diakses lebih cepat, sedangkan buffering menyalin data asli agar dapat menyimpan satu-satunya informasi data.
Subsistem M/K mengkoordinasi kumpulan-kumpulan sevice yang banyak sekali, yang tersedia dari aplikasi atau bagian lain dari kernel. Penanganan permintaan M/K dilakukan dengan suatu mekanisme yang dideskripsikan sebagai sebuah life cycle.
Layanan I/O Streams menggunakan suatu mekanisme pengiriman data secara bertahap dan terus menerus melalui suatu aliran data dari piranti ke proses