Sabtu, 07 November 2015

IPC dan thread

IPC  = cara atau mekanisme pertukaran data antara
satu proses dengan proses lainnya, baik itu proses yang berada di dalam komputer yang
sama, atau komputer jarak jauh yang terhubung melalui jaringan.ada 4 macam, yaitu pipes, message queue, shared memory dan socket.

thread atau proses ringan(lightweight) adalah bagian terkecil dari suatu proses. proses ini bisa dijadwalkan oleh suatu sistem operasi. thread ada dua macam , yaitu single threading dan multithreading. Single Threading
Adalah sebuah proses yang hanya memiliki satu thread yang berjalan.
Biasanya fungsi thread ini digunakan sebagai pengendali jalannya proses. sedangkan multi threading
Adalah proses yang memiliki lebih dari satu thread yang berjalan didalamnya,
sehingga dalam hal ini proses dapat menjalankan lebih dari satu tugas dalam satu
waktu.

conso

OINK Computer
Oink adalah seorang distributor komponen komputer untuk area Surabaya. Komponen yang tersedia di
Oink Komputer yaitu RAM, harddisk, motherboard, PSU, VGA, dan processor. Setiap harinya dia
melakukan banyak transaksi dengan beberapa pelanggannya. Setiap saat oink dapat menambahkan stok
 :barangnya dan setiap pelanggan dapat membeli barang di oink comp. Oink merasa kesulitan dalam
mencatat semua transaksinya dalam buku, jadi bantulah oink membuat sebuah aplikasi yang dapat
memudahkan pekerjaannya. Terdapat 2 aplikasi, untuk penjual dan pembeli.
Berikut adalah kebutuhan dari aplikasi untuk penjual:
1. Terdapat fitur menu untuk menampilkan daftar menu: lihat stok, tambah stok
2. Fitur tambah stok memiliki format inputan: nama_barang jumlah_barang. Jika barang yang sudah
ada di stok diinputkan kembali, maka stoknya bertambah.
3. FItur lihat stok menampilkan stok semua barang yang tersisa dengan format output: nama_barang
jumlah_barang
Berikut adalah kebutuhan dari aplikasi untuk pembeli:
1. Terdapat fitur menu untuk menampilkan daftar menu: lihat stok, beli barang
2. Fitur beli barang memiliki format inputan: nama_barang jumlah_barang. Jika fitur ini dijalankan
maka stok barang akan berkurang sesuai jumlah yang dibeli. Jika jumlah pembelian lebih dari stok
yang tersedia, maka program menampilkan pesan kesalahan.
3. FItur lihat stok menampilkan stok semua barang yang tersisa dengan format output: nama_barang
jumlah_barang

langkahnya :

kali ini kita akan membuat 2 program, yg satu akan digunakaan oleh penjual, dan yang lainnya akan digunakan oleh pembeli. kita akan menyelesaikan soal ini dengan menggunakan IPC yaitu shared memory. di dalam program, kita akan membuat struct stok yg ada, lalu menggunakan perintah2 yg cocok agar nantinya program bisa melakukan penambahan dan menampilkan stok barang yg kita miliki

//program ini akan dijalankan oleh penjual

struct STOK //kita akan membuat struct yang berisi stok barang
{
    int RAM;
    int harddisk;
    int motherboard;
    int PSU;
    int VGA;
    int processor;
};


int  main()
{//shared mem perlu identitas,salah satunya pake key
    key_t KEY; //buat bedain shared memory
    int ID;

    struct STOK *data;
    char nama_barang[50];
    int pilihan;   
    int tambah;
    KEY = 1111; // key bisa diisi apa saja, namun harus sama dgn program yg dibuat oleh pembeli
    ID = shmget(KEY, sizeof(struct STOK)/*jumlah bit pada memori untuk menyimpan array*/, IPC_CREAT /*koneksi antar proses? kasi permission buat read&write*/ | 0666); //biar memory bs di share, dipake di bbrp program

    data = (struct STOK *) shmat(ID, NULL, 0); //buat ambil address dr mem yg dishare
   
    //semuanya dimulai dari 0 ya
    data->RAM = 0;
    data->harddisk = 0;
    data->motherboard = 0;
    data->PSU = 0;
    data->VGA = 0;
    data->processor = 0;
   
    while(1)
    {   
        printf("\n\n1 = Lihat Stok Barang\n");
        printf("2 = Tambah Barang\n\n");       
           
        scanf("%d", &pilihan);

        if (pilihan == 1) //kalo diinput angka 1, stok barang akan muncul
        {
            system("clear"); //supaya layarnya bersih dulu
            printf("STOK RAM         = %d \n",data->RAM);
            printf("STOK harddisk    = %d \n",data->harddisk);
            printf("STOK motherboard = %d \n",data->motherboard);
            printf("STOK PSU         = %d \n",data->PSU);
            printf("STOK VGA         = %d \n",data->VGA);
            printf("STOK processor   = %d \n",data->processor);
        }       

        else if(pilihan == 2) //jika diinput 2, user bisa menambah barang yg diinginkan
        {
            system("clear"); //biar layarnya kosong dulu
            printf("Barang yang Dijual: \n");
            printf("RAM \nharddisk \nmotherboard \nPSU \nVGA \nprocessor\n");
            printf("\n\nKetikkan nama barang yang ingin ditambah\n");
            scanf("%s", nama_barang);
           
//untuk mengetahui barang yg ingin ditambah, kita menggunakan strcmp
            if (strcmp(nama_barang,"RAM")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&tambah);
                if( tambah > -1){ //supaya nambahnya kalo user masukin angka 0 atau lebih
                    data->RAM += tambah;
                    printf("STOK RAM = %d \n", data->RAM);
                }
                else{printf("tidak bisa");}
            }

            else if (strcmp(nama_barang,"harddisk")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&tambah);
                if( tambah > -1){
                data->harddisk += tambah;
                printf("STOK harddisk = %d \n", data->harddisk);
                }
                else{printf("tidak bisa");}
            }

            else if (strcmp(nama_barang,"motherboard")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&tambah);
                if( tambah > -1){
                data->motherboard += tambah;
                printf("STOK motherboard = %d \n", data->motherboard);
                }
                else{printf("tidak bisa");}}

            else if (strcmp(nama_barang,"PSU")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&tambah);
                if( tambah > -1){
                data->PSU += tambah;
                printf("STOK PSU = %d \n", data->PSU);}
                else{printf("tidak bisa");}
            }

            else if (strcmp(nama_barang,"VGA")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&tambah);if( tambah > -1){
                data->VGA += tambah;
                printf("STOK VGA = %d \n", data->VGA);}
                else{printf("tidak bisa");}
            }

            else if (strcmp(nama_barang,"processor")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&tambah);if( tambah > -1){
                data->processor += tambah;
                printf("STOK processor = %d \n", data->processor);}
                else{printf("tidak bisa");}
            }
            else printf("Barang Tidak Ada\n");
        }
        else getchar();
    }
   
}


//program ini akan dijalankan oleh pembeli

struct STOK
{
    int RAM;
    int harddisk;
    int motherboard;
    int PSU;
    int VGA;
    int processor;
};

int  main(void)
{
    key_t KEY;
    int ID;
    struct STOK *data;
    char nama_barang[15];
    int pilih;
    int beli;

    KEY = 1111;
    ID = shmget(KEY, sizeof(struct STOK), 0666);


    data = (struct STOK *) shmat(ID, NULL, 0);

    while(1)
    {   
        printf("\n\n1 = Lihat Stok Barang\n");
        printf("2 = Beli Barang\n\n");
        scanf("%d",&pilih);

        if(pilih == 1)
        {       
            system("clear");   
            printf("Jumlah RAM = %d \n",data->RAM);
            printf("Jumlah harddisk = %d \n",data->harddisk);
            printf("Jumlah motherboard = %d \n",data->motherboard);
            printf("Jumlah PSU = %d \n",data->PSU);
            printf("Jumlah VGA = %d \n",data->VGA);
            printf("Jumlah processor = %d \n",data->processor);
        }

        else if(pilih == 2)
        {
            system("clear");
            printf("Barang yang Dijual: \n");
            printf("RAM \nharddisk \nmotherboard \nPSU \nVGA \nprocessor\n");
            printf("\n\nKetikkan nama barang yang ingin ditambah\n");
            scanf("%s", nama_barang);

            if (strcmp(nama_barang,"RAM")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&beli);

                if (beli > data->RAM)
                {
                    printf("Jumlah yang dibeli melebihi stok\n");
                }

                else
                {
                    printf("Anda membeli %d RAM\n",beli);
                    data->RAM -= beli;
                }
            }

            else if (strcmp(nama_barang,"harddisk")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&beli);

                if (beli > data->harddisk)
                {
                    printf("Anda membeli terlalu banyak\n");
                }

                else
                {
                    printf("Anda membeli %d harddisk\n",beli);
                    data->harddisk -= beli;
                }
            }

            else if (strcmp(nama_barang,"motherboard")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&beli);

                if (beli > data->motherboard)
                {
                    printf("Anda membeli terlalu banyak\n");
                }

                else
                {
                    printf("Anda membeli %d motherboard\n",beli);
                    data->motherboard -= beli;
                }
            }

            else if (strcmp(nama_barang,"PSU")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&beli);

                if (beli > data->PSU)
                {
                    printf("Anda membeli terlalu banyak\n");
                }

                else
                {
                    printf("Anda membeli %d PSU\n",beli);
                    data->PSU -= beli;
                }
            }

            else if (strcmp(nama_barang,"VGA")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&beli);
                if (beli > data->VGA)
                {
                    printf("Anda membeli terlalu banyak\n");
                }

                else
                {
                    printf("Anda membeli %d VGA\n",beli);
                    data->VGA -= beli;
                }
            }

            else if (strcmp(nama_barang,"processor")==0)
            {
                printf("Masukkan jumlahnya : ");
                scanf("%d",&beli);

                if (beli > data->processor)
                {
                    printf("Anda membeli terlalu banyak\n");
                }

                else
                {
                    printf("Anda membeli %d processor\n",beli);
                    data->processor -= beli;
                }
            }
            else printf("Barang Tidak Ada\n");
        }
        else getchar();
    }
}