Anda di halaman 1dari 22

TUGAS SISTEM PARALEL POSIXTHREAD

Ikhwanurrohim (09/281065/PA/12357)

PROGRAM STUDI ILMU KOMPUTER JURUSAN ILMU KOMPUTER DAN ELEKTRONIKA FAKULTAS ILMU PENGETAHUAN ALAM UNIVERSITAS GADJAH MADA YOGYAKARTA 2011

1. POSIXTHREAD a. Thread Apa yang dimaksud dengan Thread? Secara teknis, thread didefinisikan sebagai aliran independen dari instruksi yang

dapat dijadwalkan untuk berjalan sesuai perintah dari sistem operasi.

Untuk pengembang perangkat

lunak, konsep "prosedur" yang

berjalan secara

independen dari program utama adalah mendeskripikan thread.

Untuk melangkah lebih jauh, bayangkan sebuah program utama (a.out) yang berisi sejumlah prosedur. Lalu, bayangkan semua prosedur yang dapat dijadwalkan

untukberjalan secara simultan dan atau secara independen oleh sistem operasi. Itu akan menggambarkan "multi-threaded" program.

Bagaimana hal ini dapat dicapai? Sebelum memahami thread, yang pertama harus dipahami adalah proses UNIX. Sebuah proses dibuat oleh sistem operasi, dan informasi tentang sumber membutuhkan cukup daya program dan

banyak "overhead". Proses berisi

pelaksanaan state dari program, termasuk:


Process ID, process group ID, user ID, and group ID Environment Working directory. Program instructions Registers Stack Heap File descriptors Signal actions Shared libraries Inter-process communication tools (seperti message queues, pipes, semaphores, ataupun shared memory).

Thread digunakan dan ada dalam sumber daya proses, belum dapat dijadwalkan oleh sistem operasi dan berjalan sebagai entitas independen terutama karena mereka hanya menduplikasi sumber daya utama yang penting dan memungkinkannya eksis sebagai executable code.

Flow control independen ini dilakukan karena thread melakukan pemeliharaan sendiri terhadap :

Stack pointer Registers Scheduling properties (contoh : policy atau priority) Set of pending and blocked signals Thread specific data.

Maka didapat kesimpulan bahwa environment pada UNIX thread : Ada dalam proses dan menggunakan sumber daya proses Memiliki flow control yang independen selama proses induknya ada dan

OS mendukung Hanya menduplikasi sumber daya yang penting, yang dibutuhkan untuk dijadwalkan secara independen

Dapat berbagi sumber daya proses dengan thread lain yang bertindak sama secara independen (dan ketergantungan) Berhenti jika proses induk berhenti atau mengalami sesuatu lain yang dapat mempengaruhi proses Bersifat Lightweight (ringan), karena sebagian dari biaya overhead telah

dicapai melalui penciptaan proses.

Karena thread dalam proses yang sama berbagi sumber daya : Perubahan yang dilakukan oleh satu thread untuk berbagi sumber daya sistem (seperti menutup file) akan dilihat oleh semua thread lainnya. Dua pointer yang menunjuk nilai yang sama untuk data yang sama. Membaca dan menulis ke lokasi memori yang sama adalah mungkin, dan karena itu membutuhkan sinkronisasi eksplisit oleh programmer.

b. POSIXThread Apa yang dimaksud dengan pthreads? Secara historis, vendor perangkat keras telah menerapkan thread dengan versi milik mereka sendiri. Implementasi ini berbeda secara substansial dari satu sama

lain sehingga sulit bagi programmer untuk mengembangkan aplikasi threaded portabel.

Dalam rangka untuk mengambil keuntungan penuh dari kemampuan yang disediakan oleh thread, antarmuka pemrograman yang standar diperlukan. Untuk sistem UNIX, interface ini telah ditetapkan oleh IEEE POSIX 1003.1c standar (1995). Implementasi mengikuti standar ini disebut sebagai thread POSIX, atau pthreads. Kebanyakan vendor hardware sekarang menawarkan pthreads di samping APImilik mereka. Standar pthreads. POSIX terus berkembang dan mengalami revisi, termasuk spesifikasi

Beberapa link yang dapat membantu : http://standards.ieee.org/findstds/standard/1003.1-2008.html http://www.opengroup.org/austin/papers/posix_faq.html http://www.unix.org/version3/ieee_std.html

Pthreads didefinisikan sebagai satu set jenis bahasa pemrograman C dan procedur call, yang diimplementasikan dengan header pthread.h /termasuk juga file dan library dari thread meskipun pada beberapa implementasi library ini dapat menjadi bagian dari library lain, seperti libc. Mengapa POSIXThread? Motivasi

utama untuk menggunakan pthreads adalah peningkatan potensial kinerja program.

untuk menyadari

Bila dibandingkan dengan biaya untuk menciptakan dan mengelola proses, thread dapat dibuat dengan overhead sistem operasi jauh lebih sedikit. Mengelola thread membutuhkan sumber daya sistem yang lebih sedikit daripada mengelola proses. Sebagai contoh, tabel berikut ini membandingkan hasil waktu untuk subrutin fork () dan subrutin pthread_create (). Waktu menunjukkan 50.000 proses / pembuatan thread, dilakukan dengan utilitas waktu, dan unit yang dalam hitungan detik, tidak ada optimasi flag. Catatan: jangan mengharapkan waktu Sytem dan pengguna untuk menambahkan hingga real time, karena ini adalah sistem SMP dengan beberapa CPU bekerja pada masalah pada waktu yang sama. Yang terbaik, perkiraan dijalankan pada mesin lokal, masa lalu dan sekarang.

Semua thread dalam proses berbagi alamat yang sama. Komunikasi antarthread lebih efisien dan dalam banyak kasus, lebih mudah digunakan daripada antarproses komunikasi. Aplikasi threaded menawarkan peningkatan kinerja potensial dan keuntungan praktis dari non-threaded aplikasi dalam beberapa cara lain: Overlapping pekerjaan CPU dengan I / O: Sebagai contoh, sebuah program mungkin memiliki bagian dimana ia melakukan operasi I/O yang lama. Sementara satu thread sedang menunggu panggilan sistem I/ O untuk menyelesaikannya, CPU bekerja intensif dapat dilakukan oleh thread lain.

Penjadwalan prioritas / real-time : tugas-tugas yang lebih penting dapat dijadwalkan untuk menggantikan atau menghentikan tugas-tugas prioritas yang lebih rendah. Penanganan event Asynchronous: tugas-tugas dimana layanan peristiwa tak tentu frekuensinya dan durasi dapat disisipkan. Sebagai contoh, server web dapat baik mentransfer data dari permintaan sebelumnya dan mengelola kedatangan permintaan baru.

Motivasi utama untuk mempertimbangkan penggunaan pthreads pada arsitektur SMP adalah untuk mencapai kinerja yang optimal. Secara khusus, jika aplikasi menggunakan MPI untuk on-node komunikasi, ada potensi bahwa kinerja dapat sangat ditingkatkan dengan menggunakan pthreads untuk on-node transfer data sebagai gantinya. Sebagai contoh: Library MPI biasanya mengimplementasikan on-Node tugas komunikasi melalui shared memory, yang melibatkan setidaknya satu memori operasi copy (proses ke proses). Untuk Untuk pthreads tidak ada perantara memori copy diperlukan karena thread berbagi ruang alamat yang sama dalam proses tunggal. Tidak ada transfer data, per se. Ini menjadi lebih dari cache-ke-CPU atau memori-ke-CPU bandwidth (situasi terburuk). Kecepatan ini jauh lebih tinggi. Beberapa perbandingan lokal ditunjukkan di bawah ini:

Merancang Program Thread Pemrograman Paralel: Pada modern ini, mesin multi-cpu, pthreads secara ideal cocok untuk pemrograman paralel, dan apa pun yang berlaku untuk pemrograman paralel pada umumnya,berlaku untuk program pthreads paralel. Ada banyak pertimbangan untuk merancang program paralel, seperti:

Apa jenis model pemrograman paralel yang digunakan? Masalah partisi Load Balancing Komunikasi Ketergantungan data Sinkronisasi dan kondisi Masalah memori Masalah I/O Kompleksitas program Programmer usaha/biaya/waktu

Secara umum meskipun, dalam rangka bagi program untuk mengambil keuntungan dari pthreads, itu harus dapat diatur dalam diskrit, tugas independen yang dapat mengeksekusi secara bersamaan. Misalnya, jika routine1 dan routine2 dapat dipertukarkan, disisipkan dan / atau tumpang tindih dalam waktu nyata, mereka adalah kandidat untuk threading.

Program memiliki karakteristik berikut mungkin cocok untuk pthreads: Pekerjaan yang dapat dieksekusi, atau data yang dapat dioperasikan, dengan tugas-tugas secara bersamaan Pemblokiran berpotensi menunggu lama I / O Banyak menggunakan siklus CPU di beberapa tempat tetapi tidak yang lain Harus merespon kejadian yang asinkronus Beberapa pekerjaan lebih penting daripada pekerjaan lain (interupsi prioritas)

Pthread juga dapat digunakan untuk aplikasi serial, untuk meniru eksekusi paralel.Sebuah contoh sempurna adalah browser web yang khas, yang bagi kebanyakan orang, berjalan pada sebuah mesin

desktop / laptop CPU tunggal. Banyak hal yang bisa "muncul" untuk terjadi pada waktu yang sama. Beberapa model umum untuk program thread ada: Manajer / pekerja: thread tunggal, manajer menugaskan bekerja untuk thread lain, para pekerja. Biasanya, manajer menangani semua input dan paket pekerjaan dengan tugas-tugas lainnya. Setidaknya dua bentuk model manajer / pekerja yang umum: pekerja statis dan pekerja dinamis. Pipeline: tugas dipecah menjadi serangkaian sub operasi, yang masing-masing ditangani secara seri, namun secara bersamaan, oleh thread yang berbeda. Peer: mirip dengan model manajer / pekerja, tapi setelah thread utama menciptakan thread lain, ia berpartisipasi dalam pekerjaan.

Model Shared Memory Semua thread memiliki akses global yang sama, memori bersama Thread juga memiliki data privasi mereka sendiri Programmer bertanggung jawab untuk akses sinkronisasi (melindungi) data bersama secara global .

Thread yang aman: Thread-Safeness: singkatnya, mengacu kemampuan aplikasi untuk menjalankan beberapa thread secara bersamaan tanpa "clobbering" data bersama atau menciptakan kondisi "race".

Sebagai contoh, anggaplah bahwa aplikasi Anda membuat beberapa thread,masingmasing yang membuat panggilan ke rutinitas library yang sama: Routine library ini mengakses / memodifikasi struktur global atau lokasi dalam memori. Seperti setiap thread panggilan routine ini adalah mungkin bahwa mereka dapat mencoba untuk memodifikasi struktur lokasi / memori global pada saat yang sama. Jika routine tidak mempekerjakan semacam sinkronisasi konstruksi untuk mencegah kerusakan data, maka tidak thread-safe.

Implikasi bagi pengguna routine library eksternal adalah bahwa jika Anda tidak100% yakin routine adalah thread-aman, maka Anda mengambil risiko Anda denganmasalah yang bisa timbul. Rekomendasi: Berhati-hatilah jika aplikasi Anda menggunakan library atau hal lain yang tidak secara eksplisit menjamin thread-aman. Jika ragu, menganggap bahwa mereka tidak thread-aman sampai terbukti sebaliknya. Hal ini dapat dilakukan dengan "serialisasi" panggilan ke routine pasti, dll 2. POSIXTHREAD API P threads API asli didefinisikan dalam ANSI / IEEE POSIX 1003,1-1995 standar. Standar POSIX terus berkembang dan mengalami revisi, termasukspesifikasi pthreads. Salinan standar dapat dibeli dari IEEE atau didownload secara gratis dari situsonline lainnya. Subrutin yang terdiri dari pthreads API secara informal dapat dikelompokkan menjadi empat kelompok besar : 1. Thread manajemen: Rutinitas yang bekerja secara langsung pada thread menciptakan, memisahkan, menggabung, dll Mereka juga termasuk fungsi untuk mengatur / query atribut Thread (penggabungan, penjadwalan dll) 2. Mutexes: Rutinitas yang berhubungan dengan sinkronisasi, yang disebut "mutex", yang merupakan singkatan untuk "mutual exclusion". Mutex menyediakan fungsi untuk menciptakan, menghancurkan, mengunci dan membuka mutexes. Ini dilengkapi dengan fungsi atribut mutex yang mengatur atau memodifikasi atribut yang berhubungan dengan mutexes.

3. Kondisi variable: Rutinitas yang membahas komunikasi antara thread yang berbagi mutex. Berdasarkan kondisi programmer tertentu. Kelompok ini termasuk fungsiuntuk menciptakan, menghancurkan,,menunggu dan sinyal berdasarkan nilainilaivariabel ditetapkan. Fungsi untuk mengatur / queri atribut variabel kondisi juga disertakan. 4. Sinkronisasi: Rutinitas yang mengelola membaca / menulis kunci dan kendala. Konversi penamaan: Semua pengidentifikasi di library thread dimulai dengan pthread_. Beberapa contoh ditunjukkan di bawah ini.

Konsep objek buram meliputi desain API. Panggilan dasar bekerja untuk membuat atau memodifikasi objek buram objek buram dapat dimodifikasi oleh panggilan ke fungsi atribut, yang berhubungan dengan atribut buram. (buram : opaque) Pthreads API berisi sekitar 100 subrutin. Untuk portabilitas, file header pthread.h harus dimasukkan dalam setiap file source menggunakan library pthreads. POSIX standar saat ini didefinisikan hanya untuk bahasa C. Beberapa compiler Fortran (seperti IBM AIX Fortran) dapat memberikan Fortram pthreads API. 3. COMPILING THREADED PROGRAMS Beberapa contoh dari perintah compile yang digunakan untuk pemrograman menggunakan posix thread:

4. MANAJEMEN THREAD a. Creating and Terminating Threads Routines pthread_create (thread,attr,start_routine,arg) pthread_exit (status) pthread_cancel (thread) pthread_attr_init (attr) pthread_attr_destroy (attr)

Membuat Thread Main program terdiri dari thread standar tunggal yang bersifat eksplisit. pthread_create membuat thread baru dan mengeksekusinya. Variable ini dapat dipanggil beberapa kali dari program itu sendiri. Beberapa argumen pthread_create: Thread : merupakan pengenal, identitas unik dari tiap thread baru. Attr : sebuah objek atribut yang dapat digunakan untuk mengatur atribut thread. Anda dapat menentukan objek thread atribut, atau NULL untuk nilai default. Start routine : rutinitas C yang akan dieksekusi oleh thread setelah dibuat. Arg : sebuah argumen tunggal yang dapat dilewatkan ke start_routine. Ini harus dilalui oleh referensi sebagai cast pointer bertipe void. NULL dapat digunakan jika tidak ada argumen yang akan lewat.

Atribut Thread Secara default, thread dibuat dengan atribut tertentu. Beberapa atribut ini dapat diubah oleh programmer melalui atribut objek thread. pthread_attr_init dan pthread_attr_destroy digunakan untuk menginisialisasi / menghancurkan objek atribut thread. Rutinitas lainnya kemudian digunakan untuk query / mengatur

atribut tertentu dalam atribut objek thread. Atribut meliputi: state terpisah atau tergabung, penjadwalan warisan, penjadwalan kebijakan, penjadwalan parameter, Penjadwalan contention scope, ukuran, alamat, dan ukuran overflow tumpukan. Thread Binding dan Scheduling API pthreads menyediakan beberapa rutinitas yang dapat digunakan untuk menentukan bagaimana thread yang dijadwalkan untuk dieksekusi. Sebagai contoh, thread dapat dijadwalkan untuk menjalankan FIFO (first in first-out), RR (roundrobin) atau lainnya (ditentukan oleh sistem operasi). Hal ini juga menyediakan kemampuan untuk menetapkan nilai prioritas penjadwalan thread. API pthreads tidak menyediakan routine untuk mengikat thread CPU tertentu/core. Namun, implementasi lokal dapat menyertakan fungsi - seperti menyediakan rutin pthread_setaffinity_np non-standar. Perhatikan bahwa "_np" merupakan singkatan untuk "non-portabel". Sistem operasi local juga dapat memberikan cara untuk melakukan ini. Sebagai contoh, Linux menyediakan rutin sched_setaffinity. Terminating Thread dan phtread_exit() Ada beberapa cara di mana sebuah thread dapat dihentikan: Thread kembali normal dari rutinitas awalnya. Pekerjaannya telah dilakukan. Thread membuat panggilan ke subrutin pthread_exit - apakah pekerjaan dilakukan atau tidak. Thread dibatalkan oleh thread lain melalui pthread_cancel. Seluruh proses dihentikan karena membuat panggilan ke salah satu exec () atau exit () Jika main () selesai pertama, tanpa menyebut secara eksplisit sendiri pthread_exit pthread_exit () memungkinkan programmer untuk menentukan parameter terminasi status opsional. Parameter opsional ini biasanya kembali ke thread bergabung dengan thread yang dihentikan. Di subrutin yang dijalankan normal, Anda dapat membuang dengan panggilan pthread_exit ().Pembersihan: pthread_exit ()tidak dekat dengan file; setiap file yang dibuka di thread akan tetap buka setelah thread diakhiri. Ada masalah pasti jika main () selesai sebelum thread yang melahirkan jika Anda tidak memanggil pthread_exit () secara eksplisit. Semua thread yang dibuat akan diakhiri karena main () dilakukan dan tidak ada lagi untuk mendukung thread. Dengan memiliki main () secara eksplisit menyebut pthread_exit () sebagai hal terakhir itu, main () akan memblokir dan tetap hidup untuk mendukung thread yang dibuat sampai mereka selesai dieksekusi. Contoh code: Pthread Creation and Termination

b. Passing Arguments to Threads pthread_create () rutin memungkinkan programmer untuk meluluskan satu argumen ke rutinitas untuk memulai thread. Untuk kasus di mana beberapa argumen harus dilalui, keterbatasan ini mudah diatasi dengan menciptakan suatu struktur yang berisi semua argumen, dan kemudian melewati sebuah pointer ke struktur yang di eksekusi dengan pthread_create (). Semua argumen harus dilalui oleh referensi dan cast ke tipe void. Contoh fragmen kode yang menunjukkan bagaimana untuk meloloskan sebuah integer sederhana untuk setiap thread. Thread yang dipanggil menggunakan struktur data yang unik untuk setiap thread, menjamin bahwa setiap argumen thread tetap utuh pada keseluruhan program.

Contoh ini menunjukkan bagaimana setup beberapa argumen melalui struktur. Setiap thread menerima contoh unik dari struktur.

Contoh argumen yang lewat salah. Ini melewati alamat variabel t, yang berbagi ruang memori dan terlihat oleh semua thread. Sebagai iterates loop, nilai lokasi memorinya berubah, mungkin sebelum thread yang dibuat dapat mengaksesnya.

c. Joining and Detaching Threads Joining, adalah salah satu cara untuk mencapai sinkronisasi antara thread. Contoh:

Keterangan: Subroutine pthread_joins() menghalang thread pemanggil sampai thread threadid yang ditentukan selesai. Programmer dapat memperoleh thread target pemutusan kembali status jika berada di thread target pemanggilan ke pthread_exit(). Penggabungan thread dapat mencocokkan satu pemanggilan pthread_join(). Ini adalah kesalahan logis untuk mencoba menggabungkan beberapa thread yang sama. Kondisi dimana thread dapat digabung atau tidak: Ketika sebuah thread dibuat, salah satu atribut mendefinisikan apakah itu joinable atau detached. Hanya thread yang diciptakan sebagai joinable dapat digabungkan. Jika suatu thread dibuat sebagai detached, maka thread tersebut tidak akan pernah bisa digabung. Draft akhir dari standar POSIX menentukan bahwa thread harus diciptakan sebagai joinable. Untuk membuat thread secara eksplisit sebagai joinable atau detached, argumen attr di routine pthread_create()digunakan. Terdapat 4 proses khusus: 1. Deklarasi sebuah variabel atribut pthread dari data tipe pthread_attr_t 2. Inisialisasi variabel atribut tersebut dengan pthread_attr_init() 3. Atur status atribut detached dengan pthread_attr_setdetachstate() 4. Setelah selesai, lepaskan library resources yang digunakan oleh atribut dengan pthread_attr_destroy() Detaching Routine pthread_detach()dapat digunakan secara eksplisit untuk memisahkan thread meskipun thread tersebut dibuat sebagai joinable. Tidak ada routine yang berlawanan. Rekomendasi Jika sebuah thread membutuhkan penggabungan, pertimbangkan secara eksplisit untuk membuatnya sebagai joinable. Hal ini menyediakan portabilitas karena tidak semua implementasi dapat menciptakan thread sebagai joinable secara default. Jika kamu tahu keuntungan bahwa sebuah thread tidak akan pernah membutuhkan penggabungan dengan thread yang lain, pertimbangkan untuk

membuatnya sebagai state yang detached. Beberapa sumber sistem mungkin dapat dibebaskan. d. Stack Management Mencegah masalah stack Standar POSIX tidak menentukan ukuran dari thread stack. Ini ada implementasi bergantung dan bervariasi. Melebihi batas default stack biasanya sangat mudah dilakukan, dengan hasil yang biasa: Program penghentian dan/atau data rusak. Program yang aman dan portabel tidak bergantung pada batas standar stack, tetapi sebaliknya, secara eksplisit mengalokasikan cukup stack untuk thread masing-masing dengan menggunakan routine pthread_attr_setstacksize. Routine pthread_attr_getstackaddr dan pthread_attr_setstackaddr dapat digunakan oleh aplikasi di sebuah lingkungan dimana stack untuk thread harus ditempatkan di beberapa wilayah tertentu dari memori. Beberapa contoh di LC Standar ukuran thread stack sangat bervariasi. Ukuran maksimum yang dapat diperoleh juga sangat bervariasi, dan mungkin tergantung pada jumlah thread per node. Arsitektur baik dulu dan sekarang ditampilkan untuk menunjukkan variasi yang luas dalam ukuran default thread stack.

e. Miscellaneous Routines
pthread_self () pthread_equal (thread1,thread2)

pthread_self mengembalikan keunikan, sistem ditugaskan thread ID dari thread pemanggil pthread_equal membandingkan 2 thread ID. Jika kedua ID yang berbeda 0 dikembalikan, sebaliknya selain nol dikembalikan. Catatan bahwa kedua routine tersebut, objek dari thread identifier adalah buram dan tidak dapat secara mudah diperiksa. Karena thread ID adalah objek yang buram,operator bahasa C setara == tidak boleh digunakan untuk membandingkan 2

thread ID terhadap satu sama lain, atau untuk membandingkan sebuah thread ID tunggal terhadap nilai yang lain.
pthread_once (once_control, init_routine)

pthread_once mengeksekusi init_routine tepat satu kali di sebuah proses. Pemanggilan pertama ke routine ini oleh setiap proses mengeksekusi init_routine, tanpa parameter. Setiap pemanggilan berikutnya tidak akan terpengaruh Routine init_routine biasanya adalah sebuah routine inisialisasi. Parameter once_control adalah sebuah struktur kontrol sinkoronisasi yang membutuhkan inisialisasi sebelum memanggil pthread_once. Contoh: pthread_once_t once_control=PTHREAD_ONCE_INIT; 5. VARIABEL MUTEX a. Variabel Mutex Mutex (Mutual exclusion) adalah variabel primer dalam mengimplementasikan synchronozation thread dan untuk melindungi share data ketika multiple write terjadi. Variable mutex bertindak sebagai kunci yang melindungi akses untuk share data resource. Konsep dasar dari penggunaan mutex dalam Pthread yaitu hanya satu thread yang dapat mengunci(memiliki) variabel mutex pada waktu tertentu. Dengan demikian, hanya satu thread yang dapat sukses dijalankan sampai mutex tersebut unlock. Mutex Mutex dapat mencegah kondisi race. Salah satu contoh kondisi race yaitu pada transaksi bank. Langkah-langkah dalam menggunakan variable mutex: 1. Buat dan menginisialisasi sebuah variabel mutex. 2. Beberapa thread berusaha mengunci mutex. 3. Hanya satu yang berhasil dan thread tersebut yang memiliki mutex. 4. Pemilik thread melakukan set action. 5. Pemilik melakukan unlock terhadap mutex. 6. Thread lainnya membutuhkan mutex dan mengulangi prosesnya 7. Akhirnya mutex destroyed.

Ketika melindungi share data, programmer harus yakin bahwa thread membutuhkan mutex. Contohnya, jika terdapat 4 thread yang mengupdat data yang sama, tetapi hanya satu yang menggunakan mutex, maka data akan corrupted. b. Creating and Destroying Mutexes Routines: pthread_mutex_init (mutex,attr)

pthread_mutex_destroy (mutex) pthread_mutexattr_init (attr) pthread_mutexattr_destroy (attr) Penggunaan: Variable mutex harus dideklarasikan dengan type pthread_mutex_t, dan harus diinisialisasi sebelum digunakan. Ada dua cara menginisialisasi variabel mutex: 1. secara static, ketika dideklarasikan. Contohnya: pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER; 2. secara dinamic, dengan routine pthread_mutex_init(). Metode ini membutuhkan izin setting dari objek attribute, attr. Mutex diinisialisasi unlocked.

Objek attr digunakan untuk menetapkan sifat objek mutex, dan harus bertipe pthread_mutexattr_t jika digunakan. Pthread standar mendefinisikan tiga opsional atribut mutex:

Routin

pthread_mutexattr_init() dan pthread_mutexattr_destroy() digunakan untuk membuat dan memusnahkan objek atribut mutex masing-masing.

pthread_mutex_destroy() seharusnya digunakan untuk objek mutex yang tidak


terlalu lama. c. Locking and Unlocking Mutexes Routines: pthread_mutex_lock (mutex) pthread_mutex_trylock (mutex) pthread_mutex_unlock (mutex) Penggunaan: Routines pthread_mutex_lock() digunakan oleh thread untuk mengunci variabel mutex. Jika mutex sedang dikunci oleh thread lain, pemanggilan routine ini akan diblok sampai mutex unlock. pthread_mutex_trylock() akan berusaha untuk mengunci mutex. Namun, jika mutex sudah terkunci, routine ini akan segera kembali busy dengan error code. Routine ini mungkin berguna dalam mencegah deadlock. pthread_mutex_unlock() akan melakukan unlock mutex jika dipanggil oleh thread pemilik. Pemanggilan routin ini dibutuhkan setelah thread menyelesaikan penggunaan memproteksi data jika thread lain membutuhkan mutex untuk operasinya dalam memproteksi data. Eror akan terjadi jika:

Mutex telah unlock. Jika mutex dimiliki oleh thread lain.

6. VARIABEL KONDISI a. Variable Kondisi Condition variable menyediakan cara lain untuk menyinkronkan thread. Sementara mutexes mengimplementasikan sinkronisasi oleh pengaturan thread dalam mengakses data, condition variable memungkinkan thread untuk menyinkronkan berdasarkan nilai data actual. Tanpa condition variable, programmer membutuhkan thread yang terus-menerus melakukan polling (mungkin di dalam critical section), untuk memeriksa apakah kondisi ini terpenuhi. Hal ini dapat memakan banyak sumber daya karena thread akan terus sibuk dalam melakukan aktivitas ini. Condition variable adalah sebuah cara untuk mencapai tujuan yang sama tanpa harus melakukan polling. Sebuah condition variable selalu digunakan bersama dengan sebuah kunci mutex. Representasi penggunaan condition variable, adalah sebagai berikut: Main Thread Deklarasi dan inisialisasi variable global yang meminta sinkronisasi. Deklarasi dan inisialisasi objek condition variable. Deklarasi dan inisialisasi sebuah mutex yang terkait. Buat thread A dan B Thread A Thread B Apakah thread A bekerja sampai - Melakukan pekerjaan ke titik dimana kondisi tertentu harus terjadi. Kunci mutex yang terkait dan - Mengunci mutek terkait. periksa nilai dari variable global. - Ubah nilai variable global yang Panggil pthread_cond_wait() untuk melakukan blocking wait ditunggu Thread A. sinyal dari thread B. perhatikan bahwa panggilan untuk pthread_cond_wait() secara otomatis membuka kunci variable mutex yang terkait, sehingga dapat digunakan oleh thread B. Saat pemberian sinyal/isyarat, - Periksa nilai variable global mutex secara otomatis unlocked. yang ditunggu Secara eksplisit membuka mutex. - Unlock mutex. Continue. - Continue. Main Thread Join/ Continue

b. Creating and Destroying Condition Variables Routines: pthread cond init (condition, attr) pthread cond destroy (condition)

pthread condattr init (attr) pthread condattr destroy (attr) Penggunaan: Condition variable harus dideklarasikan dengan tipe pthread_cond_t, dan harus diinisialisasi sebelum digunakan. Ada dua cara untuk menginisialisasi condition variable: 1. Static, saat dideklarasikan. Contoh: phtread_cond_t myconvar = PTHREAD_COND_INITIALIZER; 2. Dinamis, dengan rutine phtread_cond_init(). ID dari condition variable yang dibuat dikembalikan untuk memanggil thread melewati condition parameter. Method ini memungkinkan pengaturan atribut objek condition variable, attr. Objek attr opsional digunakan untuk mengatur atribut condition variable. Hanya ada satu atribut yang didefinisikan untuk condition variable: process-shared, yang memungkinkan condition variable untuk dapat dilihat oleh thread dalam proses lainnya.objek atribut, jika digunakan, harus dari tipe phtread_condattr_t (dapat dispesifikasikan sebagai NULL untuk menerima default). Catatan: tidak semua implementasi menyediakan process-shared atribut. Routine phtread_condattr_init() dan phtread_condattr_destroy() digunakan untuk membuat dan menghapus objek atribut condition variable. phtread_cond_destroy() harus digunakan untuk membebaskan condition variable yang sudah tidak diperlukan lagi. c. Waiting and Signaling on Condition Variables Routines: phtread cond wait (condition, mutex) phtread cond signal (condition) phtread cond broadcast (condition)

Penggunaan: pthread_cond_wait() mengeblok panggilan thread samapi kondisi tertentu mendapat sinyal. Routine ini harus dipanggil selama mutex terkunci, dan secara otomatis akan merilis mutex selama mutex menunggu. Setelah sinyal diterima dan thread sadar, mutex akan secara otomatis dikunci untuk digunakan oleh thread. Programmer kemudian bertanggung jawab untuk membuka mutex saat thread sudah selesai menggunakannya. Routine phtread_cond_signal() digunakan untuk memberikan tanda thread yang lain yang menunggu di condition variable. Routine ini harus dipanggil setelah mutex dikunci, dan harus membuka mutex agar routine phtread_cond_wait() terpenuhi.

Routine phtread_cond_broadcast()harus digunakan sebagai ganti phtread_cond_signal() jika lebih dari satu thread sedang dalam blocking state. Sebuah logical error memanggil phtread_cond_signal() sebelum memanggil phtread_cond_wait(). Locking dan unlocking mutex terkait yang tepat penting saat pemanggilan routine ini.

7. LLNL SPESIFIC INFORMATION AND RECOMMENDATIONS Implementasi Semua sistem produksi LC mencakup pelaksanaan pthreads yang mengikuti rancangan 10 (akhir) dari standar POSIX. Implementasi berbeda dalam jumlah maksimum thread yang dapat menciptakan sebuah proses. Mereka juga berbeda dalam jumlah default dari thread ruang stack. Kompilasi LC mempertahankan beberapa compiler, dan versi yang berbeda biasanya beberapa dari masing-masing - lihat halaman didukung LC yang Compiler web. Perintah Compiler dijelaskan dalam Program Threaded Kompilasi bagian berlaku untuk sistem LC. Mixing MPI dengan phtreads: Ini adalah alasan utama untuk menggunakan pthreads di LC. Desain: o Setiap proses MPI biasanya menciptakan dan kemudian mengelola thread N, dimana N membuat penggunaan terbaik dari CPU yang tersedia / node. o Menemukan nilai terbaik untuk N akan bervariasi dengan platform dan karakteristik aplikasi Anda. o Untuk sistem IBM SP dengan dua adapter komunikasi per node, mungkin terbukti lebih efisien untuk menggunakan dua (atau lebih) tugas MPI per node. o Secara umum, mungkin ada masalah jika beberapa thread melakukan panggilan MPI. Program ini mungkin gagal atau berperilaku tak terduga. Jika MPI panggilan harus dibuat dari dalam sebuah thread, mereka harus dibuat hanya oleh satu thread. Kompilasi: o Menggunakan perintah MPI kompilasi yang sesuai untuk platform dan bahasa pilihan. o Pastikan untuk menyertakan bendera pthreads diperlukan seperti yang ditunjukkan dalam bagian Program Kompilasi Threaded. Sebuah contoh kode yang menggunakan kedua MPI dan pthreads tersedia di bawah ini. Serial, thread, MPI dan MPI-dengan-thread versi menunjukkan satu perkembangan yang mungkin.

8. CONTOH PROGRAM DENGAN POSIXTHREAD a. Merger Sort dengan POSIXThread b. Contoh Program 2

Anda mungkin juga menyukai