Wednesday, November 19, 2014

Process Programming dan Thread

Selamat siang temen-temen, kali ini saya akan mbahas tentang apa itu  Process Programming dan thread. Jadi, mari kita mulai diskusinya.
Jadi, dalam system operasi terdapat istilah yang namakan process ID. Apa itu? Process ID menrupakan media komunikasi tiap2 proses yang ada di system operasi sehingga dapat berkomunikasi. Proses ID ini terdiri dari 16 digit integer dan setiap process ID, pasti memiliki parent process (kecuali init). Fungsi “get pid()” digunakan untuk mendapatkan pid proses sendiri, dan “get ppid untuk parent proses”. Apa itu proses anak? proses merupakan proses yang merupakan duplikasi dari proses yang sedang dilakukan (yang sebutannya adalah parent proses ).
Nah, berikut akan dijelaskan bberapa cra untuk membuat proses anak, :
Dengan menggunakan fungsi system(), tidak disarankan. Sebab beberapa system operasi memiliki fungsi system yang berbeda(contoh windows dan linux), juga berbahaya sebab dapat mengganti isi dan mengubah secara bebas pada beberapa lever user
Dengan menggunakan fork(), menduplikasi proses yang ada, nah proses yang dihasilkan adalah proses anak, dan return value dari fork() menentukan  sekarang ada diproses mana. >0 ada di parent proses, =0 ada di proses anak, dan <0 maka proses gagal dibuat.
Dengan menggunakan proses exec, pada umumnya fungsi exec ini hamper sama dengan fungsi system, namun lebih baik.

Nah, pertanyaannya, bagaimana cara agar satu proses dan lainnya agar dapat berkomunikasi? Jawabannya adalah dengan menggunakan signal. Signal sendiri ada bermacam-macam, berikut adalah signal yang umum:
*      SIGKILL : mengakhiri eksekusi program sekarang juga
*      SIGTERM : mengakhiri eksekusi program
*      SIGSEGV : diterima ketika program melakukan segmentation violation
*      SIGSTOP : menghentikan sementara suatu proses sekarang juga
*      SIGCONT : melanjutkan kembali program yang di-stop
*      SIGINT : interrupt ke suatu proses

Nah, sekarang mari kita diskusi tentang thread, thread merupakan instruksi ada di process. Nah, 1 processor hanya dapat mengeksekusi 1 proses. Mungkin terdapat sedikit kebingungan antara thread dan proses. Untuk memperjelas berikut ciri2 antara thread dan proses:
Ciri2 proses:
Punya ruang/space sendiri di memory
Tidak dapat mengakses ruang lain di memory yang merupakan milik proses lain
Ciri2 thread:
Punya thread state
Punya program counter
Punya execution stack
Punya local variable
Akses ke memory yang dimiliki prosesnya

Nah, thread sendiri memiliki level2nya sendiri, berikut adalah level2 thread:
User Level thread
Kernel tidak mengetahui thread
Thread management dilakukan oleh aplikasi user level/library
Kernel leverl thread
Thread management dilakukan oleh kernel
Hybrid level thread
Pembuatan thread, scheduling, sikronisasi dilakukan di userspace

Ada beberapa thread user dipetakan ke luar kernel         

Berikut adalah contoh kodenya:
#include<stdio.h>
#include<pthread.h>
#include<string.h>
#include<stdint.h>
#include<stdlib.h>
#include<time.h>
int waktu;
int jum_soal;
double nilai=0;
struct Class{
char soal[100];
char pilihan[50];
char jawab;
};

FILE *file;
struct Class class[100];
pthread_t thread2,thread3;
pthread_mutex_t lock=PTHREAD_MUTEX_INITIALIZER;

void *scan(void *ptr){
int i = (intptr_t)ptr;

pthread_mutex_lock(&lock);
fgets(class[i].soal,100,file);
fgets(class[i].pilihan,100,file);
fscanf(file,"%c",&class[i].jawab); fgetc(file);
pthread_mutex_unlock(&lock);
}

void *show(void *ptr)
{
system("clear");
int i = (intptr_t)ptr;
printf("%s",class[i].soal);
printf("%s",class[i].pilihan);
sleep(waktu);
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
pthread_cancel(thread3);
}

void *jawab(void *ptr)
{
int i = (intptr_t)ptr;
char answer;
scanf("%c",&answer);
getchar();
if(answer==class[i].jawab)
{
nilai+=(100/(double)jum_soal);
}
time_t kodokwaktu;
        char waktukodok[25];
        struct tm* waktunyakodok;
        time(&kodokwaktu);
waktunyakodok = localtime (&kodokwaktu);
        strftime(waktukodok,25,"%d-%m-%Y %H:%M:%S",waktunyakodok);
FILE *log=fopen("/home/ponigh/Desktop/log.txt","a+");
fprintf(log,"nomor soal : %c Jawaban : %c Kunci : %c Pada pukul : %s\n",class[i].soal[0],answer,class[i].jawab,waktukodok);
fclose(log);
pthread_setcancelstate(PTHREAD_CANCEL_ENABLE,NULL);
pthread_cancel(thread2);
}

int main()
{
pthread_t thread1[100]; //(menyediakan thread sebanyak 100)
file=fopen("/home/ponigh/Desktop/soal.txt","r"); //(membuka format soal)
fscanf(file,"%d",&jum_soal); fgetc(file); //(scan jumlah soal)
fscanf(file,"%d",&waktu); fgetc(file); //scan waktu
int i;
for(i=0;i<jum_soal;i++)
pthread_create(&thread1[i],NULL,&scan,(void *)(intptr_t)(i)); //memasukkan ke soal

for(i=0;i<jum_soal;i++)
pthread_join(thread1[i],NULL); //menunggu agar tiap thread hingga slese dulu

for(i=0;i<jum_soal;i++)
{
pthread_create(&thread2,NULL,&show,(void *)(intptr_t)(i));//menampilkan soal
pthread_create(&thread3,NULL,&jawab,(void *)(intptr_t)(i));//proses menjawab
pthread_join(thread2,NULL);
pthread_join(thread3,NULL);
}
char pesankodok[100];
        sprintf(pesankodok,"zenity --info --text='Anda berhasil mendapat nilai :%lf'",nilai);
        system(pesankodok); //pop up hasilnya
fclose(file);
}

nah, source code diatas digunakan untuk membuat program tes dengan format sbb:
(jumlah soal) (waktu pengerjaan tiap soal)
(soal)
(pilihan)
(kunci)

contoh:
5 3
1.siapa yang paling ganteng?
a.ponigh b.ponigh c.ponigh d.ponigh
a
2.siapa yang paling ganteng?
a.ponigh b.ponigh c.ponigh d.ponigh
b
3.siapa yang paling ganteng?
a.ponigh b.ponigh c.ponigh d.ponigh
c
4.siapa yang paling ganteng?
a.ponigh b.ponigh c.ponigh d.ponigh
d
5.siapa yang paling ganteng?
a.ponigh b.ponigh c.ponigh d.ponigh
e

5 merupakan jumlah soal, dan 3 merupakan waktu pengerjaan tiap soal.

Kodok Ganteng - Concurrency

Nah kali ini mari kita diskusi tentang concurrency, apa itu? Jadi gini Concurrency merupakan 2 hal (dalam hal ini adalah proses) yang berjalan secara bersamaan. Kira2 apa yang terjadi? Nah kemungkinan kesalahan pastinya akan muncul, berikut adalah beberapa kesalahan yang dapat terjadi:
  • Bahaya global resource
  • Sulit alokasi resource secara optimal
  • Sulit debugging


Beberapa istilah yang terdapat di concurrency:
  • Atomic operation, sebuah action yang tampaknya tidak dapat dibagi. Atomic operation bersifat tidak bisa di interrupt
  • Critical section,bagian tertentu dari code yang butuh akses ke resource. jika sedang berjalan maka proses lain tidak boleh ikut jalan.
  • Race condition, Hasil dari proses tergantung dari siapa proses yang berjalan terlebih dahulu
  • Mutual exclution, sesuatu yang digunakan untuk mengunci bagian pada critical section, ketika proses dijalankan. Biasanya menggunakan perintah mutex_lock.


Nah, penggunaan pada bagian yang dijelaskan diatas dapat terjadi kesalahan yang biasanya dari user. Berikut beberapa kesalahan yang sering terjadi :
  • Starvation, bagian dari proses yang tidak pernah dijalankan
  • Deadlock, saling tunggu antar proses sehingga tidak ada yang berjalan




Wednesday, November 5, 2014

Sharing IPC

Selamat siang temen2, jadi kali ini kita akan bahas tentang IPC. Apa itu IPC, inter process communication, yang artinya tiap program  yang kita buat dapat berkomunikasi dengan program lain. Sehingga antar satu program dan program lain dapat saling berhubungan dan mengirimkan hasilnya untuk diproses satu sama lain.

Nah, bagaimana caranya? Pertama kita akan mempelajari tentang PID, apa itu PID? PID dapat dianalogikan sebagai nomor yang unique dari setiap proses. Setiap prosess selalu memiliki pid, dan satu sama lain selalu memiliki pid yang berbeda. Lalu, setiap process juga memiliki parent process. Apa itu parent proses? parent proses adalah proses yang merupakan dari induk proses yang berjalan pada saat ini.

Ada 3 cara untuk membuat proses anak :
  • Fungsi system() (tidak disarankan, sebab antar operating system memiliki fungsi system yang berbeda)
  • fungsi fork() (return value dari fork ini akan memnentukan proses sedang berjalan dimana, >0 ada di parent proses, =0 di child proses, <0 berarti gagal dibuat)
  • Fungsi exec() (Mengganti program yang sedang berjalan pada suatu proses)
nah apa hubungannya IPC denga Pid? untuk berkomunikasi antar program, maka dibutuhkan id dari tiap proses yang berjalan, dan Pid ini yang menjadi Id tersebut. Nah, salah satu komunikasi yang sering digunakan pada IPC adalah signal. Signual merupakan sebuah event yang dikirimkan ke suatu proses oleh proses itu sendiri atau proses lain. Signal digunakan untuk mengirimkan notifikasi kepada suatu proses bahwa ada suatu event. Berikut beberapa signal yang populer:

  • SIGKILL : mengakhiri eksekusi program sekarang juga
  • SIGTERM : mengakhiri eksekusi program
  • SIGSEGV : diterima ketika program melakukan segmentation violation
  • SIGSTOP : menghentikan sementara suatu proses sekarang juga
  • SIGCONT : melanjutkan kembali program yang di-stop
  • SIGINT : interrupt ke suatu proses