BAB IV THREADS Pendahuluan Salah satu tujuan penng dari pembentukan thread adalah untuk memungkinkan eksekusi secara konkuren dan paralel. Dari sebuah program atau aplikasi, bisa jadi terdapat banyak instruksi yang dapat dilakukan secara paralel tanpa mempengaruhi instruksi instruksi yang lain. Langkah awal sebelum penggunaan thread adalah memaskan apakah sebuah program benar-benar membutuhkannya. Sebagai contoh, sebuah program dirancang untuk membaca dan menampilkan berkas. Maka untuk program ini, bisa dibagi dalam dua atau lebih thread yang berbeda, satu thread untuk membaca berkas, satu thread lain untuk memperbarui tampilan dan mungkin satu thread lainnya untuk memantau input pengguna melalui keyboard. Dan perlu diperhakan bahwa akan ada kasus keka sebuah thread tergantung satu dengan yang lainnya seper pada kasus di atas. Jika aplikasi tersebut berupa pengolah kata dimana keka tombol karakter ditekan maka harus segera diinormasikan ke thread lain untuk memperbaharui tampilan atau membuka menu lain atau menjalankan ndakan yang sesuai. !al ini akan mempengaruhi hasil akhir dari proses secara keseluruhan. "ujuan dari pelaksanaan prakkum ini adalah untuk memberikan pemahaman praks bagaimana prose prosess denga dengan n beber beberapa apa thread threadss dijala dijalanka nkan n pada pada siste sistem m opera operasi si berba berbasis sis linu#. linu#. Serta Serta juga juga menunjukkan bahwa pembentukan thread bisa menjadi penyebab munculnya inkonsistensi hasil akhir dari sebuah proses jika thread dak dijalankan dengan benar. benar.
Teori T eori Penduk Pendukung ung "hread dapat dikatakan merupakan bagian terkecil dari sebuah proses yang bisa dieksekusi atau dijalankan dijalankan.. Satu proses proses bisa memiliki beberapa beberapa thread thread yang dapat dieksek dieksekusi usi secara secara asinkron. asinkron. $ksekusi $ksekusi asinkron asinkron ini membawa membawa kemampua kemampuan n seap seap thread thread menangan menanganii pekerjaan pekerjaan atau layanan layanan tertentu secara independen yang jika digabungkan kembali akan setara dengan hasil eksekusi seluruh proses dengan lengkap. "hread "hread pada pada siste sistem m opera operasi si moder modern n telah telah menjad menjadii bagian bagian penng penng.. Misalk Misalkan an sebua sebuah h prose proses, s, berungsi untuk menerima masukan secara real me dan sesuai dengan masing-masing masukan, proses tersebut harus menghasilkan luaran tertentu. Jika prosesnya dak dibuat menjadi beberapa thread berbeda %mul-thread&, maka instruksi dalam proses akan dieksekusi secara berurutan atau dalam terminologi sistem operasi sering disebut eksekusi sinkron. 'eterbat 'eterbatasan asan dalam hal ini adalah adalah proses proses dak dapat menerima menerima masukan sampai pemroses pemrosesan an masukan sebelumnya sebelumnya telah selesai. Dan jika pemrosesan masukan sebelumnya sebelumnya membutuhkan waktu yang lama, maka maka masukan masukan selanjutn selanjutnya ya akan akan terus terus ditahan. ditahan. Solusi atas permasalahan permasalahan ini adalah memecah proses menjadi beberapa thread yang berbeda, agar proses tersebut dapat dijalankan secara asinkron.
(erikut adalah beberapa perbedaan utama antara proses dan thread)
*roses dak berbagi inormasi pengalamatan dengan proses lain, sementara thread akan membagi inormasi pengalamatannya dengan thread lain yang dieksekusi di bawah proses yang sama. *roses dieksekusi secara independen dan berbeda antara satu proses dengan proses yang lain. Sinkronisasi antara proses dikelola oleh kernel. Sementara disisi lain, sinkronisasi thread diatur oleh proses yang memiliki thread tersebut. *roses conte#t-switching antar thread jauh lebih cepat dibandingkan dengan proses. +nteraksi antara dua proses hanya dapat dilakukan melalui komunikasi antar proses standar, sedangkan thread berkomunikasi dengan mudah karena berbagi sebagian besar sumber daya seper memori, segmen teks, dll.
amun, dibalik kemudahan dan kecepatan yang bisa didapatkan dengan mengimplementasikan thread, terdapat banyak masalah yang mungkin muncul. Diantaranya adalah kemungkinan terjadinya oerwrite data dan isi memori secara keseluruhan jika sebuah thread mengeksekusi sebuah aplikasi lain atau aplikasi baru yang berbeda. Masalah lain yang mungkin mbul adalah masalah konsistensi data. 'arena thread berbagi hampir semua komponen %kecuali stack& dan eksekusinya dapat dihenkan seap saat % preemptve& pada tahap apa pun oleh thread yang lain, maka ada kemungkinan ariabel atau struktur data global yang ada menjadi dak konsisten. !al ini dapat menyebabkan masalah saat thread yang berbeda mengeksekusi ungsi yang sama dan menggunakan ariabel atau struktur data yang sama.
Gambar 1. Inkonsisensi Daa karena Penggunaan Threads
Materi dan Langkah Praktikum 1. k/an sistem operasi linu# yang telah diinstall sebelumnya. Login ke sistem dan kemudian buka
sebuah console shell atau aplikasi terminal jika menggunakan mode 01+. 2. 0unakan aplikasi pengolah teks yang ada pada sistem operasi linu# seper nano, pico ataupun i
dan im. 3. "uliskan kode program berikut ini pada sebuah berkas baru. #include
#include #include
void * thread1() {
while(1){
printf("Hello!!n")
void * thread() {
while(1){ printf("How are $ou%n")
int &ain() { int status pthread't tid1tid
pthread'create(tid1+,,thread1+,,)
pthread'create(tid+,,thread+,,)
pthread'-oin(tid1+,,)
pthread'-oin(tid+,,) return
4. Simpan berkas baru tersebut dengan nama threadsatu.c 5. 'ompilasi kode program threadsatu.c melalui terminal dengan menuliskan perintah /ad&in0host2 gcc threadsatu.c –lpthread –o threadsatu 6. Jalankan program baru tersebut diatas. "unjukkan tampilan yang ada pada terminal serta berikan
penjelasan singkat dari tampilan tersebut. 7. 'embali tuliskan kode program berikut ini pada sebuah berkas baru. #include #include #include #include #include
pthread't tid/
void* do4o&e5hin3(void *ar3) { unsi3ned lon3 i 6 pthread't id 6 pthread'self()
if(pthread'e7ual(idtid/)) { printf("n 8irst thread processin3n")
else { printf("n 4econd thread processin3n") for(i6 i<(988888888)i::) return +,,
int &ain(void) { int i 6 int err
while(i < )
{ err 6 pthread'create((tid/i) +,, do4o&e5hin3 +,,) if (err !6 ) printf("ncan;t create thread /=s" strerror(err))
else printf("n 5hread created successfull$n")
i::
sleep() return
8. Simpan berkas kedua ini dengan nama threaddua.c 9. 'ompilasi kode program threaddua.c melalui terminal dengan menuliskan perintah /ad&in0host2 gcc threaddua.c –lpthread –o threaddua 10.
Jalankan program baru tersebut diatas. "unjukkan tampilan yang ada pada terminal serta
berikan penjelasan singkat dari tampilan tersebut. 11.
(uka aplikasi terminal yang lain, dan jalankan kedua thread tersebut.
12.
"emukan identas proses %dan mungkin juga thread& yang terkait dengan perintah eksekusi
kedua thread tersebut2 13.
pakah yang bisa dijelaskan dari kedua contoh thread diatas3 pa yang menjadi masalah
utama dalam hal ini3 14.
(erikut ini adalah sebuah kode program yang dijalankan secara sekuensial. Dibentuk menjadi
satu proses dengan single hread .
#include #include #include
static int nu&'accts 6 1?
@@ nu&ber of banA accounts
static int nu&'trans 6 1
@@ nu&ber of transactions
static int thinA'ti&e 6
@@ a&ount of "thinAin3 ti&e"
struct acct't {
int bal
@* * Bointer to accounts *@ struct acct't *accts
@* * Cethod to perfor& a nu&ber of transactions. * Bara&eter "du&&$" is not used. *@ void *transact(void *du&&$) { int i for (i 6 i < nu&'trans i::) { @@ picA two rando& accounts int acct'id'fro& 6 rand() = nu&'accts int acct'id'to 6 rand() = nu&'accts @@ picA a rando& a&ount int a&t 6 rand() = 1
@@ tr$ to transfer the &one$ if (accts/acct'id'fro&.bal > a&t) { accts/acct'id'fro&.bal D6 a&t accts/acct'id'to.bal :6 a&t
@@ "thinAin3 ti&e"... don;t &odif$ this code!! a&t *6 thinA'ti&e while (a&tDD)
int &ain(int ar3c char **ar3v)
{ @@ &aAe sure the nu&ber of ar3u&ents is odd (includin3 the pro3ra& na&e) if (!(ar3c 66 1 EE ar3c 66 F EE ar3c 66 EE ar3c 66 G)) { fprintf(stderr "usa3e =s /Da /Di /Dt n" ar3v/)
e9it(D1)
@@ looA at each runti&e ar3u&ent and see which value it;s atte&ptin3 to set int i for (i 6 1 i < ar3c i::) { if (!strc&p(ar3v/i "Da")) { nu&'accts 6 atoi(ar3v/i:1)
i:: else if (!strc&p(ar3v/i "Di")) { nu&'trans 6 atoi(ar3v/i:1)
i:: else if (!strc&p(ar3v/i "Dt")) { thinA'ti&e 6 atoi(ar3v/i:1)
i:: else {
fprintf(stderr "usa3e =s /Da /Di /Dt n" ar3v/)
e9it(D1)
@@ displa$ the para&eters that will be used for this test run fprintf(stderr "=s Da =d Di =d Dt =dn" ar3v/ nu&'accts nu&'trans thinA'ti&e)
@@ initialie the rando& nu&ber 3enerator srand(1)
@@ create the banA accounts
accts 6 (struct acct't *)&alloc(nu&'accts * sieof(struct acct't))
@@ initialie the banA accounts; values and Aeep tracA of the total su& in all accounts int ori3inal'su& 6 for (i 6 i < nu&'accts i::) { accts/i.bal 6 rand() = 1 ori3inal'su& :6 accts/i.bal
@@ call the transact function to do the transfers transact(+,,)
@@ find the total su& of all accounts after the transfers are done int su& 6 for (i 6 i < nu&'accts i::) { su& :6 accts/i.bal
@@ if the su& is not e7ual to the ori3inal su& then we had a race condition!! if (su& !6 ori3inal'su&) { fprintf(stderr "IJJKJ! ori3inal'su& 6 =d su& 6 =dn" ori3inal'su& su&) else { fprintf(stderr "Lalues are still consistentn")
return
15.
'ompilasi kode program tersebut dan simpan dengan nama berkas singlethread .
16.
Jalankan, tunjukkan dan berikan penjelasan singkat terkait eksekusi program tersebut.
17.
(uat tulisan ilmiah yang berisi penjelasan tentang kode program singlethread yang
telah dimodi4kasi dengan aturan sebagai berikut) a. Modi4kasi kode tersebut menjadi beberapa thread yang berbeda dan simpan dengan nama berkas threadtiga. b. Deskripsi tentang hasil eksekusi program threadtiga beserta penjelasannya. c.
"erdiri dari minimal 5666 kata diluar judul, sub judul, kode program dan reerensi.
Referensi 5. h7p)88www.csc.illanoa.edu89mdamian8threads8posi#threads.html :. h7ps)88blog.eabhas.com8:65;86<8three-nos-se=uenal-consistency >. h7ps)88www.cis.upenn.edu89cdmurphy8cis?@:8spring:65:8homework8lab6>-threads.html @. h7p)88www.thegeekstuA.com8:65:86@8create-threads-in-linu# ?. h7ps)88linu#programs.wordpress.com ;. h7p)88www.cs.cmu.edu8as8cs8academic8class85?@B:-6C8www8pthreads.html