ORGANISASI KOMPUTER DAN SISTEM OPERASI
PROGRAM THREAD
Disusun Oleh Kelompok B :
MUHAMAD ICHSAN G (064001600023)
DIMAS ADI PRATAMA (064001600003)
Teknik Informatika
Fakultas Teknologi Industri
Universitas Trisakti
Jakarta – Indonesia
2017
Tujuan
Laporan ini dibuat untuk menyelesaikan praktikum sebelas matakuliah Organisasi computer dan Sistem Operasi. Selain itu, hal ini juga beguna sebagai panduan umum penggunaan fungsi thread terminal pada operasi sistem linux.
Teori Percobaan
Ketika pertama kali dikembangkan, Linux tidak didukung dengan threading di dalam kernelnya, tetapi dia mendukung proses-proses sebagai entitas yang dapat dijadwalkan melalui clone() system calls. Sekarang Linux mendukung penduplikasian proses menggunakan system call clone() dan fork(). Clone() mempunyai sifat mirip dengan fork(), kecuali dalam hal pembuatan copy dari proses yang dipanggil dimana ia membuat sebuah proses yang terpisah yang berbagi address space dengan proses yang dipanggil. Pembagian address space dari parent processmemungkinkan cloned task bersifat mirip dengan thread yang terpisah. Pembagianaddress space ini dimungkinkan karena proses direpresentasikan di dalam Kernel Linux. Di dalam Kernel Linux setiap proses direpresentasikan sebagai sebuah struktur data yang unik. Jadi, daripada menciptakan yang baru maka struktur data yang baru mengandung pointer yang menunjuk ke tempat dimana data berada. Jadi ketika fork() dipanggil, proses yang baru akan tercipta beserta duplikasi dari segala isi di struktur data di parent process, namun ketika clone() dipanggil, ia tidak menduplikasi parent processnya tetapi menciptakan pointer ke struktur data padaparent process yang memungkinkan child process untuk berbagi memori dan sumber daya dari parent processnya. Project LinuxThread menggunakan system call ini untuk mensimulasi thread di user space. Sayangnya, pendekatan ini mempunyai beberapa kekurangan, khusunya di area signal handling, scheduling, dan interprocess synchronization primitive.
Untuk meningkatkan kemampuan Thread Linux, dukungan kernel dan penulisan ulang pustaka thread sangat diperlukan. Dua project yang saling bersaing menjawab tantangan ini. Sebuah tim yang terdiri dari pengembang dari IBM membuat NGPT (Next Generation POSIX Threads). Sementara pengembang dariRed Hat membuat NPTL (Native POSIX Thread Library).Sebenarnya Linux tidak membedakan antara proses dan thread. Dalam kenyataannya, Linux lebih menggunakan istilah task dibandingkan proses dan thread ketika merujuk kepada pengaturan alur pengontrolan di dalam program.
CARA PERCOBAAN
Buka terminal pada Linux
Buka file yang sudah dibuat dengan cara tulis nano threadtm2.c
Tulis sourcodenya seperti gambar berikut
#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
/*
Struktur dibawah ini mengandung informasi yang dibutuhkan untuk mengakses fungsi dotprod untuk mengakses data yang diinputnya dan menaruh outputnya kedalam struktur.
Struktur ini tidak berubah dari bentuk sekuensial. Program ini adalah program thread yang mengeluarkan output dari variabel mutexnya
*/
typedef struct
{
double *a;
double *b;
double sum;
int veclen;
} DOTDATA;
/* Mendefinisikan variabel yang bisa diakses secara global atau member variabel dan jg mutex*/
#define NUMTHRDS 10
#define VECLEN 1000
DOTDATA dotstr;
pthread_t callThd[NUMTHRDS];
pthread_mutex_t mutexsum;
/*
Fungsi dotprod diaktifkan ketika thread itu telah dibuat.
Seperti sebelumnya, semuainput untuk rutin ini diperoleh dari struktur dengan tipe DOTDATA dan semua output dari fungsi ini ditulis kedalam struktur ini. Keuntungan dari keluaran ini adalah bagi program multithread: ketika thread dibuat kita melewati satu argumen untuk fungsi yg diaktifkan biasanya argumen ini adalah angka thread. Semua informasi lainnya yang dibutuhkan oleh fungsi diakses dari struktur global.
*/
void *dotprod(void *arg)
{
/* Mendefinisikan dan menggunakan local variabel demi kemudahan*/
int i, start, end, len ;
long offset;
double mysum, *x, *y;
offset = (long)arg;
len = dotstr.veclen;
start = offset*len;
end = start + len;
x = dotstr.a;
y = dotstr.b;
/*
Perform the dot product and assign result
to the appropriate variable in the structure.
*/
mysum = 0;
for (i=start; i<end ; i++)
{
mysum += (x[i] * y[i]);
}
/*
Lock a mutex prior to updating the value in the shared
structure, and unlock it upon updating.
*/
pthread_mutex_lock (&mutexsum);
dotstr.sum += mysum;
printf("Thread bagian %ld melakukan %d untuk %d=\nJumlah=%f\nTotal=%f\n\n",offset,start,end,mysum,dotstr.sum);
pthread_mutex_unlock (&mutexsum);
pthread_exit((void*) 0);
}
/*
The main program creates threads which do all the work and then
print out result upon completion. Before creating the threads,
The input data is created. Since all threads update a shared structure, we
need a mutex for mutual exclusion. The main thread needs to wait for
all threads to complete, it waits for each one of the threads. We specify
a thread attribute value that allow the main thread to join with the
threads it creates. Note also that we free up handles when they are
no longer needed.
*/
int main (int argc, char *argv[])
{
long i;
double *a, *b;
void *status;
pthread_attr_t attr;
/* Assign storage and initialize values */
a = (double*) malloc (NUMTHRDS*VECLEN*sizeof(double));
b = (double*) malloc (NUMTHRDS*VECLEN*sizeof(double));
for (i=0; i<VECLEN*NUMTHRDS; i++) {
a[i]=1;
b[i]=a[i];
}
dotstr.veclen = VECLEN;
dotstr.a = a;
dotstr.b = b;
dotstr.sum=0;
pthread_mutex_init(&mutexsum, NULL);
/* Buat thread untuk melakukan dotprodak */
pthread_attr_init(&attr);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_JOINABLE);
for(i=0;i<NUMTHRDS;i++)
{
/* Setiap thread bekerja dalam himpunan data yang berbedaEach thread works on a different set of data.
* Offsetnya dispesifikasikan oleh 'i'. Ukuran datanya tiap thread diindikasikan oleh VECLEN
*/
pthread_create(&callThd[i], &attr, dotprod, (void *)i);
}
pthread_attr_destroy(&attr);
/* Tunggu thread lainnya*/
for(i=0;i<NUMTHRDS;i++) {
pthread_join(callThd[i], &status);
}
/* Setelah bergabung, print output hasilnya dan bersihkan.*/
printf ("Sum = %f \n", dotstr.sum);
free (a);
free (b);
pthread_mutex_destroy(&mutexsum);
pthread_exit(NULL);
}
Keluar dari editor dan save
Compile file threadtm2.c
Jalankan thrdcreat1.c
lihat outputnya
Selesai
Data – Data
KESIMPULAN
Thread merupakan sebuah alur kontrol proses yang dapat dijadwalkan pengeksekusiannya oleh sistem operasi. Selanjutnya, bayangkan sebuah program main mempunyai berbagai prosedur (fungsi) dan fungsi-fungsi tersebut dapat dijalankan secara serentak dan atau bebas dijalankan oleh sistem operasi. Dan itulah yang disebut sebagai multithread.