Punya Berli

Tuesday, May 12, 2015

Producer/Consumer Message Passing Solution



Message passing adalah suatu cara untuk mengkomunikasikan operasi dari 1 proses ke proses lainnya dengan operasi send dan receive. Receiver bisa menspesifikasikan apapun, memilih untuk mem-blok ataupun tidak. Metode message passing ini bisa diterapkan dalam single-processing system, multi-processing system, dan distributed system. Metode ini tidak memerlukan shared address spaces.

Operasi send() dapat bersifat synchronous ataupun asynchronous. Synchronous send akan me-return setelah data dikirm dan memblok jika buffernya penuh, sedangkan asynchronous send akan me-return segera setelah I/O dimulai dan akan memblok jika buffer dianggap penuh.

Operasi receive() juga dapat bersifat synchronous ataupun asynchronous. Synchronous receive akan me-return jika ada pesan dan akan memblok jika tidak ada pesan, sedangkan asynchronous receive akan mereturn pesan pertama jika ada 1 pesan dan meretun indikasi jika tidak ada pesan.

Message passing juga bisa dilakukan secara indirect dengan menggunakan mailbox. Jadi, sebuah pesan akan dikirim ke suatu area tertentu yang diberi nama (mailbox). Proses-proses akan membaca pesan dari mailbox, jadi mailbox ini harus dibuat dan dikelola. Sender akan memblok jika mailboxnya sudah penuh. Keuntungan dari penggunaan mailbox adalah metode ini memungkinkan komunikasi many-to-many.

Dalam message passing, jika sebuah pesan dikirim balik ke sender berarti pesan aslinya sudah diterima dengan tepat. Pesan ini juga bisa dikirm secara piggy-back ke pesan lain baik secara implisit maupun eksplisit. Message passing juga bisa synchronous ataupun asynchronous dan positif ataupun negative.

Klik di sini unuk versi DOC.

Berikut adalah penggunaan message passing.
#define MAX 100
void producer(void) {
            int item;
            message mesg;
            while (TRUE){
                        item = produce_item( );
                        receive(consumer, &mesg);
                        create_message(&mesg, item);
                        send(consumer, &mesg);
            }
}

void consumer(void) {
            int item, i;
            message mesg;
            for (i = 0; i < MAX; i++)
            send(producer, &mesg);
            while (TRUE) {
                        receive(producer, &mesg);
                        item = extract_item(&mesg);
                        send(producer, &mesg);
                        consume_item(item);
            }
}

Referensi
http://fendychandra.blog.binusian.org/2014/10/19/pertemuan-4-operating-system/

http://is.its.ac.id
http://sesindo.org
http://isico.info

0 comments:

Post a Comment