Sunday, November 8, 2015

Terminal X Terminal : 1 Client 1 Server 1 Memori

Sekarang banyak wadah online untuk berbagi informasi dokumen seperti google doc, spreadsheet dan sebagainya. Jika kita perhatikan jika satu pengguna mengubah data didalamnya maka akan berubah juga untuk pengguna lain. Bagaimana hal tersebut bisa terjadi? nah kali ini saya akan menjelaskan metode yang mirip dengan konsep yang telah kita bicarakan diatas, namun untuk linux dan bagaimana hal ini dilakukan antar terminal tanpa wadah berupa txt dan sebagainya.

Cara agar kita dapat melakukan hal tersebut adalah dengan menggunakan IPC, nah apa itu IPC? IPC adalah singkatan dari Interprocess Communication yang mana IPC ini adalah cara atau mekanisme pertukaran data antarasatu proses dengan proses lainnya, baik itu proses yang berada di dalam komputer yang sama, atau komputer jarak jauh yang terhubung melalui jaringan. Pada umumnya jenis IPC ada 4 yaitu:

PIPE

Pipe merupakan komunikasi sequensial antar proses yang saling terelasi, namun
pipe memiliki kelemahan yaitu hanya bisa digunakan untuk komunikasi antar prosesyang saling berhubungan, dan komunikasinya yang dilakukan adalah secarasequensial.

Message Queue

Sistem berkirim pesan adalah proses komunikasi antar bagian sistem untuk membagi variabel yang dibutuhkan. Proses ini menyediakan dua operasi yaitu mengirim pesan dan menerima pesan.

Shared Memory

Sistem Berbagi Memori 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 akanmemakai memori pada waktu tertentu sehingga pekerjaan dapat dilakukan secara efektif.

Socket

Bentuk dari komunikasi yaitu UDP dan TCP menggunakan abstraksi socket yang menyediakan endpoint untuk komunikasi antar proses. Socket bisa dijalankan di berbagai platform(BSD UNIIX, UNIX, Linux, Windows, & Machintos OS).

Nah bagaimana benda-benda diatas tersebut berjalan?  di sini saya akan menjelaskan tentang salah satu dari 4 yang telah di sebutkan diatas yaitu sharesd memory. Sebgai contoh persoalannya "Bagaimana penjual barang dan pembeli barang dapat menggunakan wadah yang sama untuk bertukar informasi". Untuk awalnya kita dapat membuat file .c yang akan kita gunakan. Kita akan menggunakan 2 file yang berbeda namun hampir sama. Untuk penjual kita anggap saja server dan untuk pembeli kita anggap client.

*saya menggunakan linux mint dan tidak ada chdir jadi directory tidak berpindah, tetap di /home/user/

Untuk file server.c kita isi dengan:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>



int Cek_Request()
{

    fprintf(stdout, "Masukkan barang lagi? (Y/N) ");
    char masuk;
    masuk=getchar();
        if(masuk=='n' || masuk=='N') return 0;
        else if(masuk=='y' || masuk=='Y') return 1;
        else
        {
            fprintf(stdout, "Kode yang dimasukkan salah\n\n");
            Cek_Request();
        }
}

int main()
{
    int *RAM,*harddisk,*motherboard,*PSU,*VGA,*Processor;
    int shmid,jumlah,menu;
    char pilihan[100],text[100];
    //prepare();
    key_t key;

    key = 1;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    RAM = shmat(shmid, NULL, 0);
    key = 2;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    harddisk = shmat(shmid, NULL, 0);
    key = 3;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    motherboard = shmat(shmid, NULL, 0);
    key = 4;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    PSU = shmat(shmid, NULL, 0);
    key = 5;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    VGA = shmat(shmid, NULL, 0);
    key = 6;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    Processor = shmat(shmid, NULL, 0);

    //inisialisasi
    *RAM=0,*harddisk=0,*motherboard=0,*PSU=0,*VGA=0,*Processor=0;

    while(1)
    {

      fprintf(stdout, "MENU\n---------------\n1. lihat_stok\n2. tambah_stok\n3. keluar\nKode : ");
      scanf("%s", text);

        if(strcmp(text,"1")==0)
            fprintf(stdout, "STOK BARANG\nRAM\t\t= %d\nharddisk\t= %d\nmotherboard\t= %d\nPSU\t\t= %d\nVGA\t\t= %d\nProcessor\t= %d\n\n", *RAM, *harddisk, *motherboard, *PSU, *VGA, *Processor);
        else if(strcmp(text,"2")==0)
        {
            while(1)
            {
                fprintf(stdout, "RAM\nharddisk\nmotherboard\nPSU\nVGA\nprocessor\n-------------\nKode barang\t: ");
                scanf("%s", pilihan);
                if(strcmp("RAM",pilihan)!=0 && strcmp("harddisk",pilihan)!=0 && strcmp("motherboard",pilihan)!=0 && strcmp("PSU",pilihan)!=0 && strcmp("VGA",pilihan)!=0 && strcmp("processor",pilihan)!=0)
                {
                    fprintf(stdout, "Kode yang dimasukkan salah\n\n");
                    continue;
                }

                //fprintf(stdout, "Banyak\t\t: ");
                scanf("%d", &jumlah);

                if(strcmp("RAM",pilihan)==0)
                {
                    (*RAM)=(*RAM)+jumlah;
                }
                else if(strcmp("harddisk",pilihan)==0) (*harddisk)+=jumlah;
                else if(strcmp("motherboard",pilihan)==0) (*motherboard)+=jumlah;
                else if(strcmp("PSU",pilihan)==0) (*PSU)+=jumlah;
                else if(strcmp("VGA",pilihan)==0) (*VGA)+=jumlah;
                else if(strcmp("processor",pilihan)==0) (*Processor)+=jumlah;


                getchar();
                if(!Cek_Request())
                {
                    fprintf(stdout, "\n");
                    break;
                }
            }
        }
        else if(strcmp(text,"3")==0) return 0;
        else
        {
            fprintf(stdout, "Kode yang dimasukkan salah\n\n");
            continue;
        }
    }
    return 0;
}

Dan untuk client.c kita isi dengan:

#include <sys/types.h>
#include <sys/ipc.h>
#include <sys/shm.h>
#include <stdio.h>
#include <unistd.h>
#include <string.h>

int taken()
{
    fprintf(stdout, "Ambil barang lagi? (Y/N) ");
    char ambil;
    ambil=getchar();
        if(ambil=='n' || ambil=='N') return 0;
        else if(ambil=='y' || ambil=='Y') return 1;
        else
        {
            fprintf(stdout, "Kode yang dimasukkan salah\n\n");
            taken();
        }
}

int main()
{
    int *RAM,*harddisk,*motherboard,*PSU,*VGA,*processor,shmid,jumlah,menu;
    char pilihan[100];
    key_t key;

    key = 1;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    RAM = shmat(shmid, NULL, 0);
    key = 2;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    harddisk = shmat(shmid, NULL, 0);
    key = 3;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    motherboard = shmat(shmid, NULL, 0);
    key = 4;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    PSU = shmat(shmid, NULL, 0);
    key = 5;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    VGA = shmat(shmid, NULL, 0);
    key = 6;
    shmid = shmget(key, sizeof(int), IPC_CREAT | 0666);
    processor = shmat(shmid, NULL, 0);

    while(1)
    {
        fprintf(stdout, "1. lihat stok\n2. beli barang\n3. Exit\nKode : ");
        scanf("%d", &menu);
        if(menu==1)
            fprintf(stdout, "STOK BARANG\nRAM\t\t= %d\nharddisk\t= %d\nmotherboard\t= %d\nPSU\t\t= %d\nVGA\t\t= %d\nProcessor\t= %d\n\n", *RAM, *harddisk, *motherboard, *PSU, *VGA, *processor);
        else if(menu==2)
        {
            while(1)
            {
                fprintf(stdout, "RAM\nharddisk\nmotherboard\nPSU\nVGA\nprocessor\n-------------\nKode barang\t: ");
                scanf("%s", pilihan);
                if(strcmp("RAM",pilihan)!=0 && strcmp("harddisk",pilihan)!=0 && strcmp("motherboard",pilihan)!=0 && strcmp("PSU",pilihan)!=0 && strcmp("VGA",pilihan)!=0 && strcmp("processor",pilihan)!=0)
                {
                    fprintf(stdout, "Kode yang dimasukkan salah\n\n");
                    continue;
                }

                fprintf(stdout, "Banyak\t\t: ");
                scanf("%d", &jumlah);

                if(strcmp("RAM",pilihan)==0)
                {
                    (*RAM)-=jumlah;
                    if(*RAM<0)
                    {
                        fprintf(stdout, "Pembelian gagal, Stok barang tidak cukup\n\n");
                        (*RAM)+=jumlah;
                    }
                }
                else if(strcmp("harddisk",pilihan)==0)
                {
                    (*harddisk)-=jumlah;
                    if(*harddisk<0)
                    {
                        fprintf(stdout, "Pembelian gagal, Stok barang tidak cukup\n\n");
                        (*harddisk)+=jumlah;
                    }
                }
                else if(strcmp("motherboard",pilihan)==0)
                {
                    (*motherboard)-=jumlah;
                    if(*motherboard<0)
                    {
                        fprintf(stdout, "Pembelian gagal, Stok barang tidak cukup\n\n");
                        (*motherboard)+=jumlah;
                    }
                }
                else if(strcmp("PSU",pilihan)==0)
                {
                    (*PSU)-=jumlah;
                    if(*PSU<0)
                    {
                        fprintf(stdout, "Pembelian gagal, Stok barang tidak cukup\n\n");
                        (*PSU)+=jumlah;
                    }
                }
                else if(strcmp("VGA",pilihan)==0)
                {
                    (*VGA)-=jumlah;
                    if(*VGA<0)
                    {
                        fprintf(stdout, "Pembelian gagal, Stok barang tidak cukup\n\n");
                        (*VGA)+=jumlah;
                    }
                }
                else if(strcmp("processor",pilihan)==0)
                {
                    (*processor)-=jumlah;
                    if(*processor<0)
                    {
                        fprintf(stdout, "Pembelian gagal, Stok barang tidak cukup\n\n");
                        (*processor)+=jumlah;
                    }
                }
                getchar();
                if(!taken())
                {
                    fprintf(stdout, "\n");
                    break;
                }
            }
        }
        else if(menu==3) return 0;
        else
        {
            fprintf(stdout, "Kode yang dimasukkan salah\n\n");
            continue;
        }
        sleep(1);
    }
    return 0;
}

*untuk key1,2,3,4,5,6 dapat dijadikan menjadi satu buah saja dengan menggunakan struct

Untuk menjalankan file .c nya sama dengan sebelumnya yaitu dengan membuka terminal. Untuk kasus kali ini yang dibuka 2 terminal dan ketik :

gcc -o nama_file nama_file_c      
dan jalankan dengan ./nama_file

Jika ./client dan ./server dijalankan maka jika di salah satu diupdate informasinya maka yang lain juga akan terupdate.

Untuk penejelasan dari shared memory nya:

shmget()  
System call untuk membuat suatu segmen shared memory 

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

shmdt()
System call untuk melepaskan shared memory segment dari data space dari proses. 
 
Nah, sekian penjelasan tentang ipc khususnya shared memory, semoga bermanfaat............
 
 





 





No comments:

Post a Comment