Interaksi Proses
3.3. Interaksi Proses
Proses yang dijalankan pada suatu sistem operasi dapat bekerja secara bersama-sama ataupun sendiri saja. Bagian sebelum ini telah menjelaskan mengenai konsep proses dan bagaimana penjadualan proses itu. Disini kita akan melihat bagaimana hubungan antara proses-proses itu.
3.3.1. Proses yang Kooperatif
Proses yang bersifat concurrent bekerja sama dengan proses lain. Proses itu kooperatif jika mereka dapat saling mempengaruhi. Kerja sama antar proses itu penting karena beberapa alasan:
• Pembagian informasi: Beberapa proses dapat mengakses beberapa data yang sama. • Kecepatan komputasi: Tugas yang dijalankan dapat berjalan dengan lebih cepat jika tugas tersebut
dipecah-pecah menjadi beberapa sub bagian dan dieksekusi secara paralel dengan sub bagian yang lain. Peningkatan kecepatan ini dapat dilakukan jika komputer tersebut mempunyai beberapa elemen pemrosesan, seperti CPU atau jalur I/O.
• Modularitas: Akan lebih mudah untuk mengatur tugas yang kompleks jika tugas tersebut dipecah menjadi
beberapa sub bagian, kemudian mempunyai proses atau thread yang berbeda untuk menjalankan setiap sub bagian.
• Kenyamanan: User dapat dengan mudah mengerjakan sesuatu yang berbeda dalam waktu yang sama. Contohnya satu user dapat mengetik, mengedit, dan mencetak suatu halaman tertentu secara bersamaan.
Kerja sama antar proses membutuhkan suatu mekanisme yang memperbolehkan proses-proses untuk mengkomunikasikan data dengan yang lain dan meng-synchronize kerja mereka sehingga tidak ada yang saling menghalangi. Salah satu cara proses dapat saling berkomunikasi adalah Interprocess Communication (IPC) yang akan dijelaskan lebih lanjut di bagian berikut.
3.3.2. Masalah Produser/Konsumer
Produser membuat suatu informasi yang dapat dibagi dengan proses lainnya. Konsumer menghabiskan data yang dibuat oleh produser. Misalnya program cetak memproduksi karakter yang dipakai oleh printer.
Masalah yang biasanya dihadapi oleh produser dan konsumer adalah bagaimana caranya mensinkronisasikan kerja mereka sehingga tidak ada yang saling mengganggu. Salah satu contoh bagaimana masalah ini dapat terjadi adalah Bounded Buffer Problem.
Solusi pembagian memori untuk Bounded Buffer Problem diterangkan dengan program sebagai berikut:
Gambar 3-8. Bounded Buffer Problem
import java.util.*; public class BoundedBuffer {
public BoundedBuffer() { // buffer diinisialisasikan kosong count
= 0; in
= 0; out
= 0; buffer = new Object[BUFFER_SIZE];
} // produser memanggil method ini
public void enter (Object item) { while ( count == BUFFER_SIZE ) ; // tidak melakukan apa-apa
// menambahkan suatu item ke dalam buffer ++count; buffer[in] = item; in = ( in + 1 ) % BUFFER_SIZE;
if ( count == BUFFER_SIZE ) System.out.println( "Producer Entered " + item + " Buffer FULL" );
else System.out.println( "Producer Entered " + item + " Buffer Size = " + count );
} // konsumer memanggil method ini
public Object remove() { Object item ;
while ( count == 0 ) ; // tidak melakukan apa-apa
// menyingkirkan suatu item dari buffer --count; item = buffer[out]; out
= ( out + 1 ) % BUFFER_SIZE; if ( count == 0 )
System.out.println( "Consumer consumed " + item + " Buffer EMPTY" ); else System.out.println( "Consumer consumed " + item + " Buffer Size = " +count );
return item; }
public static final int NAP_TIME = 5; private static final int BUFFER_SIZE = 5;
private volatile int count; private int in;
// arahkan ke posisi kosong selanjutnya
private int out; // arahkan ke posisi penuh selanjutnya private Object[] buffer; }
Buffer adalah tempat penyimpanan data dimana produser mengisinya dan konsumer mengosongkan buffer tersebut. Jika buffer kosong, konsumer harus menunggu, dan ketika buffer penuh, produser harus menunggu. Disinilah produser harus bekerja sama dengan konsumer. Konsumer harus menunggu sampai ada barang yang diproduksi.
Program di bawah ini menggambarkan proses yang dijalankan oleh produser untuk Bounded Buffer Problem.
Gambar 3-9. Produser Bounded Buffer Problem
//Producer.java import java.util.*;
public class Producer extends Thread { public Producer(BoundedBuffer b) { buffer = b; } public void run() {
Date message; while (true) {
int sleeptime = (int) (BoundedBuffer.NAP_TIME * Math.random() ); System.out.println("Producer sleeping for " + sleeptime + " seconds");
try { sleep(sleeptime*1000); } catch(InterruptedException e) {} // membuat suatu barang & memasukkannya ke buffer message = new Date(); System.out.println("Producer produced " + message); buffer.enter(message);
} } private BoundedBuffer buffer;
Program berikut menggambarkan proses yang dijalankan oleh konsumer pada Bounded Buffer Problem
Gambar 3-10. Konsumer Bounded Buffer Problem
// Consumer.java import java.util.*; public class Consumer extends Thread {
public Consumer(BoundedBuffer b) { buffer = b; } public void run() {
Date message; while (true) {
int sleeptime = (int) (BoundedBuffer.NAP_TIME * Math.random() ); System.out.println("Consumer sleeping for " + sleeptime + " seconds");
try { sleep(sleeptime*1000); } catch(InterruptedException e) {}
// mengambil barang dari buffer System.out.println("Consumer wants to consume."); message = (Date)buffer.remove(); // mengambil barang dari buffer System.out.println("Consumer wants to consume."); message = (Date)buffer.remove();
Masalah produser-konsumer dengan unbounded-buffer tidak menempatkan batas praktikal pada ukuran pada buffer . Konsumer harus menunggu untuk barang baru, tetapi produser dapat selalu memproduksi barang baru. Sedangkan masalah produser-konsumer bounded-buffer mengasumsikan ukuran buffer yang ditetapkan. Pada kasus ini, konsumer harus menunggu sampai buffer kosong dan produser harus menunggu sampai buffer penuh.