Anda di halaman 1dari 18

LABORATORIUM PEMBELAJARAN ILMU KOMPUTER

FAKULTAS ILMU KOMPUTER


UNIVERSITAS BRAWIJAYA

NAMA : MUHAMMAD FAZA LAMIK


NIM : 205150207111017
MATERI : PROSES
TANGGAL : 15/03/2021
ASISTEN : -HALIMAH SEPTYA MIKALYA
: -ALDO FRISKA DARMA PUTRA
Modul Praktikum Sistem Operasi
2020/2021

BAB 3

THREAD

3.1. Tujuan Praktikum


Memperkenalkan thread dalam bentuk single thread dan multithread secara sederhana

3.2. Capaian Praktikum


1. Mahasiswa mampu mengenali karakteristik thread
2. Mahasiswa mampu mengenali karakteristik single thread dan multithread

3.3. Dasar Teori


Thread merupakan bagian terkecil dari sebuah proses yang bisa dieksekusi atau
dijalankan. Satu proses bisa mememiliki beberapa thread yang dapat dieksekusi secara
asinkron. Dengan cara asinkron ini, setiap thread dapat menangani pekerjaan atau layanan
tertentu secara independent. Layanan independent ini akan setara dengan hasil eksekusi
seluruh proses dengan lengkap.Pada system operasi modern, thread telah menjadi bagian yang
sangat penting. Jika pada sebuah proses yang berfungsi menerima beberapa masukan secara
real time, akan menghasilkan luaran tertentu
sesuai dengan masing masing masukan yang ada. Tanpa thread, maka proses ini dieksekusi
secara secara sinkron. Dalam proses sinkron eksekusi dilakukan secara berurutan. Kelemahan
dari proses sinkron adalah harus menunggu sampai semua urutan instruksi selesai dieksekusi.
Jika instruksi yang menjalankan satu masukan berlangsung lama, maka instruksi yang
menjalankan masukan yang lain harus menunggu. Untuk mengatasi masalah ini, thread
menjadi pilihan karena dapat menjalankan instruksi secara asinkron.

Perbedaan utama antara proses dan thread adalah sebagai berikut:

Proses Thread
22
Modul Praktikum Sistem Operasi
2020/2021
Pengalamatan TIdak berbagi dengan proses Berbagi dengan thread lain
lain
yang dieksekusi dengan
proses yang memiliki proses
ID yang sama

4
Modul Praktikum Sistem Operasi
2020/2021

Eksekusi dan Sinkronisasi thread diatur


Sinkronisasi Prosesdieksekusi secara oleh proses yang memiliki
independent dan berbeda
antara satu proses dengan thread tersebut
proses yang lain

Context Switch Lebih lama Lebih cepat

Interaksi Interaksi antara dua proses Interaksi bisa lebih mudah


hanya dapat dilakukan dengan karena thread berbagi
komunikasi antar proses sumber daya dengan thread
yang lain seperti memori,
segmen text dan lain lain
Meski thread memiliki kemudahan dan kecepatan yang lebih baik, terdapat beberapa
permasalahan yang mungkin muncul. Diantaranya adalah kemungkinan terjadinya overwrite
data dan isi memori secara keseluruhan jika sebuah thread mengeksekusi aplikasi lain atau
aplikasi baru yang berbeda.
Masalah lain yang mungkin timbul adalah masalah konsistensi data. Kecuali stack, thread
berbagi hampir semua komponen dengan thread yang lain. Eksekusi thread dapat dihentikan
setiap saat (preemptive) pada tahap apapun oleh thread yang lain. Sehingga memungkinkan
variable atau struktur data global yang ada menjadi tidak konsisten. Inkonsistensi data dapat
menyebabkan masalah saat thread yang berbeda mengeksekusi fungsi yang sama dan
menggunakan variable atau struktur data yang sama.

Gambar 3.1. Inkonsistensi Data Karena Penggunaan Thread

3.4. Langkah Praktikum


Praktikum ini dilakukan dengan terlebih dahulu terhubung dengan layanan aws educate
dengan cara mengaktifkan instance dari halaman instance summary. Pilih action dan Start

5
Modul Praktikum Sistem Operasi
2020/2021
untuk mengaktifkan instance. Lakukan koneksi SSH dengan cara yang sama seperti pada Bab
1.

a. Tuliskan kode berikut ini dengan text editor


#include <stdio.h>
#include <pthread.h
>
#include <stdlib.h>

void * thread1()
{
while(1){
printf("Hello!!\n");
}
}

void * thread2()
{
while(1){
printf("How are you?\n");
}
}

int main()
{
int status;
pthread_t tid1,tid2;

pthread_create(&tid1,NULL,thread1,NULL);
pthread_create(&tid2,NULL,thread2,NULL);
pthread_join(tid1,NULL)
;
pthread_join(tid2,NULL)
;
return
0;
}
b. Simpan berkas tersebut dengan nama threadsatu.c
c. Kompilasi program dengan perintah
[admin@host]$ gcc threadsatu.c ±lpthread ±o threadsatu d. Jalankan
program baru tersebut diatas. Tunjukkan tampilan yang ada pada terminal serta berikan
penjelasan singkat dari tampilan tersebut.

e. Tuliskan kode berikut ini


#include <stdio.h>
#include <string.h>
#include
<pthread.h>
#include
<stdlib.h>
#include
<unistd.h>
pthread_t tid[2];
void* doSomeThing(void *arg)
{
unsigned long i = 0;
pthread_t id =

6
Modul Praktikum Sistem Operasi
2020/2021
pthread_self();
if(pthread_equal(id,
tid[0]))
{
printf("\n First thread processing\n");

}
else
{
printf("\n Second thread processing\n");
}
for(i=0; i<(
0xFFFFFFFF);i++);
return NULL;
}

int main(void)
{
int i =
0;
int
err;
while(i < 2)
{
err = pthread_create(&(tid[i]), NULL, &doSomeThing,NULL); if
(err != 0)
printf("\ncan't create thread :[%s]", strer
ror(err)); else
printf("\n Thread created successfully\n");
i++;
}
sleep(5);
return 0;
}

f. Simpan berkas kedua ini dengan nama threaddua.c


g. Kompilasi kode program threaddua.c melalui terminal dengan menuliskan perintah
[admin@host]$ gcc threaddua.c ±lpthread ±o threaddua h. Jalankan
program
baru tersebut diatas. Tunjukkan tampilan yang ada pada terminal serta berikan penjelasan
singkat dari tampilan tersebut.
i. Buka aplikasi terminal yang lain, dan jalankan kedua thread tersebut.
j. Temukan identitas proses (dan mungkin juga thread) yang terkait dengan perintah
eksekusi kedua thread tersebut!

k. Apakah yang bisa dijelaskan dari kedua contoh thread diatas? Apa yang menjadi masalah
utama dalam hal ini?
l. Berikut ini adalah sebuah kode program yang dijalankan secara sekuensial. Dibentuk
menjadi satu proses dengan single thread.
#include <stdlib.h>
#include <stdio.h>

#include <string.h>
static int num_accts = 1024; // number of bank
accounts static int num_trans = 10000; // number of

7
Modul Praktikum Sistem Operasi
2020/2021
transactions static int think_time = 50; // amount
of "thinking time"

struct acct_t {

int bal;

};

/*

* Pointer to accounts

*/
struct acct_t *accts;

8
Modul Praktikum Sistem Operasi
2020/2021

/*
* Method to perform a number oftransactions.
* Parameter "dummy" is not used.
*/
void *transact(void *dummy)
{
int i;
for (i = 0; i < num_trans;i++) {
// pick two random accounts
int acct_id_from = rand() % num_acct
s;
int acct_id_to = rand()% num_accts;
// pick a random amount
int amt = rand() % 100;

// try to transfer the money


if (accts[acct_id_from].bal >mt)
a {
accts[acct_id_from].bal -= t;
am
accts[acct_id_to].bal += amt;

// "thinking time"... don't modify


this code!!
amt *= think_time; while (amt--) ;
}
}
}

int main(int argc, char **argv)


{
// make sure the number of arguments is odd (including
the program name)
if (!(argc == 1 || argc == 3 || argc == 5 || argc
== 7)) {
fprintf(stderr, "usage: %s [-a <accts>] [-i <transactions>]
[-t <think-time>]\n",
argv[0]);
exit(-1);
}

// look at each runtime argument and see which value


it's attempting to set
int i;
for (i = 1; i < argc; i++) {
if (!strcmp(argv[i], "-a"))
{
num_accts = atoi(argv[i+1]);
i++;
} else if (!strcmp(argv[i],"-i")) {
num_trans = atoi(argv[i+1]);
i++;
} else if (!strcmp(argv[i], -t"))
" {
think_time = atoi(argv[i+1]);
i++;
} else {
fprintf(stderr, "usage: %s [-a <accts>] [-i <transactions>]
[-t <think time>]\n",
argv[0]);
exit(-1);
}
}

// display the parameters that will be used for this


test run fprintf(stderr,
"%s: -a %d -i %d -t %d\n", argv[0], num_accts, num_trans,
think_time);

// initialize the random


number generator
srand(1);

// create the bank


accounts
accts = (struct acct_t *)malloc(num_accts
* sizeof(struct acct_t));

9
Modul Praktikum Sistem Operasi
2020/2021

// initialize the bank accounts' values and keep


track of the total sum in all
accounts
int original_sum = 0;
for (i = 0; i < num_accts;+)
i+{
accts[i].bal = rand() % 1000;
original_sum += accts[i].bal;
}

// call the transact function to do


the transfers
transact(NULL);

// find the total sum of all accounts after the


transfers are done
int sum =
0;
for (i = 0; i < num_accts;
i++) {
sum +=
accts[i].bal;
}

// if the sum is not equa


l to the original sum, then
we had a race condition!!
if (sum != original_sum) {
fprintf(stderr, "ERROR! original_sum = %d, sum
%d\n",
= original_sum, sum);
}
else {
fprintf(stderr, "Values are still consistent\n");
}

return 0;
}

m. Kompilasi kode program tersebut dan simpan dengan nama berkas singlethread. n.
Jalankan, tunjukkan dan berikan penjelasan singkat terkait eksekusi program tersebut. o.
Modifikasi kode tersebut menjadi beberapa thread yang berbeda dan simpan dengan nama
berkas
threadtiga.
p. Deskripsikan hasil eksekusi program threadtiga beserta penjelasannya.

3.5. Pembahasan
1. Dari Langkah (a) sampai Langkah (n), jelaskan apa yang anda ketahui tentang:

(a) thread
(b) single thread(c) multi thread
2. Dari Langkah (o) sampai Langkah (p), apa yang anda ketahui dari hasil eksekusi program
ini?
Mengapa demikian dan apa yang menjadi dasar penjelasan anda?

10
Modul Praktikum Sistem Operasi
2020/2021

3.6. Kesimpulan
Tuliskan kesimpulan yang dapat diperoleh dari hasil percobaan ini berdasarkan hasil
pembahasan yang anda buat.

Referensi Source Code


http://www.csc.villanova.edu/~mdamian/threads/posixthreads.html
https://blog.feabhas.com/2016/08/three-nos-sequential-consistency
https://www.cis.upenn.edu/~cdmurphy/cis542/spring2012/homework/lab03-
threads.html http://www.thegeekstuff.com/2012/04/create-threads-in-linux
https://linuxprograms.wordpress.com
http://www.cs.cmu.edu/afs/cs/academic/class/15492-f07/www/pthreads.html

UNTUK DIPERHATIKAN

Setiap selesai melakukan praktikum, jangan lupa menonaktfikan instance agar billing kuota
tidak terus berjalan. Lakukan dengan cara memilih button Action pada Instance Summary. Pilih
Stop sebagai perintah yang harus dijalankan.

11
LABORATORIUM PEMBELAJARAN ILMU KOMPUTER
FAKULTAS ILMU KOMPUTER
UNIVERSITAS BRAWIJAYA

NAMA : MUHAMMAD FAZA LAMIK


NIM : 205150207111017
TUGAS : THREAD
TANGGAL : 15/03/2021

ASISTEN : -HALIMAH SEPTYA MIKALYA


: -ALDO FRISKA DARMA PUTRA

2.5. PEMBAHASAN .
2.5.
a. Tuliskan kode berikut ini dengan text editor..
ss :

Penjelasan:
Menulis program yang berisi looping hello dan how are u di dalam text
editor

b. Simpan berkas tersebut dengan nama threadsatu.c


SS:

Penjelasan:
Menyimpan program yang sebelumnya sudah sebelumnya,
kemudian disimpan dengan format nama threadsatu.c

C dan d. Kompilasikan program tersebut :


SS:

Penjelasan:
Mengompilasi program threadsatu dan berhasil menampilkan
infinite loop berisi hello dan how are you.

e. Tuliskan kode berikut ini..


SS:

Penjelasan:
Menulis program thread dua di text editor

f. Simpan berkas kedua ini dengan nama threaddua.c


SS

Penjelasan:
Saya menyimpan program yang sebelumnya sudah ditulis disimpan
dengan nama threaddua.c

G dan H. Kompilasikan program tersebut


SS:
Penjelasan:
Mengompilasi program threaddua dan berhasil menampilkan
inisialiasi thread dan status thread dua dan satu.

I, j, dan k. Buka terminal lain dan jalankan kedua program


tersebut, dan temukan identitas proses
Screenshot:

Penjelasan:
Program threadsatu berhasil tertangkap karena isi program tersebut
yang berisi looping lalu threaddua berhasil tertangkap karena
perintah sleep(5) dan hanya dilakukan dua kali perulangan. Jika
dilihat dari cpu usage pun ketiga thread satu dijalankan bersamaan
dengan thread dua penggunaan cpu perthreadnya lebih kecil.

b. Apakah hasil yang anda dapatkan setelah menjalankan


perintah pada Langkah 10. Jelaskan apa yang anda
ketahui mengenai perintah ini dan bagaimana informasi
yang didapatkan..
Screenshot:

Penjelasan:
Saya mengetahui bahwa perintah ini dapat itu memperbarui daftar
paket untuk pemutakhiran untuk paket yang perlu ditingkatkan, serta
paket baru yang baru saja datang ke repositori.

c. Apakah hasil yang anda dapatkan setelah menjalankan


perintah pada Langkah 11. Jelaskan apa yang anda
ketahui mengenai perintah ini dan bagaimana informasi
yang didapatkan.
Screenshot:

Penjelasan:
Saya mengetahui bahwa perintah ini menampilkan proses yang
sedang berjalan dalam bentuk cabang.

d. Apakah hasil yang anda dapatkan setelah menjalankan


perintah pada Langkah 12. Jelaskan apa yang anda
ketahui mengenai perintah ini dan bagaimana informasi
yang didapatkan.
Screenshot:

Penjelasan:
Saya mengetahui bahwa perintah ini menampilkan semua proses
yang sedang berjalan dan setiap detik diperbarui.

e. Apakah hasil yang anda dapatkan setelah menjalankan


perintah pada Langkah 13. Jelaskan apa yang anda
ketahui mengenai perintah ini dan bagaimana informasi
yang didapatkan.

Screenshot:

Penjelasan:
Saya mengetahui bahwa perintah ini menampilkan proses yang
sedang berjalan dalam bentuk cabang.

f. Apakah hasil yang anda dapatkan setelah menjalankan


perintah pada Langkah 1-7 pada bagian 2.42. Jelaskan
apa yang anda ketahui mengenai perintah ini dan
bagaimana informasi yang didapatkan.
Screenshot:

Penjelasan:
Di rangkaian perintah ini saya mengetahui bagaimana membuat dan
menjalankan program fork. Program ini tidak dapat dilihat di pstree
karena terlalu cepat, ditambah sleep pada program maka bisa
dilihat.

g. Apa hubungan antara fork() dan exec() dengan proses


yang berlangsung pada system operasi
Penjelasan:
Fork menciptakan Salinan dari proses saat ini lalu exec dipanggil
untuk mengganti Salinan proses induk.

h. Bagaimana fork() dan exec() mempengaruhi struktur


direktori, penggunaan memori dan CPU
Penjelasan:
Fork dan exec digunakan berurutan untuk menjalankan program
baru sebagai anak dari proses saat ini. Biasanya melakukan ini
menjalankan program, kemudian anak memuat find program ke
dalam memori, menyimpan semua argument baris perintah, I/O
standar, dsb.
LABORATORIUM PEMBELAJARAN ILMU KOMPUTER
FAKULTAS ILMU KOMPUTER
UNIVERSITAS BRAWIJAYA

NAMA : MUHAMMAD FAZA LAMIK


NIM : 205150207111017
KESIMPULAN : PROSES
TANGGAL : 15/03/2021
ASISTEN : -HALIMAH SEPTYA MIKALYA
: -ALDO FRISKA DARMA PUTRA

1.6. KESIMPULAN
Jelaskan Kesimpulan dari hasil percobaan pada Bab Proses ini.

Fork() ialah membuat proses baru yang berisi duplikat


(kebanyakan) dari program saat ini, termasuk statusnya. Ada beberapa
perbedaan antara kedua proses yang memungkinkan mereka untuk
mengetahui mana yang merupakan induk dan mana yang merupakan
anaknya.Lalu exec() ialah menggantikan program dalam proses saat ini
dengan program baru. Fork()panggilan membuat duplikat dekat dari
proses saat ini, identik di hampir setiap jalan (tidak semuanya disalin,
misalnya, batas sumber daya di beberapa implementasi, tetapi gagasan
adalah untuk membuat sedekat salinan mungkin).
Hanya satu panggilan proses fork()tetapi dua proses kembali dari
panggilan itu - terdengar aneh tetapi sangat elegan. Proses baru
(disebut anak) mendapatkan ID proses (PID) yang berbeda dan memiliki
PID dari proses lama (induk) sebagai PID induknya (PPID). Karena
kedua proses sekarang menjalankan kode yang persis sama, mereka
harus dapat membedakan mana - kode kembalian dari fork()memberikan
informasi ini - anak mendapat 0, induk mendapatkan PID anak
(jika fork()gagal, tidak anak dibuat dan orang tua mendapat kode
kesalahan).

Anda mungkin juga menyukai