4.4.1 KONSEP SINKRONISASI
Sistem konkuren umumnya memungkinkan proses-proses melakukan akses secara konkuren ke suatu sumberdaya yang dibagipakai bersama. Hal ini menimbulkan race condition, yaitu kondisi saat lebih dari satu proses berusaha mengakses suatu sumberdaya pada suatu saat yang bersamaan. Race condition ini membawa dampak terhadap konsistensi dan keabsahan kondisi dari sumberdaya yang diakses tersebut.
Untuk menjelaskan masalah yang muncul akibat race condition, dicontohkan Aplikasi Transfer Uang pada Gambar 4.10. Sebaga contoh, dua proses terpisah sedang melakukan transfer uang sebesar 10 (proses P1), dan sebesar 20 (proses P2) ke suatu nomor rekening yang sama yang memiliki saldo awal sebesar 100. Jika kedua aktivitas transfer uang tersebut berjalan secara benar, maka saldo akhir rekening mestinya 130. Namun, terlihat dari contoh, bahwa jika proses transfer P1 dan P2, yang berjalan terpisah namun konkuren tidak dikoordinasi dengan baik maka mungkin akan terjadi race condition dan menghasilkan saldo akhir yang salah, yaitu 110 atau 120.
Di manakah letak permasalahannya? Permasalahannya terletak pada kode yang melakukan akses ke sumber-daya yang digunakan bersama oleh proses P1 dan P2. yaitu variabel balance atau saldo rekening. Kedua proses P1 dan P2 membaca nilai balance dan mengubah, atau lebih tepatnya menjumlahkan dengan suatu nilai sesuai dengan uang yang ditransfer oleh masing-masing proses.
Kode bahasa C yang melakukan pembacaan dan pengubahan (yaitu balance+= amount) jika dikompilasi akan menghasilkan tiga instruksi biner yang dalam Bahasa Assembly adalah:
- Load (membaca data dari memori, yaitu variabel balance, ke register)
- Add (menjumlahkan suatu nilai, yaitu uang yang ditransfer ke register)
- Store (menyimpan nilai register ke memori, yaitu variabel balance).
Ketiga instruksi biner tersebut merupakan satu kesatuan dan harus di- jalankan secara atomik atau utuh. Artinya selama eksekusi ketiga instruk- si biner ini harus dipastikan tidak ada proses lain yang juga membaca atau mengubah nilai variabel balance.
Jika aplikasi di atas dijalankan pada model client-server, server yang melayani permintaan transfer dari proses P1 dan P2, sangat mungkin melakukan penjadwalan eksekusi intruksi Pl dan P2 seperti yang ditunjukkan pada Gambar 4.10. Misalnya prosesor server menjadwal eksekusi perintah P1 (load), kemudian P2(load), kembali sedang ke Pl (add), kemudian P2 (add), P1 (store) sehingga variabel balance menjadi 110, kemudian P2 (store) sehingga akhirnya variabel balance menjadi 120.
Secara logika, hasil ini salah, karena nilai seharusnya adalah 130. Kondisi ini terjadi karena prosesor server tidak melakukan perintah Load, Add, Save dari proses P1 secara atomik, tetapi justru menyelanya dengan eksekusi proses P2 yang juga mengakses variabel balance yang sama. Kondisi perebutan penjadwalan prosesor server dan pengaksesan variabel balance inilah yang disebut dengan race condition. Kondisi ini menghasilkan perhitungan akhir yang tidak valid.
SAMAGE ASSEM
void deposites
Add Rong whoun Stove Reg, balance
palance amour
P1
One possible proet of
беровец 10)
Balance powal100
Cru sched
deposit 20
add20egister, giving 120
Pistons 110 in balance
Satance (shton 128 Balance (vehananyaj130
P2 stores 120 in belance
Contat: Mace Con
Gambar 4.10 Kondisi Race Condition pada Kasus Transfer Uang
Perlu dicatat, kondisi akhir yang tidak valid ini hanya terjadi jika timing eksekusi fungsi transfer dari kedua proses terjadi hampir "bersamaan" sedemikian rupa sehingga prosesor menjadwalkan 3 instruksi biner dari masing-masing proses secara bergantian. Jadi kesalahan yang terjadi merupakan kesalahan run-time error dan tidak selalu dapat diulangi dan ditelusuri pada saat testing kode program. Jadi dalam kasus fungsi transfer di atas race condition terjadi karena proses mengakses dan mengubah sumber daya yang sama (nilai balance yang sama) tanpa saling berkoordinasi satu sama lain ataupun dengan sistem operasi, sehingga prosesor menjadwal ke dua proses bergantian secara bebas.
Apa yang diperlukan untuk mengatasi kondisi race condition seperti kasus fungsi transfer di atas? Solusinya adalah menerapkan bentuk sin- kronisasi pada bagian kode yang melakukan pengaksesan atau peng- ubahan ke sumber daya yang digunakan bersama, variabel balance. Bagian kode dari program yang butuh diproteksi dengan mekanisme sinkronisasi ini disebut dengan critical section.
Mengapa disebut sinkronisasi? Sinkronisasi berkaitan dengan pengaturan urutan eksekusi proses-proses yang terkait. Pada kasus transfer di atas, proses-proses yang melakukan fungsi transfer pada nilai balance yang sama, dijadwal oleh prosesor secara asinkron atau saling bebas satu sama lain. Artinya dari sudut pandang sistem operasi maupun pengguna, kedua proses berjalan secara asinkron seperti pada Gambar 4.11 (a).
Pada Gambar 4.11, terdapat dua aktivitas yang berjalan secara, asinkron yaitu X dan Y. Yang merupakan critical section pada masing-masing aktivitas adalah aktivitas 2 dari proses Y dan aktivitas 3 dari proses X. Karena kedua aktivitas ini memanipulasi sumber daya B yang sama maka race condition terjadi.
Untuk mengatasi hal ini maka urutan eksekusi aktivitas 2 dari Y dan aktivitas 3 dari X harus dibuat menjadi sinkron, yaitu salah satu aktivitas harus selesai dahulu baru aktivitas lainnya dapat dimulai. Sebagainya contoh, pada Gambar 4.11 (b), mekanisme sinkronisasi mengatur sedemikian rupa aktivitas 2 dari Y berjalan sampai selesai, baru aktivitas 3 dari X dapat dimulai. Mekanisme sinkronisasi seperti ini yang memastikan hanya satu proses yang yang berhak memanipulasi suatu sumber daya pada suatu waktu disebut juga dengan mutual exclusive atau disingkat mutex.
(a) Operasi asinkron
(b) Operasi sinkron
Gambar 4.11 Mekanisme Sinkronisasi
Jadi, sinkronisasi merupakan mekanisme untuk memastikan operasi berjalan secara sinkron pada proses-proses konkuren yang saling meme- ngaruhi sehingga terjamin kelangsungan operasinya serta keabsahan status sumber daya yang dimanipulasi bersama. Contoh kasus fungsi transfer hanyalah merupakan salah satu kasus konkurensi yang mem- butuhkan mekanisme sinkronisasi. Solusi mutex yang dibahas di atas juga merupakan salah satu dari beragam bentuk sinkronisasi yang tersedia. Pada subbab masalah-masalah klasik pada sinkronisasi akan dibahas lebih banyak lagi kasus-kasus konkurensi beserta bentuk sinkronisasi yang cocok untuk mengatasinya.
4.4.2 IMPLEMENTASI SINKRONISASI
Setelah mengerti mengapa diperlukan sinkronisasi maka hal yang se- lanjutnya perlu dipertanyakan adalah bagaimana sinkronisasi itu diimple- mentasikan? Implementasi sinkronisasi terkait dengan bagian kode proses yang disebut critical section. Mekanisme sinkronisasi bertugas mengoor- dinasi eksekusi critical section dari proses-proses yang terlibat. Pada dasarnya critical section berisi kode yang mengakses sumber daya, yang juga diakses ataupun disediakan oleh proses lain pada saat yang sama.
Secara umum, mekanisme sinkronisasi memastikan operasi terhadap sumber daya tersebut terjadi secara mutual exclusive, yaitu setiap saat hanya diijinkan satu proses yang dapat mengakses dan memanipulasi sumber daya tersebut. Namun jika suatu sumber daya mengizinkan untuk diakses secara konkuren oleh N proses maka sinkronisasi bertugas memastikan pada suatu waktu, maksimal hanya sejumlah N proses yang dapat mengakses sumber daya tersebut.
Implementasi sinkrosisasi proses umumnya harus memenuhi beberapa persyaratan di bawah ini.
1. Mutual Exclusion
Ketika suatu proses memasuki eksekusi kode critical section-nya maka tidak boleh ada proses lain yang juga memasuki critical section yang terkait. Sifat ini terutama benar untuk sumber daya yang pengaksesannya bersifat mutual exclusive. Sifat ini dapat didefinisikan ulang untuk sumber daya yang dapat diakses konkuren oleh sejumlah N proses.
2. Progress
Yaitu ketika ada proses yang hendak memasuki critical sectionmya dan pada saat itu tidak ada proses lain yang sedang melakukan critical section, permintaan untuk masuk ke critical section-nya haruslah dipenuhi
3. Bounded Waiting
Haruslah ada batasan tentang berapa kali proses lain boleh menyalib suatu proses yang telah lebih dahulu meminta ijin untuk memasuki critical section-nya.
Pada umumnya implementasi sinkronisasi harus dilakukan pada tiga bagian lapisan sistem komputer, yaitu aplikasi pengguna, perangkat keras, dan sistem operasi.
Sinkronisasi Aplikasi Pengguna
Pada program aplikasi yang menerapkan sinkronisasi, ada kode tambahan yang harus ditambahkan sebagai implementasi dari mekanisme sinkroni- sasi. Kode tambahan ini disebut entry section dan exit section dan harus diletakkan mengapit bagian kode yang diidentifikasi sebagai critical section seperti ditunjukkan pada gambar 4.12.
Do
{
Contoh Sinkronisasi pada 2 proses Proses P1
Entry Section
Critiont Section
Exit Section
Remainder Section
Entry While giliran a 0 do no operasi
Exit gran 1
Proses P2
Entry: While gasm #1 do no operas
Exit giliran0
Gambar 4.12. Sinkronasi pada Aplikasi (Software)
Entry section berfungsi untuk memastikan mutual exclusive. Bagian ini menguji apakah proses dapat melanjutkan ke critical sectiomya. Misalnya pada kasus Gambar 4.12, terdapat dua proses P1 dan P2 yang hendak melakukan critical section-nya masing-masing. Pengaturan eksekusi critical section menggunakan variable kontrol giliran, yaitu nilai giliran-0 berarti Pl diijinkan untuk eksekusi critical section-nya, dan nilai giliran=1 berarti P2 yang diijinkan untuk eksekusi critical sectionya.
Entry section pada proses P1 akan menguji nilai giliran terus menerus dan selama nilai giliran tidak sama dengan O maka pengujian akan diulang terus. Hal yang mirip terjadi pada proses P2, tetapi proses P2 akan melakukan pengujian nilai giliran terus menerus selama nilai giliran tidak sama dengan 1. Pengujian yang terus menerus atau looping ini disebut dengan busy waiting dan tetap menggunakan siklus eksekusi prosesor.
Misalnya nilai giliran-0, maka P1 yang akan diijinkan terlebih dahulu mengeksekusi critical section-nya. Jika P1 sudah selesai mengeksekusi critical section-nya maka kode eksekusi P1 akan mengalir ke bagian exit section.
Fungsi bagian exit section adalah untuk memastikan sifat progress dari mekanisme sinkronisasi, yaitu jika P1 sudah selesai mengeksekusi critical section-nya maka P1 tidak boleh menghalangi proses lainnya untuk melanjutkan ke critical section-nya. Oleh sebab itu, bagian exit section Pl mengubah nilai giliran=1, artinya P1 mempersilakan P2 untuk melanjutkan critical section-nya jika P2 sedang menunggu di bagian entry section-nya sendiri.
Sinkronisasi Perangkat Keras
Kode program pada bagian entry section dan exit section pada contoh sebelumnya memiliki masalah serius, yaitu hanya dapat menangani 2 proses. Untuk proses yang lebih banyak, berarti butuh ditentukan nilai- nilai giliran untuk tiap-tiap proses. Hal seperti ini akan sangat kompleks jika proses yang butuh disinkronisasi berjumlah banyak. Hal demikian dapat disederhanakan dengan memakai variabel yang menyerupai fungsi kunci yang hanya bernilai benar (true) dan salah (false). Konstruksi entry section dan exit section menjadi seperti Gambar 4.13
{
while (TestAndSet(lock));
critical action
remainder section
Gambar 4.13 Sinkronisasi Hardware
Entry section proses bertugas menguji nilai kunci (lock). Jika lock tertutup atau lock-true maka proses tersebut harus melakukan busy waiting. Jika lock terbuka atau lock=false maka proses dapat melanjutkan eksekusi ke bagian critical section sekaligus mengubah nilai lock-true. Di bagian exit section, proses mengubah nilai lock-false sehingga proses lain yang menunggu terbukanya lock tersebut dapat melanjutkan eksekusi ke bagian critical section mereka juga.
Namun skenario ini membawa masalah baru pada bagian entry section. Fungsi pengujian nilai kunci (test) dan mengubah nilai kunci menjadi tertutup (set) haruslah dilakukan secara atomik dan tidak boleh disela oleh entry section proses lain. Dengan kata lain, entry section-nya juga butuh disinkronisasi! Untuk mengatasi hal ini secara tuntas, tidak ada cara lain selain mengimplementasi instruksi test dan set menjadi suatu instruksi tunggal, atomik, pada tingkat perangkat keras. Pada kebanyakan arsitektur prosesor terdapat fungsi yang demikian. Sebagai contoh adalah instruksi Test and Set (ts) pada IBM 370 dan instruksi Exchange (xchg) pada Intel 80x86. Intruksi tersebut di atas bersifat atomik, yaitu tidak dapat disela atau diinterupsi oleh instruksi lain.
Sinkronisasi Sistem Operasi
Dengan skenario sebelumnya, masih menyisakan satu persoalan yaitu tetap terjadinya busy waiting pada bagian entry section karena ada kontruksi looping. Permasalahannya adalah proses yang busy waiting tetap mengonsumsi siklus prosesor untuk pengujian lock. Aktivitas yang tidak menghasilkan output nyata ini tentunya mengurangi keluaran (throughput) bagi proses-proses lainnya. Selain itu, jika proses yang busy waiting memiliki prioritas lebih tinggi dibanding proses lain maka kondisi ini akan menghalangi eksekusi proses-proses lainnya. Kondisi ini merupakan suatu deadlock dan dikenal dengan priority inversion problem.
Untuk mengoptimalkan pemakaian prosesor maka sinkronisasi mem- butuhkan campur tangan rutin sistem operasi untuk meniadakan terjadinya busy waiting pada bagian entry section dari suatu proses. Hal ini dapat dilakukan dengan menyediakan fungsi atau rutin sistem operasi yang dapat dipanggil pada bagian entry section dan exit section. Model sinkronisasi menggunakan rutin sistem operasi dapat ditunjukkan pada Gambar 4.14.
{
wait (lock):
Gambar 4.14 Sinkronisasi dengan Primitif Sistem Operasi
Baik fungsi wait(lock) maupun signal(lock) merupakan rutin yang disediakan oleh sistem operasi. Mengapa harus rutin sistem operasi? Ini dikarenakan kita membutuhkan kemampuan untuk mengatur siklus atau status dari proses yang terlibat. Yaitu mengubah suatu proses berstatus running menjadi blocked ataupun sebaliknya.
Fungsi wait diletakkan pada bagian entry section, sedangkan fungsi signal diletakkan pada bagian exit section. Fungsi wait berfungsi untuk menguji status lock. Jika lock terbuka maka proses akan melanjutkan eksekusinya ke critical section sekaliguskan mengunci lock. Namun jika lock terkunci maka fungsi wait akan membuat status proses bersangkutan menjadi blocked dan dimasukkan dalam antrian lock bersangkutan. Setelah suatu proses menyelesaikan bagian critical section maka proses akan melanjut- kan eksekusi ke bagian exit section dengan memanggil fungsi signal Fungsi signal akan membebaskan lock, dan sekaligus membangunkan, operasi wake-up, semua proses yang menunggu di antrian lock tersebut.
Fungsi sistem operasi dalam rutin wait dan signal ibarat tugas seorang resepsionis pada praktik seorang dokter. Jika dokter sedang memeriksa seorang pasien maka semua pengunjung yang datang harus melapor ke resepsionis lebih dahulu. Daripada mereka harus mengecek terus ke resespsionis maka resepsionis akan mempersilakan mereka menunggu di ruang tunggu. Seandainya pasien yang diperiksa dokter sudah selesai, maka resepsionis yang akan memanggil pasien berikutnya. Dengan demikian pengunjung tidak perlu terus menerus mengecek ke resepsionis. Resepsionis cukup memberitahu ke pasien-pasien lainnya yang sedang menunggu setiap kali pemeriksaan seorang pasien telah selesai.
Tidak ada komentar:
Posting Komentar