Jumat, 06 November 2015

IPC Aplikasi Penjualan dan Thread Music Player : Implementasi Thread dan IPC

THREAD & IPC 
Dalam suatu sistem operasi, thread adalah hal yang sangat penting, karena dengan adanya thread Program dapat menjalankan lebih dari satu tugas secara bersamaan. Misalnya saat kalian membaca tulisan ini dari web browser, sebenarnya terdapat thread untuk menerima data dari internet/server dan juga terdapat thread untuk menampilkan data seperti teks, gambar dll yang berjalan secara bersamaan. Bayangkan jika tidak ada thread, untuk menampilkan blog ini maka akan memakan waktu yang lebih lama. karena program harus melakukan proses secara bergantian.

Sedangkan IPC (Interprocess Communication) adalah suatu metode dimana suatu process bisa berkomunikasi dengan process lainnya. jadi hal ini juga sangat penting karena suatu proses bisa jadi membutuhkan data dari proses yang lain untuk menjalankan tugasnya. Contoh penerapan yang biasanya sering kita lakukan yaitu copy-paste dimana terjadi process sharing data/IPC anatara clipboard dengan process-process yang lainnya.

Secara singkat definisi Thread dan IPC menurut beberapa referensi di internet yaitu:

Thread : Merupakan unit dasar dari penggunaan CPU, thread saling berbagi bagian program, bagian data dan sumber daya sistem operasi dengan thread lain yang mengacu pada proses yang sama. Thread terdiri atas ID thread, program counter, himpunan register, dan stack. Dengan banyak kontrol thread proses dapat melakukan lebih dari satu pekerjaan pada waktu yang sama.

IPC : Mekanisme pertukaran data baik antara proses satu dengan proses lain dalam satu komputer maupun proses-proses dalam komputer yang berbeda.
Linux menyediakan beberapa metode IPC, yaitu: Shared Memory, Pipes, Message Queue, Semaphore, TCP/UDP socket.

implementasi thread : Music Player

Dalam implementasi kali ini akan membuat sebuah music player yang bisa memutar music namun tetap bisa menampilkan menu. detail deskripsi :

Fatih adalah seorang network administrator, dia bekerja menggunakan linux server. Suatu ketika fatih merasa jenuh dengan pekerjaannya dia ingin mendengarkan lagu, tetapi linux server tidak memiliki GUI sehingga fatih harus memutar musik menggunakan konsol/terminal. Bantulah fatih membuat pemutar musik berbasis konsol.

Pemutar musik memiliki spesifikasi sebagai berikut :
1. Perintah help untuk menampilkan daftar perintah yang dapat digunakan.
2. Memiliki fitur list untuk menampilkan semua lagu pada folder playlist
3. Memiliki fitur play untuk menjalankan lagu 
4. Memiliki fitur pause setelah t detik
5. Memiliki fitur continue setelah t detik
6. Memiliki fitur stop setelah t detik


Dari deskripsi permasalahan diatas kita akan membutuhkan 6 thread dimana masing-masing thread berfungsi untuk menampilkan menu, menampilkan playlist, menjalankan music, melakuan pause, melakukan resume dan men-stop lagu yang sedang diputar. untuk memutar suatu music disini kita menggunakan program mpg123.

untuk membuat suatu thread kita memerlukan pthread_t yang digunakan sibagad thread id.
kemudian kita buat suatu thread dengan pthread_create();
dimana fungsi tersebut akan memanggil program yang dijalankan dimana pada program dibawah berarti fungsi playandcount();
tiap-tiap thread akan menjalankan bagian fungsi sesuai dengan tid-nya masing-masing.

cara kerjanya apabila user memanggil thread ke 1 maka program akan menjalankan bagian menampilkan menu. lalu apabila user memanggil thread ke 3 maka program akan memutar music sesuai inputan user. apabila user kembali ke menu maka music amasih akan tetap diputar.


 #include <stdio.h>  
 #include <string.h>  
 #include <pthread.h>  
 #include <stdlib.h>  
 #include <unistd.h>  
 #include <string.h>  
 #define PATH "SISOP/LIST"  
 pthread_t tid[7];  
 int n;  
 char lagu[50];  
 char buf[100];  
 void* playandcount(void *arg)  
 {  
   pthread_t id=pthread_self();  
   int iter;  
   if(pthread_equal(id,tid[1]))  
   {  
     system("clear");  
      printf("-------------------------\n");  
      printf("ABAL-ABAL PLAYER\n");  
      printf("-------------------------\n");  
     printf("1. Help\n");  
     printf("2. Playlist\n");  
     printf("3. Play\n");  
     printf("4. Pause\n");  
     printf("5. Continue\n");  
     printf("6. Stop\n");  
   }  
   else if(pthread_equal(id,tid[2]))  
   {  
      system("clear");  
      printf("-------------------------\n");  
      printf("PLAYLIST\n");  
      printf("-------------------------\n");       
      snprintf(buf, sizeof(buf), "cd\ncd %s\nls | grep -v grep | grep .mp3", PATH);  
      system(buf);  
   }  
   else if(pthread_equal(id,tid[3]))  
   {  
     system("pkill mpg123");  
     system("clear");  
     snprintf(buf, sizeof(buf), "mpg123 %s",lagu);  
     system(buf);  
   }  
   else if(pthread_equal(id, tid[4]))  
   {  
     system("clear");  
     sleep(n);  
     system("pkill -STOP mpg123");  
   }  
   else if(pthread_equal(id, tid[5]))  
   {  
     system("clear");  
     sleep(n);  
     system("pkill -CONT mpg123");  
   }  
   else if(pthread_equal(id,tid[6]))  
   {  
     system("clear");  
     sleep(n);  
     system("pkill mpg123");  
   }  
   return NULL;  
 }  
 int main(void)  
 {  
 pthread_create(&(tid[1]), NULL, &playandcount, NULL);  
   system("clear");  
   while(1)  
   {  
      int input;  
     int err=0;  
     scanf("%d",&input);  
     if (err!=0) printf("\ncan't create thread : [%s]", strerror(err));  
     else if (input==1) err=pthread_create(&(tid[1]), NULL, &playandcount, NULL);  
     else if (input==2) err=pthread_create(&(tid[2]), NULL, &playandcount, NULL);  
     else if (input==3)  
     {  
       scanf("%s",lagu);  
       err=pthread_create(&(tid[3]), NULL, &playandcount, NULL);  
     }  
     else if (input==4)  
     {  
       scanf("%d",&n);  
       err=pthread_create(&(tid[4]), NULL, &playandcount, NULL);  
     }  
     else if (input==5)  
     {  
       scanf("%d",&n);  
       err=pthread_create(&(tid[5]), NULL, &playandcount, NULL);  
     }  
     else if (input==6)  
     {  
       scanf("%d",&n);  
       err=pthread_create(&(tid[6]), NULL, &playandcount, NULL);  
     }  
     else printf("Wrong Input\n");  
   }  
   return 0;  
 }  


Screenshot Menampilkan menu, music tetap play di background


implementasi : Aplikasi Penjual dan Pembeli

pada implementasi kali ini kita harus bisa mengkomunikasikan atara aplikasi penjual dan pembeli dengan IPC, dimana kedua aplikasi tersebut berbagi data stock barang. detail deskripsi :

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

Dari deskripsi diatas kita memerlukan metode IPC untuk bisa mengkomunikasikan data stock barang diantara dua proses. pada program kali ini kita akan menggunakan shared memory.


   key_t KEY;  --> Deklarasi key yang akan kita gunakan untuk mendapatkan ID share memory
   int ID;     --> Deklarasi variabel ID yang digunakan sebagai ID share memory
   Stock *data;  --> Tipe data dari share memory yang kita buat
   KEY = 6969;   --> Inisialisasi KEY, harus kita buat sama antar dua proses yang akan dihubungkan
   ID = shmget(KEY, sizeof(Stock), IPC_CREAT | 0666);  --> Mendapatakn ID dan mencreate share memory dari key yg sudah kita inisialisasi
   data = (Stock *) shmat(ID, NULL, 0);  --> meng assignmenkan share memory yg kita buat tadi ke variabel data

jadi pada program kali ini akan terdapat variabel data dimana variabel tersebut dimiliki dan diakses oleh kedua program. Ketika program pembeli mengubah data yang ada pada variabel data maka perubahan juga akan terjadi di palikasi penjual, dan begitupun sebaliknya.

Aplikasi Penjual
 #include <stdio.h>  
 #include <stdlib.h>  
 #include <sys/types.h>  
 #include <sys/ipc.h>  
 #include <sys/shm.h>  
 #include <sys/stat.h>  
 #include <unistd.h>  
 #include <string.h>  
 typedef struct STOK  
 {  
   int RAM;  
   int harddisk;  
   int motherboard;  
   int PSU;  
   int VGA;  
   int processor;  
 } Stock;  
 void lihatBarang(Stock *data)  
 {  
   system("clear");  
   printf("DAFTAR STOCK BARANG\n")     ;  
   printf("-------------------------\n");  
   printf("RAM\t\t : %d \n",data->RAM);  
   printf("HARDDISK\t : %d \n",data->harddisk);  
   printf("MOTHERBOARD\t : %d \n",data->motherboard);  
   printf("PSU\t\t : %d \n",data->PSU);  
   printf("VGA\t\t : %d \n",data->VGA);  
   printf("PROCESSOR\t : %d \n",data->processor);  
   printf("-------------------------\n");  
 }  
 void tambahBarang(Stock *data)  
 {  
   int pilihan, tambah;  
   system("clear");  
   printf("LIST BARANG\n");  
   printf("-------------------------\n");  
   printf("1.RAM\n2.harddisk\n3.motherboard\n4.PSU\n5.VGA\n6.processor\n");  
   printf("\n\nPilih barang : ");  
   scanf("%d", &pilihan);  
   printf("Jumlah barang : ");  
   scanf("%d",&tambah);  
   switch(pilihan)  
   {  
   case 1:  
     data->RAM += tambah;  
     printf("STOK RAM : %d \n", data->RAM);  
     break;  
   case 2:  
     data->harddisk += tambah;  
     printf("STOK harddisk : %d \n", data->harddisk);  
     break;  
   case 3:  
     data->motherboard += tambah;  
     printf("STOK motherboard : %d \n", data->motherboard);  
     break;  
   case 4:  
     data->PSU += tambah;  
     printf("STOK PSU : %d \n", data->PSU);  
     break;  
   case 5:  
     data->VGA += tambah;  
     printf("STOK VGA : %d \n", data->VGA);  
     break;  
   case 6:  
     data->processor += tambah;  
     printf("STOK processor : %d \n", data->processor);  
     break;  
   default:  
     printf("PILIHAN SALAH : Barang Tidak Ada\n");  
   }  
 }  
 int main()  
 {  
   key_t KEY;  
   int ID;  
   Stock *data;  
   int pilihan;  
   KEY = 6969;  
   ID = shmget(KEY, sizeof(Stock), IPC_CREAT | 0666);  
   data = (Stock *) shmat(ID, NULL, 0);  
   data->RAM = 0;  
   data->harddisk = 0;  
   data->motherboard = 0;  
   data->PSU = 0;  
   data->VGA = 0;  
   data->processor = 0;  
   while(1)  
   {  
     printf("-------------------------\n");  
      printf("PENJUAL APP");  
     printf("\n-------------------------\n");  
     printf("1. Lihat Stok Barang\n");  
     printf("2. Tambah Barang\n");  
      printf("3. Exit\n");  
     printf("-------------------------\n");  
     printf("Pilih menu : ");  
     scanf("%d",&pilihan);  
     if (pilihan == 1)  
     {  
       lihatBarang(data);  
     }  
     else if(pilihan == 2)  
     {  
       tambahBarang(data);  
     }  
      else if(pilihan == 3)  
      {  
        system("clear");  
        return 0;  
      }  
     else getchar();  
   }  
 }  


Aplikasi Pembeli
 #include <stdio.h>  
 #include <stdlib.h>  
 #include <sys/types.h>  
 #include <sys/ipc.h>  
 #include <sys/shm.h>  
 #include <sys/stat.h>  
 #include <unistd.h>  
 #include <string.h>  
 typedef struct STOK  
 {  
   int RAM;  
   int harddisk;  
   int motherboard;  
   int PSU;  
   int VGA;  
   int processor;  
 } Stock;  
 void lihatBarang(Stock *data)  
 {  
   system("clear");  
   printf("DAFTAR STOCK BARANG\n")     ;  
   printf("-------------------------\n");  
   printf("RAM\t\t : %d \n",data->RAM);  
   printf("HARDDISK\t : %d \n",data->harddisk);  
   printf("MOTHERBOARD\t : %d \n",data->motherboard);  
   printf("PSU\t\t : %d \n",data->PSU);  
   printf("VGA\t\t : %d \n",data->VGA);  
   printf("PROCESSOR\t : %d \n",data->processor);  
   printf("-------------------------\n");  
 }  
 void beliBarang(Stock *data)  
 {  
   int pilihan, jumlah;  
   system("clear");  
   printf("LIST BARANG\n");  
   printf("-------------------------\n");  
   printf("1.RAM\n2.harddisk\n3.motherboard\n4.PSU\n5.VGA\n6.processor\n");  
   printf("\n\nPilih barang : ");  
   scanf("%d", &pilihan);  
   printf("Jumlah pembelian : ");  
   scanf("%d",&jumlah);  
   switch(pilihan)  
   {  
   case 1:  
     if (jumlah > data->RAM)  
     {  
       printf("OUT OF STOCK\n");  
     }  
     else  
     {  
       printf("Anda membeli %d RAM\n", jumlah);  
       data->RAM -= jumlah;  
     }  
     break;  
   case 2:  
     if (jumlah > data->harddisk)  
     {  
       printf("OUT OF STOCK\n");  
     }  
     else  
     {  
       printf("Anda membeli %d harddisk\n",jumlah);  
       data->harddisk -= jumlah;  
     }  
     break;  
   case 3:  
     if (jumlah > data->motherboard)  
     {  
       printf("OUT OF STOCK\n");  
     }  
     else  
     {  
       printf("Anda membeli %d motherboard\n",jumlah);  
       data->motherboard -= jumlah;  
     }  
     break;  
   case 4:  
     if (jumlah > data->PSU)  
     {  
       printf("OUT OF STOCK\n");  
     }  
     else  
     {  
       printf("Anda membeli %d PSU\n",jumlah);  
       data->PSU -= jumlah;  
     }  
     break;  
   case 5:  
     if (jumlah > data->VGA)  
     {  
       printf("OUT OF STOCK\n");  
     }  
     else  
     {  
       printf("Anda membeli %d VGA\n",jumlah);  
       data->VGA -= jumlah;  
     }  
     break;  
   case 6:  
     if (jumlah > data->processor)  
     {  
       printf("OUT OF STOCK\n");  
     }  
     else  
     {  
       printf("Anda membeli %d processor\n",jumlah);  
       data->processor -= jumlah;  
     }  
     break;  
   default:  
     printf("PILIHAN SALAH : Barang Tidak Ada\n");  
   }  
 }  
 int main(void)  
 {  
   key_t KEY;  
   int ID;  
   Stock *data;  
   int pilih;  
   KEY = 6969;  
   ID = shmget(KEY, sizeof(Stock), 0666);  
   data = (Stock *) shmat(ID, NULL, 0);  
   while(1)  
   {  
     printf("-------------------------\n");  
      printf("PEMBELI APP");  
     printf("\n-------------------------\n");  
     printf("1. Lihat Stok Barang\n");  
     printf("2. Beli Barang\n");  
      printf("3. Exit\n");  
     printf("-------------------------\n");  
     printf("Pilih menu : ");  
     scanf("%d",&pilih);  
     if(pilih == 1)  
     {  
       lihatBarang(data);  
     }  
     else if(pilih == 2)  
     {  
       beliBarang(data);  
     }  
      else if(pilih == 3)  
      {  
        system("clear");  
        return 0;  
      }  
     else getchar();  
   }  
 }  


Aplikasi penjual menampilkan menu

Aplikasi penjual fitur Lihat Stock Barang

Aplikasi penjual Fitur Tambah Barang

Aplikasi Pembeli ftur Lihat stock Barang

Aplikasi pembeli fitur Beli Barang


Semoga bermanfaat :)

Tidak ada komentar:

Posting Komentar