Jumat, 06 November 2015

Thread dan IPC

Belajar Sistem Operasi #3

Perkenalan Thread dan IPC
  1. Thread adalah bagian kecil dari suatu proses yang bisa di jadwalkan oleh sistem operasi. Thread juga disebut sebagai proses ringan (lightweight).
    • Single Threading : Adalah sebuah proses yang hanya memiliki satu thread yang berjalan. Biasanya fungsi thread ini digunakan sebagai pengendali jalannya proses.
    • 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.
  2. Interprocess Communication (IPC) adalah 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.
    • Pipe : Pipe merupakan komunikasi sequensial antar proses yang saling terelasi, namun pipe memiliki kelemahan yaitu hanya bisa digunakan untuk komunikasi antar proses yang saling berhubungan, dan komunikasinya yang dilakukan adalah secara sequensial.
    • 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 akan memakai 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).
Contoh Implementasi Thread

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

CODE
#include<string.h>
#include<pthread.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>


pthread_t tid[10];
int n;

void* playandcount(void *arg){
 unsigned long i=0;
 pthread_t id=pthread_self();
 int iter;
 if(pthread_equal(id,tid[1])){
  system("clear");
  printf("\nHelp List\n");
   printf("Press the below number to execute command\n");
   printf("1===Show Help command\n");   
   printf("2===Show playlist\n");
   printf("3===Play\n");
   printf("4===Pause after x sec\n");
   printf("5===Continue after x sec\n");
   printf("6===Stop after x sec\n");
 }
 else if(pthread_equal(id,tid[2])){
  system("clear");
  system("ls | grep .mp3");
 } 
 else if(pthread_equal(id,tid[3])){
  system("clear");
  system("mpg123 Try.mp3");
 }
 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){
  system("clear");
  while(1){
   int flag=0;
   int comm;   
   int i=0;
   int err=0;
   scanf("%d", &comm);
   if(comm==4 || comm==5 || comm==6)
    scanf("%d", &n);
   printf("\n\n");
  
    if (err!=0)
     printf("\ncan't create thread : [%s]", strerror(err));
    else{
     err=pthread_create(&(tid[comm]), NULL, &playandcount, NULL);
    }
   
  } 
 return 0;
}


Contoh Implementasi IPC (Pipe)

Raja Takeshi memiliki sebuah tantangan keren bagi orang-orang yang ingin masuk ke istananya. Tantangan ini disebut “Lubang Setan”. Tantangan ini memiliki aturan sebagai berikut: 
- Masing-masing pemain (Raja Takeshi dan si penantang) memiliki 16 lubang yang nantinya bisa diisi ranjau.
- Takeshi dan si penantang masing-masing memiliki 16 buah ranjau yang bisa dipakai serta poin
awal 0.
- Selama pertandingan, Takeshi dan penantang akan saling bergantian mengisi lubang-lubang tersebut dengan ranjau sedangkan salah satunya memberikan tebakan lubang mana saja yang aman dari ranjau.
- Setiap gilirannya, pemain bisa memasang 0 - 4 ranjau di lubang yang berbeda, dan lawannya menebak 4 lubang.
- Pemain yang menebak mendapatkan poin dari jumlah tebakan yang tidak terkena ranjau, sedangkan pemain yang memasang ranjau mendapat poin dari jumlah ranjau yang memakan korban.
- Cara pemasangan maupun penebakan ranjau adalah dengan menginputkan angka-angka yang menunjukkan nomor lubang.

CODE
Player 1:
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(){
 int fd,fs,fsc,ffe1,ffe2;
 int fc,ranjau[5],tebak[4];
 int entry[16];
 int counterentry=0,counterentry2=0;;
 int flagentry=0;
 int flagentry2=0;

 char *fifo1 = "/tmp/fifo1";
 char *fifo2="/tmp/fifo2";
 char *fifoscore="/tmp/fifoscore";
 
 int flag;
 mkfifo(fifo1,0666);
 mkfifo(fifoscore,0666);
 fd = open(fifo1, O_WRONLY);
 fs = open(fifo2,O_RDONLY);
 fsc = open(fifoscore,O_RDWR);
 int i,j,counter=0;
 int scorePlayer[3];
 
 scorePlayer[1]=0;
 scorePlayer[2]=0;

 while(counterentry+counterentry2<32){
 if(counterentry<16){
 system("clear");
 for(i=0;i<4;i++)
 {
  ranjau[i]=0;
 }

 printf("PLAYER 1 (%d  -  %d) PLAYER 2\n",scorePlayer[1],scorePlayer[2]);
 //BOM
 for(i=0;i<4;i++)
 {
 
  printf("Bom ke-%d : ",i+1);
  scanf("%d",&ranjau[i]);
  while(ranjau[i]<0 || ranjau[i]>16) 
  { 
   printf("Lubang tersebut tidak tersedia\n");
   printf("Bom ke-%d : ",i+1);
   scanf("%d",&ranjau[i]);
  }
  for(j=0;j<counterentry;j++)
  {
   while(ranjau[i]==entry[j])
   {
    if(ranjau[i]==0) break;
    printf("Anda telah memasukkan ranjau ke lubang tersebut\n");
    printf("Bom ke-%d : ",i+1);
    scanf("%d",&ranjau[i]);
   }
  }
  if(ranjau[i]!=0) 
  {
   entry[counterentry]=ranjau[i];
   counterentry++;
  }
  if(counterentry>=16) break; 
 }  
 }

 ranjau[4]=counterentry;
 write(fd,ranjau,sizeof(ranjau)); 
 if(counterentry+counterentry2>=32) break;
 
 system("clear");
 
 printf("PLAYER 1 (%d  -  %d) PLAYER 2\n",scorePlayer[1],scorePlayer[2]);

 //TEBAK
 read(fsc,scorePlayer,sizeof(scorePlayer));
 read(fs, ranjau, sizeof(ranjau));
 counterentry2=ranjau[4];
 system("clear");
 
 printf("PLAYER 1 (%d  -  %d) PLAYER 2\n",scorePlayer[1],scorePlayer[2]);
 
 for(i=0;i<4;i++)
 {
  printf("Tebak bom ke-%d : ",i+1);
  scanf("%d",&tebak[i]);
  while(tebak[i]<=0 || tebak[i]>16) 
  { printf("Lubang tersebut tidak tersedia\n");
   printf("Tebak bom ke-%d : ",i+1);
   scanf("%d",&tebak[i]);
  }
  for(j=0;j<i;j++)
  {
   while(tebak[i]==tebak[j])
   {
    printf("Anda telah menebak lubang tersebut\n");
    printf("Tebak bom ke-%d : ",i+1);
    scanf("%d",&tebak[i]);
   }
  }
 }
 

 //HITUNG
 for(j=0;j<4;j++){
  flag=0;
  for(i=0;i<4;i++)
  { 
   if(ranjau[j]==tebak[i]) flag=1;
   if(ranjau[j]==0) flag=2;
  }
  if(flag==1) scorePlayer[1]=scorePlayer[1]+1;
  else if(flag==0) scorePlayer[2]=scorePlayer[2]+1;
 }
 write(fsc,scorePlayer,sizeof(scorePlayer));
 
 if(counterentry+counterentry2>=32) break;
 }
 
 system("clear");
 
 printf("PLAYER 1 (%d  -  %d) PLAYER 2\n",scorePlayer[1],scorePlayer[2]);

 if(scorePlayer[1]>scorePlayer[2]) 
 printf("*** PLAYER 1 WINS ***");
 else if(scorePlayer[1]==scorePlayer[2])
 printf("*** ITS A DRAW ***");
 else 
 printf("*** PLAYER 2 WINS ***");
 close (fd);
 close (fc);
 close (fs);
 unlink(fifo1);
 
 return 0;
} 
 

Player 2 :
#include <fcntl.h>
#include <sys/stat.h>
#include <sys/types.h>
#include <unistd.h>
#include <stdio.h>

int main(){
 int fd,fc,fs,fsc,ffe1,ffe2;
 char *fifo1 = "/tmp/fifo1";
 char *fifo2="/tmp/fifo2";
 char *fifoscore="/tmp/fifoscore";

 int entry[16];
 int counterentry=0,flagentry=0;
 int flagentry2=0;
 int counterentry2=0;
 mkfifo(fifo2,0666);
 mkfifo(fifoscore,0666);
 
 int ranjau[5];
 int tebak[4];
 int i,j;
 int scorePlayer[3];
 int counterplayer2=0;
 int flag=0;
 scorePlayer[1]=0;
 scorePlayer[2]=0;

 fd = open(fifo1, O_RDONLY);
 fs = open(fifo2,O_WRONLY);
 fsc = open(fifoscore,O_RDWR);

 while(counterentry+counterentry2<32){
 
 system("clear");
 
 printf("PLAYER 1 (%d  -  %d) PLAYER 2\n",scorePlayer[1],scorePlayer[2]);
 //TEBAK
 read(fd, ranjau, sizeof(ranjau));
 counterentry2=ranjau[4];

 for(i=0;i<4;i++)
 {
  printf("Tebak bom ke-%d : ",i+1);
  scanf("%d",&tebak[i]);
  while(tebak[i]<=0 || tebak[i]>16) 
  { printf("Lubang tersebut tidak tersedia\n");
   printf("Tebak bom ke-%d : ",i+1);
   scanf("%d",&tebak[i]);
  }
  for(j=0;j<i;j++)
  {
   while(tebak[i]==tebak[j])
   {
    printf("Anda telah menebak lubang tersebut\n");
    printf("Tebak bom ke-%d : ",i+1);
    scanf("%d",&tebak[i]);
   }
  }
 }
  
 //HITUNG
 for(j=0;j<4;j++){
  flag=0;
  for(i=0;i<4;i++)
  { 
   if(ranjau[j]==tebak[i]) flag=1;
   if(ranjau[j]==0) flag=2;
  }
  if(flag==1) scorePlayer[2]=scorePlayer[2]+1;
  else if(flag==0) scorePlayer[1]=scorePlayer[1]+1;
 
 }
 
 write(fsc,scorePlayer,sizeof(scorePlayer));

 if(counterentry<16){
 
 system("clear"); 
 

 printf("PLAYER 1 (%d  -  %d) PLAYER 2\n",scorePlayer[1],scorePlayer[2]);
 
 //BOM
 for(i=0;i<4;i++)
 {
  printf("Bom ke-%d : ",i+1);
  scanf("%d",&ranjau[i]);
  while(ranjau[i]<0 || ranjau[i]>16) 
  { 
   printf("Lubang tersebut tidak tersedia\n");
   printf("Bom ke-%d : ",i+1);
   scanf("%d",&ranjau[i]);
  }
  for(j=0;j<counterentry;j++)
  {
   while(ranjau[i]==entry[j])
   {
    if(ranjau[i]==0) break;
    printf("Anda telah memasukkan ranjau ke lubang tersebut\n");
    printf("Bom ke-%d : ",i+1);
    scanf("%d",&ranjau[i]);
   }
  }
  if(ranjau[i]!=0) 
  {
   entry[counterentry]=ranjau[i];
   counterentry++;
  }
  if(counterentry>=16) break;
 }

 ranjau[4]=counterentry;
 write(fs,ranjau,sizeof(ranjau));
 read(fsc,scorePlayer,sizeof(scorePlayer));
 }
 }
 write(fsc,scorePlayer,sizeof(scorePlayer));
 system("clear");
 
 
 printf("PLAYER 1 (%d  -  %d) PLAYER 2\n",scorePlayer[1],scorePlayer[2]);
 
 close (fd);
 close (fc);
 close (fs);
 unlink (fifo2);
 return 0;
} 
 
 

Sekian tulisan saya kali ini. Semoga Bermanfaat!

Tidak ada komentar:

Posting Komentar