Saturday, 7 November 2015

CONNECTING 2 PROGRAM USING SHARED MEMORY

Shared memory adalah memori yang dapat diakses secara bersamaan oleh beberapa program dengan maksud untuk menyediakan komunikasi di antara mereka atau menghindari salinan yang berlebihan. Tergantung pada konteks, program dapat berjalan pada satu prosesor atau beberapa prosesor yang terpisah. Merupakan salah satu cara komunikasi antar proses dengan cara mengalokasikan suatu alamat memori untuk dipakai berkomunikasi antar proses. Alamat dan besar alokasi memori yang digunakan biasanya ditentukan oleh pembuat program. Pada metode ini, sistem akan mengatur proses mana yang akan memakai memori pada waktu tertentu sehingga pekerjaan dapat dilakukan secara efektif.

Penjelasan fungsi :

1. shmget();
          System call untuk membuat suatu segmen shared memory

#include
#include 
int shmget(key_t key, size_t size, int shmflg); 

          shmflg bisa diisi dengan : IPC_CREATE, IPC_EXCL, permission

2. shmat();
           System call untuk mendaftarkan segment shared memory ke dalam data space dari suatu proses

#include
#include 
void *shmat(int shmid, const void *shmaddr, int shmflg); 

Parameter :
shmid ID dari shared memory
shmaddr Lokasi shared memory di main memory
jika NULL akan dicarikan lokasi pada memory yang ingin ditempati 

Return :
Pointer ke lokasi shared memory

3. shmdt();
            System call untuk melepaskan shared memory segment dari data space dari proses.

#include
#include 
int shmdt(const void *shmaddr); 

Parameter :
shmaddr pointer ke lokasi shared memory 

Return :
0 sukses
(void *) -1 error

4. shmctl();
           System call untuk mengetahui atau merubah informasi yang berkaitan dgn suatu shared memory

#include
#include 
int shmctl(int shmid, int cmd, struct shmid_ds *buf);

Argument cmd bisa berisi : 

IPC_STAT : mengambil informasi ttg shared memory segment
IPC_SET : mengubah informasi ttg shared memory segment
IPC_RMID : menandai suatu segment untuk dibuang ketika semua process yang menggunakannya sudah melepasnya
SHM_LOCK : Lock suatu segment, membuatnya tidak bisa di-swap
SHM_UNLOCK : Unlock suatu segment

Program Tambahan untuk IPC
     Ada 2 program tambahan yang berguna untuk melihat apa yang terjadi pada IPC yang dibuat :
1  ipcs Menyediakan informasi yang berkaitan dengan IPC yang sedang digunakan (message queue, shared memory, semaphore)
2  ipcrm Menghapus IPC tertentu (message queue, shared memory, semaphore)


Contoh codingan meghubungkan 2 buah program :


-----------------------------------------------------------------------------------------------------------------
Aya adalah seorang programmer handal sekaligus pemilik toko yang menjual 6 buah peralatan komputer yaitu RAM, Harddisk, Motherprocessor, VGA, PSU, Processor. Ia ingin membuat sebuah program untuk tokonya. Program yang ingin ia buat harus terhubung antara client dan server. Client dapat membeli dan melihat jumlah stok yang tersisa sedangkan server dapat menambah stok barang dan melihat sisa akhir barang. Awalnya Aya membuat program menggunakan teori PIPE dan ternyata kedua program tidak terhubung. Karna 3 asisten praktikumnya juga menyerah dengan program Aya maka Aya mendemokan program erorr yang pada akhirnya diminta revisi oleh asisten demo menggunakan SHARED MEMORY. Berbeda dengan PIPE yang Aya kerjakan berhari hari, SHARED MEMORY hanya dikerjakan dalam waktu beberapa jam. Berikut codingan yang ia kerjakan :


CLIENT PROGRAM :






SERVER PROGRAM :



Langkah - langkah :
1. Membuat segment di memory dengan shmget()
2. Mendaftarkan (attach) segment ke data space dari proses dengan shmat()
3. Tulis/baca dari memori
4. Detach segment dari data space dari proses dengan shmdt()

Sebenarnya sangat mudah menggunakan shared memory karena hanya menggunakan sedikit template yang sudah saya jelaskan diatas. Untuk run program ini pada terminal pun standard seperti biasanya tidak harus special seperti menggunakan thread. Titik pentingnya adalah bagaimana kamu memodifikasi template pada int main agar memenuhi output yang kamu inginkan.

Semoga bermanfaat terimakasih!