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:
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.