Belajar Sistem Operasi #3
Perkenalan Thread dan IPC
- 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.
 
- 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!