THREAD (PTHREAD)
Sebuah proses dibuat oleh sistem operasi, dan membutuhkan "overhead" yang cukup. Proses
berisi informasi tentang sumber daya program dan status pelaksanaan program, termasuk:
• ID proses, ID grup proses, ID pengguna, dan ID grup
• Lingkungan Hidup
• Direktori kerja.
• Instruksi program
• Mendaftar
• Stack
• Heap
• Deskriptor file
• Tindakan sinyal
• Perpustakaan bersama
• Alat komunikasi antar proses (seperti antrian pesan, pipa, semaphore, atau memori
bersama).
• More about this source textSource text required for additional translation information
PROSES UNIX
PTHREAD
• Secara historis, vendor perangkat keras telah mengimplementasikan versi utas
mereka sendiri. Implementasi ini sangat berbeda satu sama lain sehingga
menyulitkan programmer untuk mengembangkan aplikasi thread portabel. Untuk
memanfaatkan sepenuhnya kemampuan yang disediakan oleh thread, diperlukan
antarmuka pemrograman standar. Untuk sistem UNIX, antarmuka ini telah
ditentukan oleh standar IEEE POSIX 1003.1c (1995). Implementasi yang
mengikuti standar ini disebut sebagai utas POSIX, atau Pthreads.
• Sebagian besar vendor perangkat keras sekarang menawarkan Pthreads selain API
milik mereka. Standar POSIX terus berkembang dan mengalami revisi, termasuk
spesifikasi Pthreads.
• Pthreads didefinisikan sebagai sekumpulan jenis pemograman bahasa C dan
panggilan prosedur, diimplementasikan dengan file header / include pthread.h dan
pustaka utas - meskipun pustaka ini mungkin menjadi bagian dari pustaka lain,
seperti libc, dalam beberapa implementasi.
ALASAN MENGGUNAKAN PTHREAD
1) Ringan
• Jika dibandingkan dengan biaya pembuatan dan pengelolaan
proses, utas dapat dibuat dengan overhead sistem operasi yang
jauh lebih sedikit. Mengelola utas membutuhkan lebih sedikit
sumber daya sistem daripada mengelola proses.
• Misalnya, tabel berikut membandingkan hasil pengaturan
waktu untuk subrutin fork () dan subrutin pthread_create ().
Pengaturan waktu mencerminkan 50.000 proses / pembuatan
utas, dilakukan dengan utilitas waktu, dan unit dalam hitungan
detik, tidak ada tanda pengoptimalan.
2) Komunikasi / Pertukaran Data yang Efisien:
• Motivasi utama untuk mempertimbangkan penggunaan Pthreads dalam
lingkungan komputasi berkinerja tinggi adalah untuk mencapai kinerja
optimal. Secara khusus, jika aplikasi menggunakan MPI untuk komunikasi
on-node, ada potensi kinerja dapat ditingkatkan dengan menggunakan
Pthreads. Perpustakaan MPI biasanya mengimplementasikan komunikasi
tugas pada node melalui memori bersama, yang melibatkan setidaknya satu
operasi penyalinan memori (proses ke proses). Untuk Pthreads tidak
diperlukan salinan memori perantara karena utas berbagi ruang alamat yang
sama dalam satu proses. Tidak ada transfer data. Ini bisa seefisien hanya
meneruskan pointer. Dalam skenario kasus terburuk, komunikasi Pthread
menjadi lebih dari masalah bandwidth cache-to-CPU atau memori-ke-CPU.
Kecepatan ini jauh lebih tinggi daripada komunikasi memori bersama MPI.
Misalnya: beberapa perbandingan lokal, dulu dan sekarang,
PEMROGRAMAN PARALEL
• Pada mesin modern multi-core, pthread sangat cocok untuk pemrograman paralel, dan
apa pun yang berlaku untuk pemrograman paralel secara umum, berlaku untuk program
pthreads paralel.
• Ada banyak pertimbangan untuk mendesain program paralel, seperti:
• Jenis model pemrograman paralel apa yang digunakan?
• Masalah partisi
• Penyeimbang beban
• Komunikasi
• Dependensi data
• Sinkronisasi dan kondisi balapan
• Masalah memori
• Masalah I / O
• Kompleksitas program
• Upaya / biaya / waktu programmer
• Secara umum, agar program dapat memanfaatkan Pthreads, program harus dapat
diatur menjadi tugas-tugas terpisah dan independen yang dapat dijalankan secara
bersamaan. Misalnya, jika routine1 dan routine2 dapat dipertukarkan, disisipkan,
dan / atau tumpang tindih secara real time, mereka adalah kandidat untuk threading.
Program yang memiliki karakteristik berikut mungkin cocok untuk
pthreads:
• Pekerjaan yang dapat dijalankan, atau data yang dapat dioperasikan, dengan
banyak tugas secara bersamaan:
• Blokir untuk kemungkinan I / O menunggu lama
• Gunakan banyak siklus CPU di beberapa tempat tetapi tidak di tempat lain
• Harus menanggapi peristiwa asynchronous
• Beberapa pekerjaan lebih penting daripada pekerjaan lain (interupsi prioritas)
Ada beberapa model umum untuk program berulir:
• Manager / worker: satu thread, manajer menugaskan pekerjaan ke thread lain,
pekerja. Biasanya, manajer menangani semua input dan membagi pekerjaan ke
tugas-tugas lain. Setidaknya ada dua bentuk model manajer / pekerja yang
umum: kumpulan pekerja statis dan kumpulan pekerja dinamis.
• Pipeline: tugas dipecah menjadi serangkaian suboperations, yang masing-
masing ditangani secara seri, tetapi secara bersamaan, oleh thread yang
berbeda. Jalur perakitan mobil paling tepat menggambarkan model ini.
• Peer: mirip dengan model manajer / pekerja, tetapi setelah utas utama
membuat utas lain, utas ini berpartisipasi dalam pekerjaan.
MODEL SHARED MEMORI
• Semua thread memiliki akses ke memori bersama global yang sama. Thread juga
memiliki data pribadinya sendiri. Pemrogram bertanggung jawab untuk
menyinkronkan akses (melindungi) data yang dibagikan secara global.
PTHREAD API
API Pthreads asli didefinisikan dalam standar ANSI / IEEE POSIX 1003.1 - 1995. Standar
POSIX terus berkembang dan mengalami revisi, termasuk spesifikasi Pthreads. Subrutin
yang terdiri dari Pthreads API dapat dikelompokkan secara informal menjadi empat
kelompok utama:
• Manajemen thread: Rutinitas yang bekerja langsung pada utas - membuat, melepaskan,
menggabungkan, dll. Mereka juga menyertakan fungsi untuk mengatur / menanyakan
atribut utas (dapat digabungkan, penjadwalan, dll.)
• Mutexes: Rutinitas yang berhubungan dengan sinkronisasi, disebut "mutex", yang
merupakan singkatan dari "mutual exclusion". Fungsi Mutex menyediakan untuk
membuat, menghancurkan, mengunci, dan membuka kunci mutex. Ini dilengkapi
dengan fungsi atribut mutex yang mengatur atau memodifikasi atribut yang terkait
dengan mutex.
• Variabel kondisi: Rutinitas yang menangani komunikasi antar utas yang berbagi mutex.
Berdasarkan kondisi yang ditentukan programmer. Grup ini mencakup fungsi untuk
membuat, menghancurkan, menunggu dan memberi sinyal berdasarkan nilai variabel
yang ditentukan. Fungsi untuk menyetel / atribut variabel kondisi kueri juga disertakan.
• Sinkronisasi: Rutinitas yang mengelola kunci dan pembatas baca / tulis.
API PTHREAD
#include <pthread.h>
#include <stdio.h>
void *say_hello(void *arg) { printf("Hello!\n");
pthread_exit(NULL);
}
int main()
{
pthread_t T[4];
int i;
// membuat 4 thread yg menjalankan fungsi say_hello
for (i = 0; i < 4; i++)
pthread_create(&T[i], NULL, say_hello, NULL);
for (i = 0; i < 4; i++)
pthread_join(T[i], NULL);
return 0;
}