Artikel ini merupakan bagian buku Pengenalan Pemrograman Menggunakan Java
Sebelumnya: Cycle Ambil dan Eksekusi: Bahasa Mesin
Bagian 1.2
Event Asinkron: Loop Polling dan Interupsi
CPU menghabiskan sebagian besar waktunya untuk mengambil
instruksi dari memori dan mengeksekusinya. Tetapi CPU dan memori utama hanyalah
dua diantara banyak komponen pada sistem komputer nyata. Sistem
yang lengkap dari komputer mencakup beberapa perangkat seperti:
- - Hard disk atau solid state drive untuk menyimpan berkas program dan
data. (Perlu diingat bahwa memori utama hanya memegang sejumlah informasi
yang relatif kecil dan memegangnya selama sumber daya tetap nyala.
Hard disk atau solid state drive digunakan sebagai tempat penyimpanan permanen untuk jumlah informasi
yang lebih besar, tetapi program harus dimuat dari disk ke memori utama sebelum
program tersebut dieksekusi. Hard disk menyimpan data pada piringan magnetis yang
berputar, sedangan solid state drive merupakan perangkat elektronis murni tanpa
bagian yang bergerak.)
- - Keyboard dan mouse untuk masukan pengguna.
- -Monitor dan printer yang digunakan untuk menampilkan
keluaran komputer.
- - Perangkat keluaran audio yang memungkinan komputer untuk
mengeluarkan suara.
- - Antarmuka jaringan yang memungkinkan komputer untuk
berkomunikasi dengan komputer lainnya yang terhubung dengannya pada sebuah jaringan,
baik secara nirkabel atau dengan kabel.
- - Scanner yang mengubah gambar ke kode dalam bilangan
biner yang dapat disimpan dan diolah oleh komputer.
Daftar perangkat ini bisa ditambahkan lagi, ini karena sistem komputer dibangun
sedemikian rupa sehingga dapat dilakukan penambahan perangkat baru dengan mudah.
Terkadang CPU harus berkomunikasi dan mengontrol perangkat-perangkat tersebut.
CPU hanya bisa melakukan hal ini dengan mengeksekusi instruksi bahasa mesin
(hanya inilah yang bisa dilakukan CPU, titik). Cara kerjanya adalah untuk setiap
perangkat di sistem terdapat sebuah driver perangkat, yang
terdiri dari perangkat lunak yang akan dieksekusi CPU saat sedang
berurusan dengan perangkat tersebut. Pemasangan perangkat baru pada sistem
umumnya terdiri dari dari langkah: menghubungkan perangkat secara fisik ke
komputer, dan memasang perangkat lunak driver dari perangkat.
Tanpa driver dari perangkat, perangkat fisik saja akan tidak berguna, karena
CPU tidak akan bisa berkomunikasi dengan perangkat tersebut.
Sebuah sistem komputer yang terdiri dari banyak perangkat biasanya
diorganisasikan dengan menggabungkan satu perangkat dengan perangkat lainnya ke
satu atau lebih bus. Sebuah bus merupakan sebuah kumpulan
kabel yang membawa berbagai macam informasi diantara perangkat-perangkat yang terhubung
ke kabel-kabel tersebut. Kabel-kabel ini membawa data, alamat, dan sinyal kontrol.
Sebuah alamat akan mengarahkan data ke perangkat tertentu dan kemungkinan ke sebuah
register tertentu atau lokasi tertentu dari perangkat tersebut. Sinyal kontrol dapat digunakan
, sebagai contoh, oleh sebuah perangkat untuk memberitahukan perangkat lain bahwa
data telah tersedia di bus data untuk perangkatnya. Sebuah sistem komputer sederhana dapat di
organisasikan sebagai berikut:

Saat ini, perangkat seperti keyboard, mouse, dan antarmuka jaringan dapat menghasilkan
masukan yang perlu untuk diproses oleh CPU. Bagaiaman CPU mengetahui bahwa data telah ada?
? Salah satu gagasan sederhana, yang tidak memuaskan, adalah
CPU tetap memeriksa data yang masuk secara berulang-ulang. Saat CPU menemukan data,
ia memproses data tersebut. Metode ini disebut polling,
dikarenakan CPU menjajaki perangkat masukan secara berkala
untuk mencari tahu apakah perangkat memiliki masukan data untuk dilaporkan.
Sayangnya, meskipun polling sangat sederhana, metode ini juga sangat tidak efisien.
CPU dapat menghabiskan banyak waktu hanya untuk menunggu masukan.
Untuk menghindari ketidakefisienan ini, interupsi lebih
sering digunakan sebagai pengganti polling. Interupsi merupakan sinyal yang dikirimkan
oleh perangkat lain ke CPU. CPU merespon sinyal interrupt dengan mengesampingkan apapun
yang dilakukannya untuk merespon interupsi tersebut. Setelah CPU telah menangani
interupsi tersebut, CPU akan kembali ke hal yang dilakukannya sebelum interupsi terjadi.
Sebagai contoh, saat kamu menekan tombol di keyboard komputer maka sebuah interupsi keyboard
dikirimkan ke CPU. CPU akan merespon sinyal tersebut dengan menginterupsi yang sedang dilakukannya,
membaca tombol yang kamu tekan, memprosesnya, dan kembali ke pekerjaan yang dilakukan CPU
sebelum kamu menekan tombol tersebut.
Sekali lagi, kamu harus mengerti bahwa hal tersebut merupakan proses mekanis murni:
Sebuah perangkat mensinyalkan interupsi hanya dengan mengaktifkan sebuah kabel. CPU dibangun
sedemikian rupa sehingga saat kabel diaktifkan, CPU akan menyimpan informasi yang
memadai tentang apa yang dikerjakannya saat ini sehingga ia dapat kembali ke keadaan
yang sama nantinya. Informasi ini terdiri atas isi dari register internal yang penting
seperti program counter. Kemudian CPU akan melompat ke lokasi memori tertentu yang telah
ditentukan sebelumnya dan memulai mengeksekusi perintah yang tersimpan di sana. Intruksi-
intruksi tersebut membentuk sebuah interrupt handler yang melakukan
proses yang diperlukan dalam merespon interupsi. (Interrupt handler ini merupakan
bagian dari perangkat lunak driver perangkat yang mensinyalkan interupsi.) Pada
bagian akhir dari interrupt handler terdapat instruksi yang memerintahkan CPU untuk
melompat kembali ke tugas yang sebelumnya dilakukan; Hal ini dilakukan dengan mengembalikan
keadaan yang telah disimpan sebelumnya.
Interupsi memampukan CPU untuk mengatasi event asinkron.
Dalam cycle ambil dan eksekusi reguler, berbagai hal terjadi dalam urutan yang telah ditentukan;
semua yang terjadi "disinkronisasikan" dengan semua hal yang lainnya. Interupsi
memungkinan CPU untuk mengatasi event yang terjadi "secara asinkron"
dengan efisien, yakni yang terjadi dalam waktu yang tidak terprediksi.
Sebagai contoh lain bagaimana interupsi digunakan, pertimbangkan apa yang
terjadi saat CPU memerlukan pengaksesan data yang disimpan di hard disk.
CPU hanya dapat mengakses data secara langsung hanya jika data tersebut berada
dalam memori utama. Data di disk harus disalin ke memori sebelum dapat diakses.
Sayangnya, dalam skala kecepatan CPU beroperasi, disk drive sangatlah lambat.
Ketika CPU memerlukan data dari disk, ia memberikan sinyal ke disk drive yang
memerintahkannya untuk menentukan lokasi data dan mempersiapkannya. (Sinyal ini
dikirim secara sinkron, di bawah kontrol dari program reguler.) Kemudian, daripada
menunggu dalam waktu yang panjang dan tak terprediksi yang diperlukan disk drive
untuk mengerjakan hal tersebut, CPU melanjutkan kerjanya yang lain. Ketika
disk drive selesai mempersiapkan data, ia akan memberikan sinyal interupsi ke CPU.
Interrupt handler kemudian dapat membaca data yang telah diminta.
Sekarang mungkin kamu telah memperhatikan bahwa kesemuanya tersebut masuk
akal jika CPU sebenarnya memiliki beberapa tugas yang harus dikerjakan.
Jika ia tidak memiliki hal lain yang lebih baik untuk dikerjakan, maka CPU
mungkin akan menghabiskan waktunya melakukan polling terhadap masukan atau
menunggu selesainya operasi disk drive. Semua komputer modern menggunakan
metode multitasking untuk melakukan beberapa tugas bersamaan.
Beberapa jenis komputer dapat digunakan oleh beberapa orang secara bersamaan.
dikarenakan CPU sangatlah cepat, maka ia dapat memindahkan perhatiannya secara
cepat dari satu pengguna ke pengguna lainnya dengan memberikan pecahan waktu
untuk tiap pengguna sesuai gilirannya. Aplikasi dari multitasking ini disebut
timesharing. Namun komputer personal modern dengan satu pengguna
juga menggunakan multitasking. Sebagai contoh, pengguna dapat menulis paper
sementara jam di komputer tetap menunjukkan waktu dan sebuah berkas sedang
didownload dari jaringan.
Setiap tugas individual yang dilakukan CPU disebut sebagai thread.
(Atau proses; ada perbedaan teknis antara thread dan
proses, tetapi hal tersebut tidak penting disini, karena hanya thread
yang digunakan di Java.) Banyak CPU secara harfiah dapat mengeksekusi lebih
dari satu thread secara serentak -- CPU seperti ini memiliki banyak "inti",
dimana setiap inti dapat menjalankan sebuah thread -- tetapi selalu
ada batasan dari jumlah thread yang bisa dieksekusi dalam waktu yang sama.
Karena sering sekali ada banyak thread yang dapat dieksekusi secara serentak,
maka komputer harus mampu memindahkan perhatiannya dari satu thread ke
thread lainnya, sama seperti komputer timesharing mengubah perhatiannya
dari satu pengguna ke pengguna lainnya. Secara umum, thread yang sedang
dieksekusi akan tetap berjalan sampai salah satu dari beberapa hal ini terjadi:
- - Thread mungkin secara sukarela menyerahkan kontrolnya, untuk
memberikan kesempatan untuk berjalan pada thread lainnya.
- - Thread mungkin perlu menunggu beberapa event asinkron terjadi. Sebagai
contoh, thread mungkin meminta beberapa data dari disk drive, atau ia mungkin
menunggu pengguna menekan sebuah tombol. Sementara ia menunggu, thread akan
diblok, dan thread lain, jika ada, membeli kesempatan untuk
berjalan. Saat event yang ditunggu terjadi, interupsi akan "membangunkan"
thread sehingga ia dapat meneruskan kegiatannya.
- - Thread mungkin telah habis menggunakan potongan waktu yang diberikan dan
ditunda kegiatannya untuk memberikan kesempatan thread lain berjalan. Tidak
semua komputer dapat menunda "secara paksa" sebuah thread dengan cara tersebut;
Komputer yang dapat melakukannya disebut menggunakan preemptive multitasking.
Untuk melakukan preemptive multitasking, sebuah komputer memerlukan
perangkat timer khusus yang menghasilkan sebuah interupsi secara berkala,
misal 100 kali per detik. Ketika interupsi timer terjadi, CPU memiliki kesempatan
untuk berpindah dari satu thread ke thread lainnya, tidak peduli apakah thread
yang lagi bekerja menyukainya atau tidak. Semua komputer desktop dan
laptop modern, dan bahkan smartphone dan tablet yang umum pun, menggunakan
preemptive multitasking.
Pengguna biasa dan bahkan juga programmer biasa, tidak perlu berhubungan
dengan interupsi dan interrupt handler. Mereka dapat berkonsentrasi pada
tugas atau thread berbeda yang mereka ingin komputer lakukan; rincian akan
bagaimana komputer melakukan semua tugas-tugas tersebut tidaklah penting
untuk mereka. Bahkan kenyataannya, banyak pengguna, dan juga banyak programmer,
dapat mengabaikan thread dan multitasking sama sekali. Tetapi, thread telah
semakin menjadi penting dikarenakan komputer semakin canggih dan semakin
memanfaatkan pengunaan multitasking dan multiproses. Dan kenyataannya,
kemampuan untuk bekerja dengan thread menjadi hal yang esensial sebagai
bagian dari kemampuan programmer.
Untungnya, Java memiliki dukungan yang baik untuk thread, yang
dibangun ke dalam bahasa pemrograman Java sebagai konsep
pemrograman dasas. Pemrograman dengan thread akan dibahas di Bab 12.
Dasar konsep dari event asinkron secara umum sama pentingnya baik
dalam Java dan pemrograman modern. Meskipun programmer kenyataannya tidak
secara langsung berhadapan dengan interupsi, tetapi mereka sering mendapati
bahwa mereka menulis event handlers, sama seperti
interrupt handler yang dipanggil secara asinkron saat event tertentu
terjadi. "Pemrograman berbasis event-driven" ini memiliki citarasa yang
berbeda dari kebanyakan pemrograman sinkron tradisional. Kita akan memulai
dengan jenis pemrograman tradisional, yang masih digunakan untuk memrogram
tugas individual, tetapi kita akan kembali ke thread dan event nantinya,
yang dimulai di Bab 6
Perangkat lunak yang melakukan penanganan semua interupsi, menangani
komunikasi antar pengguna dan perangkat keras, dan mengontrol thread mana
yang diperboleh untuk berjalan disebut Sistem Operasi.
Sistem operasi merupakan perangkat lunak dasar dan penting yang tanpanya
komputer tidak akan berfungsi. Program lainnya seperti pengolah kata dan
penjelajah web, bergantung pada sistem operasi. Sistem operasi yang umumnya
dikenal adalah Linux, beberapa versi Windows, dan Mac OS.
Sebelumnya: Cycle Ambil dan Eksekusi: Bahasa Mesin