Selamat Datang Di Anak Jadul Ingin Pintar (AJIP)

Concurrency: Mutual Exclusion & Synchronization

Selasa, 16 Oktober 20120 komentar

Postingan berikut ini akan sedikit menjelaskan tentang apa itu definisi dari Proses, Thread, Mutual Exclution, Race Condition, Sinkronisasi, Deadlock, Starvation, Monitor, dan Semaphore. mudah-mudahan bermanfaat….


Proses

Secara tidak langsung, proses merupakan program yang sedang dieksekusi. Menurut Silberschatz, suatu proses adalah lebih dari sebuah kode program, yang terkadang disebut text section. Proses juga mencakup program counter, yaitu sebuah stack untuk menyimpan alamat dari instruksi yang akan dieksekusi selanjutnya dan register. Sebuah proses pada umumnya juga memiliki sebuah stack yang berisikan data-data yang dibutuhkan selama proses dieksekusi seperti parameter metoda, alamat return dan variabel lokal, dan sebuah data section yang menyimpan variabel global.

Sama halnya dengan Silberschatz, Tanenbaum juga berpendapat bahwa proses adalah sebuah program yang dieksekusi yang mencakup program counter, register, dan variabel di dalamnya.

Perbedaan antara program dengan proses adalah program merupakan entitas yang pasif, yaitu suatu file yang berisi kumpulan instruksi-instruksi yang disimpan di dalam disk (file executable), sedangkan proses merupakan entitas yang aktif, dengan sebuah program counter yang menyimpan alamat instruksi selanjut yang akan dieksekusi dan seperangkat sumber daya (resource) yang dibutuhkan agar sebuah proses dapat dieksekusi. Intinya bahwa program itu sendiri bukanlah sebuah proses; suatu program adalah satu entitas pasif; seperti isi dari sebuah berkas yang disimpan didalam disket. Sedangkan sebuah proses dalam suatu entitas aktif, dengan sebuah program counter yang menyimpan alamat instruksi selanjut yang akan dieksekusi dan seperangkat sumber daya (resource) yang dibutuhkan agar sebuah proses dapat dieksekusi.

Untuk mempermudah kita membedakan program dengan proses, kita akan menggunakan analogi yang diberikan oleh Tanenbaum. Misalnya ada seorang tukang kue yang ingin membuat kue ulang tahun untuk anaknya. Tukang kue tersebut memiliki resep kue ulang tahun dan bahan-bahan yang dibutuhkan untuk membuat kue ulang tahun di dapurnya seperti: tepung terigu, telur, gula, bubuk vanila dan bahan-bahan lainnya. Dalam analogi ini, resep kue ulang tahun adalah sebuah program, si tukang kue tersebut adala prosesor (CPU), dan bahan-bahan untuk membuat kue tersebut adalah data input. Sedangkan proses-nya adalah kegiatan sang tukang kue untuk membaca resep, mengolah bahan, dan memanggang kue tersebut.

Walau dua proses dapat dihubungkan dengan program yang sama, program tersebut dianggap dua urutan eksekusi yang berbeda. Sebagai contoh, beberapa pengguna dapat menjalankan salinan yang berbeda pada mail program, atau pengguna yang sama dapat meminta banyak salinan dari program editor. Tiap-tiap proses ini adalah proses yang berbeda dan walau bagian text-section adalah sama, data section-nya bervariasi. Adalah umum untuk memiliki proses yang menghasilkan banyak proses begitu ia bekerja.


Thread

Proses merupakan sebuah program yang mengeksekusi thread tunggal. Kendali thread tunggal ini hanya memungkinkan proses untuk menjalankan satu tugas pada satu waktu. Banyak sistem operasi modern telah memiliki konsep yang dikembangkan agar memungkinkan sebuah proses untuk mengeksekusi multi-threads. Misalnya user melakukan pekerjaan secara bersamaan yaitu mengetik dan menjalankan pemeriksaan ejaan didalam proses yang sama.


Gambar Diagram yang menggambarkan penukaran dari proses ke proses oleh CPU





Thread merupakan unit dasar dari penggunaan CPU, yang terdiri dari Thread ID, program counter, register set, dan stack. Sebuah thread berbagi code section, data section, dan sumber daya system operasi dengan Thread lain yang dimiliki oleh proses yang sama. Thread juga sering disebut lightweight process. Sebuah proses tradisional atau heavyweight process mempunyai thread tunggal yang berfungsi sebagai pengendali. Perbedaannya ialah proses dengan thread yang banyak mengerjakan lebih dari satu tugas pada satu satuan waktu.

Pada umumnya, perangkat lunak yang berjalan pada komputer modern dirancang secara multithreading. Sebuah aplikasi biasanya diimplementasi sebagai proses yang terpisah dengan beberapa thread yang berfungsi sebagai pengendali. Contohnya sebuah web browser mempunyai thread untuk menampilkan gambar atau tulisan sedangkan thread yang lain berfungsi sebagai penerima data dari network.

Terkadang ada sebuah aplikasi yang perlu menjalankan beberapa tugas yang serupa. Sebagai contohnya sebuah web server dapat mempunyai ratusan klien yang mengaksesnya secara concurrent. Kalau web server berjalan sebagai proses yang hanya mempunyai thread tunggal maka ia hanya dapat melayani satu klien pada pada satu satuan waktu. Bila ada klien lain yang ingin mengajukan permintaan maka ia harus menunggu sampai klien sebelumnya selesai dilayani. Solusinya adalah dengan membuat web server menjadi multi-threading. Dengan ini maka sebuah web server akan membuat thread yang akan mendengar permintaan klien, ketika permintaan lain diajukan maka web server akan menciptakan thread lain yang akan melayani permintaan tersebut.




Mutual Exclution

Mutual Exclusion adalah suatu cara yang menjamin jika ada sebuah proses yang menggunakan variabel atau berkas yang sama (digunakan juga oleh proses lain), maka proses lain akan dikeluarkan dari pekerjaan yang sama. Jadi, Mutual Exclusive terjadi ketika hanya ada satu proses yang boleh memakai sumber daya, dan proses lain yang ingin memakai sumber daya tersebut harus menunggu hingga sumber daya tadi dilepaskan atau tidak ada proses yang memakai sumber daya tersebut.

Pengertian lain Mutual exclusion adalah jaminan hanya satu proses yang mengakses sumber daya pada suatu interval waktu tertentu, sedangkan proses lain dilarang mengerjakan hal yang sama -> contoh : sumberdaya printer hanya bisa diakses 1 proses, tidak bisa bersamaan -> sumber daya ini disebut sumber daya kritis.

Bagian program yang sedang mengakses memori atau sumberdaya yang dipakai bersama disebut critical section / region. Kesuksesan proses-proses kongkuren memerlukan pendefinisian critical section dan memaksakan mutual exclusion diantara proses-proses kongkuren yang sedang berjalan. Pemaksaan mutual exclusion merupakan landasan pemrosesan kongkuren, namun pemaksaan mutual exclusion dapat menimbulkan 2 masalah yaitu :

Deadlock

Adalah banyak proses yang saling menunggu hasil dari proses yang lain untuk dapat melanjutkan atau menyelesaikan tugasnya.

Contoh :

2 proses : P1 dan P2

Dua sumber daya kritis, R1 dan R2

Proses P1 dan P2 harus mengakses kedua sumber daya

Skenario berikut dapat terjadi : R1 diberikan ke P1 sedang R2 diberikan ke P2

Karena untuk melanjutkan eksekusi memerlukan kedua sumberdaya sekaligus maka kedua proses akan saling menunggu sumber daya lain selamanya. Kedua proses dalam kondisi deadlock, tidak dapat membuat kemajuan apapun.

Startvation

Adalah suatu proses akan menunggu suatu kejadian atau hasil suatu proses lain supaya dapat menyelesaikan tugasnya, tetapi kejadian yang ditunggu tidak pernah terjadi karena selalu diambil lebih dulu oleh proses yang lain.

Contoh :

Tiga proses : P1, P2, P3

P1,P2,P3 memerlukan pengaksesan sumber daya R secara periodik

Skenario berikut dapat terjadi :

P1 diberi sumberdaya R, P2 dan P3 blocked menunggu sumber daya R

Ketika P1 keluar dari critical section, P2 dan P3 diijinkan mengakses R

Asumsi P3 diberi hak akses, kemudian setelah selesai hak akses kembali diberikan ke P1 yang saat itu kembali membutuhkan sumberdaya R.

Jika pemberian hak akses terus-menerus antara P1 dan P3, maka P2 tidak pernah memperoleh pengaksesan sumberdaya R, meski tidak ada deadlock. Pada situasi ini P2 mengalami startvation


Pada sistem dengan banyak proses (sistem kongkuren) terdapat 3 kategori interaksi diantara proses-proses, yaitu :



Race Condition

Race Condition adalah suatu kondisi dimana beberapa proses mengakses dan memanipulasi suatu data secara konkuren. Nilai akhir dari data tersebut tergantung dari proses mana yang terakhir selesai dieksekusi. Race condition merupakan masalah yang dapat terjadi pada beberapa proses yang memanipulasi suatu data secara konkruen, sehingga data tersebut tidak sinkron lagi. Nilai akhirnya akan tergantung pada proses mana yang terakhir dieksekusi. Pada saat proses-proses berbagi data, ada kemungkinan bahwa data yang dibagi secara bersama itu akan menjadi tidak konsisten, karena ada kemungkinan proses-proses tersebut melakukan akses secara bersamaan yang menyebabkan data tersebut berubah, hal ini disebut dengan Race Condition.

Kesimpulannya Race condition terjadi ketika:

Banyak proses atau thread membaca & menulis item data,

Hasil akhir dari aktifitas baca & tulis tersebut tergantung pada urutan eksekusi dari proses yang terlibat.


Untuk menghindari Race Condition inilah dilakukan apa yang dinamakan Proses Sinkronisasi.



Synchronization

Apakah sinkronisasi itu sebenarnya? Dan mengapa kita memerlukan sinkronisasi tersebut? Marilah kita pelajari lebih lanjut mengenai sinkronisasi. Seperti yang telah kita ketahui bahwa proses dapat bekerja sendiri (independent process) dan juga dapat bekerja bersama proses-proses yang lain (cooperating process).

Apa kegunaan sinkronisasi dalam hubungannya dengan sistem operasi? Sinkronisasi diperlukan untuk menghindari terjadinya ketidakkonsistenen data akibat adanya akses data secara konkuren. Disini sinkronisasi diperlukan agar data tersebut tetap konsisten.

Komunikasi antara proses membutuhkan place by calls untuk mengirim dan menerima data primitive. Terdapat design yang berbeda-beda dalam implementasi setiap primitive. Pengiriman pesan mungkin dapat diblok (blocking) atau tidak dapat dibloking (nonblocking) – juga dikenal dengan nama sinkron atau asinkron.


Pengiriman yang diblok: Proses pengiriman di blok sampai pesan diterima oleh proses penerima (receiving process) atau oleh mailbox.

Pengiriman yang tidak diblok: Proses pengiriman pesan dan mengkalkulasi operasi.

Penerimaan yang diblok: Penerima memblok samapai pesan tersedia.

Penerimaan yang tidak diblok: Penerima mengembalikan pesan valid atau null.


Kesimpulannya:

Komunikasi memerlukan sinkronisasi

Sender (pengirim) harus mengirim sebelum receiver (penerima) dapat menerima,

Apa yang terjadi terhadap proses setelah ia menjalankan primitif send atau receive?

Sender & receiver mungkin (bisa pula tidak) menjadi blocking (waiting for message).

Deadlock

Deadlock dalam arti sebenarnya adalah kebuntuan. Kebuntuan yang dimaksud dalam sistem operasi adalah kebuntuan proses. Jadi Deadlock ialah suatu kondisi dimana proses tidak berjalan lagi atau pun tidak ada komunikasi lagi antar proses. Deadlock disebabkan karena proses yang satu menunggu sumber daya yang sedang dipegang oleh proses lain yang sedang menunggu sumber daya yang dipegang oleh proses tersebut. Dengan kata lain setiap proses dalam set menunggu untuk sumber yang hanya dapat dikerjakan oleh proses lain dalam set yang sedang menunggu. Contoh sederhananya ialah pada gambar berikut ini.


Contoh 23.1. XXX

Proses P1 Proses P2

….. …..

….. …..

Receive (P2); Receive (P1);

….. …..

….. …..

Send (P2, M1); Send (P1, M2);

Proses tersebut dapat direpresentasikan dengan gambar sebagai berikut.


Dari gambar tersebut bisa dilihat bahwa kedua kereta tersebut tidak dapat berjalan. Karena kedua kereta tersebut saling menunggu kereta yang lain untuk lewat dulu agar keretanya dapat berjalan. Sehingga terjadilah Deadlock.




Contoh lain yang dapat merepresentasikan Deadlock ialah jembatan gantung sebagai berikut. Sehingga orang yang ada di sebelah kiri jembatan tidak dapat melaju sebab terjadi Deadlock di tengah jembatan (bagian yang dilingkari). Contoh lain ialah di persimpangan jalan berikut ini:




Dalam kasus ini setiap mobil bergerak sesuai nomor yang ditentukan, tetapi tanpa pengaturan yang benar, maka setiap mobil akan bertemu pada satu titik yang permanen (yang dilingkari) atau dapat dikatakan bahwa setiap mobil tidak dapat meanjutkan perjalanan lagi atau dengan kata lain terjadi Deadlock. Contoh lain pada proses yang secara umum terdiri dari tiga tahap, yaitu untuk meminta, memakai, dan melepaskan sumber daya yang di mintanya. Contoh kode-nya:


Contoh 23.2. Lalulintas

public class Proses {

public synchronized void getA() {

//proses untuk mendapat sumber daya a

}

public synchronized void getB(){

//proses untuk mendapat sumber daya b

}

public void releaseA(){

//proses untuk melepaskan sumber daya a

}

public void releaseB(){

//proses untuk melepaskan sumber daya b

}

}

public class Coba {

public static void main(String [] args) {

Proses P = new Proses();

Proses Q = new Proses();

P.getA();

Q.getB();

P.getB();

Q.getA();

}

}


Tanpa adanya perintah untuk mereleased artinya saat P mendapatkan A dan Q mendapatkan B, tetapi tidak dilepaskan, maka saat P minta B dan Q minta A, maka keduanya akan saling menunggu hingga salah satu melepaskan sumber dayanya, sedangkan kebutuhan P ada pada Q dan Q ada pada P, sehingga terjadi Deadlock. Secara umum kejadian ini dapat mudah terjadi dalam pemrograman multi-thread. Sebab ada kemungkinan lebih besar untuk menggunakan sumber daya bersama.

Starvation

indefinite blocking (starvation) yaitu suatu proses dengan prioritas yang rendah memiliki kemungkinan untuk tidak dieksekusi jika terdapat proses lain yang memiliki prioritas lebih tinggi darinya. Solusi dari permasalahan ini adalah aging, yaitu meningkatkan prioritas dari setiap proses yang menunggu dalam antrian secara bertahap.

Misalnya:





Monitor

Konsep monitor diperkenalkan pertama kali oleh Hoare (1974) dan Brinch Hansen (1975) untuk mengatasi beberapa masalah yang timbul ketika memakai semafor.

Monitor merupakan kumpulan dari prosedur, variabel, dan struktur data dalam satu modul. Monitor hanya dapat diakses dengan menjalankan fungsinya. Kita tidak dapat mengambil variabel dari monitor tanpa melalui prosedurnya. Hal ini dilakukan untuk melindungi variabel dari akses yang tidak sah dan juga mengurangi terjadinya error. Dengan mempergunakan monitor, sebuah proses dapat memanggil prosedur di dalam monitor, tetapi tidak dapat mengakses struktur data (termasuk variabel- variabel) internal dalam monitor. Dengan karakteristik demikian, monitor dapat mengatasi manipulasi yang tidak sah terhadap variabel yang diakses bersama-sama karena variabel lokal hanya dapat diakses oleh prosedur lokal.

Monitor tetap mempertahankan kondisi mutual eksklusifnya dengan membatasi hanya satu proses yang dapat aktif dalam monitor dalam suatu waktu. Yang mengatur kondisi tersebut adalah kompiler dan bukan programmer. Ternyata, mempertahakankan kondisi mutual eksklusif saja tidaklah cukup. Diperlukan juga suatu cara untuk memblok suatu proses jika ia tidak dapat terus berjalan. Misalnya dalam masalah bounded buffer, proses harus diblok ketika buffer telah penuh. Oleh karena itu, monitor harus diperlengkapi dengan mekanisme sinkronisasi yang lain. Salah satu mekanisme yang dipergunakan adalah variabel kondisi yang terdapat dalam monitor dan hanya dapat diakses oleh monitor.


shared variable declarations

void bodyP1 (….)

{

……

}

void bodyP2 (….)

{

……

}

…..

void bodyPn (….)

{

……

}

void main{

initialization code

}


Konstruksi monitor memastikan hanya satu proses yang aktif pada suatu waktu. Sehingga sebenarnya programmer tidak membutuhkan synchronization codes yang disisipkan secara eksplisit. Akan tetapi konstruksi monitor tidak benar-benar powerfull untuk modelisasi sebuah skema synchronization, sehingga perlu ditambahkan mekanisme sinkronisasi tambahan. Mekanisme ini disediakan oleh konstruksi conditional, seperti deklarasi variabel di bawah ini:

condition x,y; wait dan signal merupakan operasi-operasi yang dapat dipanggil dalam variabel kondisi.

Operasi x.wait menahan proses sampai proses lain memanggil x.signal. Operasi x.signal melanjutkan proses yang tertahan, jika tidak ada proses yang tertahan operasi ini tidak mempunyai pengaruh apa-apa. Misalkan x.signal dipanggil oleh proses P, lalu ada proses Q tertahan dan diasosiasikan dengan kondisi x. Jelasnya jika proses Q yang tertahan diijinkan untuk melanjutkan eksekusinya, pensinyalan proses P harus menunggu. Jika tidak kedua P dan Q akan aktif secara simultan melalui monitor. Ada dua kemungkinan yang terjadi yaitu:

1. P menunggu sampai Q meninggalkan monitor atau menunggu untuk kondisi lain

2. Q menunggu sampai Pmeninggalkan monitor atau menunggu untuk kondisi lain.



Monitor merupakan konsep bahasa pemrograman, sehingga kompilator bertanggung jawab dalam mengkondisikan monitor sebagai mutual eksklusif. Namun, tidak semua kompilator bias menerapkannya. Sehingga meski bahasa pemrograman yang sama mungkin tidak memiliki semaphore, akan tetapi menambahkan semaphore akan lebih mudah.


Semaphore

Masalah critical section bisa diselesaikan dengan penggunaan Instruksi Atomik. Akan tetapi, cara tersebut tidak mudah untuk diterapkan pada masalah yang lebih kompleks, misalnya ada lebih dari dua proses yang berjalan. Untuk mengatasi hal ini, kita dapat menggunakan alat sinkronisasi yang dinamakan semaphore. Semaphore S merupakan sebuah variabel integer yang diakses hanya melalui dua operasi standar atomik yaitu wait dan signal.



void wait(int s){

while (s<=0){no-op;}

s=s-1;

}

void signal(s){

s=s+1

}


Berikut ini merupakan implementasi semaphore untuk mengatasi masalah critical-section.


int mutex=1;

do{

wait(mutex);

critical section

signal(mutex);

remainder section

}while(TRUE);


Dalam subrutin ini, proses akan memeriksa harga dari semaphor, apabila harganya 0 atau kurang maka proses akan menunggu, sebaliknya jika lebih dari 0, maka proses akan mengurangi nilai dari semaphore tersebut dan menjalankan operasi yang lain. Arti dari harga semaphore dalam kasus ini adalah hanya boleh satu proses yang dapat melewati subrutin wait pada suatu waktu tertentu, sampai ada salah satu atau proses itu sendiri yang akan memanggil signal.
Share this article :

Posting Komentar

 
Copyright © 2011. BELAJAR PEMOGRAMAN - All Rights Reserved
Proudly powered by Fasilkom Universitas Esa Unggul