4.4. Tugas: Laboratorium Pembelajaran Ilmu Komputer Fakultas Ilmu Komputer Universitas Brawijaya

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 11

LABORATORIUM PEMBELAJARAN ILMU KOMPUTER

FAKULTAS ILMU KOMPUTER


UNIVERSITAS BRAWIJAYA

NAMA : MUHAMMAD FIRDAUS VERIANSYAH


NIM : 175150300111004
TUGAS : BAB IV
TANGGAL : 04/10/2018
ASISTEN : ARKA FADILA YASA
LUTHFI MAULANA

4.4. Tugas
1. Berikut ini adalah sebuah kode program yang dijalankan secara
sekuensial. Dibentuk menjadi satu proses dengan single thread.
singlethread.c
#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
transactions
static int think_time = 50; // amount of "thinking
time"

struct acct_t {
int bal;
};

/*
* Pointer to accounts
*/
struct acct_t *accts;

/*
* Method to perform a number of transactions.
* 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_accts;
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 > amt) {
accts[acct_id_from].bal -= amt;
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));

// 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 equal 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;
}
2. Kompilasi kode program tersebut dan simpan dengan nama berkas
singlethread.

3. Jalankan program di atas. Tunjukkan tampilan yang ada pada


terminal serta berikan penjelasan singkat dari output program
tersebut.
Pertama saya akan mengakses root terlebih dahulu di terminal
dengan
$ sudo -i

lalu kompilasi dengan mengetik


# gcc singlethread.c -lpthread -osinglethread

Setelah itu jalankan hasil kompilasi tersebut dengan menggunakan


# ./single thread
Hasilnya menunjukan nilai statis ketiga integer masih konsisten tanpa
ada suatu perubahan. Output yang dikeluarkan ini menunjukan nilai
suatu transaksi dan nomor bank dengan total memikirkannya yang
akan dipengaruhi oleh proses dalam computer itu sendiri.

4. Buat tulisan ilmiah yang berisi penjelasan tentang kode program


singlethread yang telah dimodifikasi dengan aturan sebagai berikut:

a.Modifikasi kode tersebut menjadi beberapa thread yang berbeda dan


simpan dengan nama berkas threadtiga.

b. Deskripsi tentang hasil eksekusi program threadtiga beserta


penjelasannya.

c. Terdiri dari minimal 1000 kata diluar judul, sub judul, kode program
dan referensi.

I. Pendahuluan
Pada kodingan sebelumnya yakni singlethread.c akan
mengeluarkan output yakni

./singlethread: -a 1024 -i 1000 -t 50

Value are still consistent

Output itu akan sesuai seiring waktu kecuali jika terjadi


kesalahan pada saat kompilasi program yang sewaktu-waktu
akan terjadi kesalahan yang menyebabkan nilai statis tersebut
akan berubah dari awal, dan dari kodingan tersebut sudah diatasi
bahwa apabila terjadi hal itu, akan dilakukan pengeluaran output
error untuk memberitahukan dibagian manakah nilai yang
berubah tersebut. Namun karena output dari kodingan
sebelumnya hanya untuk 1 thread saja, saya akan membuat itu
menjadi beberapa thread. Yang akan dirubah hanyalah sedikit
mulai dari tata bahasa serta penambahan struct yang untuk
penempatan alamat sebagaimana dijelaskan juga pada object
oriented programming. Struct ini akan berperan nantinya sebagai
objek dari thread tersebut sehingga dapat dipanggilkan. Dengan
menggunakan fungsi looping juga maka ia akan mengeluarkan
output yang berdasarkan pengeluaran thread di awal.

II. Isi
Untuk memulainya kita akan menambahkan beberapa kodingan
baru dimulai dari struct hingga looping sebagai berikut:

thradtiga.c
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>

static int num_accts = 1024;


static int num_trans = 5000;
static int think_time = 50;
static int num_thread = 4;
static int thread_count = 1;

struct acct_t
{
int bal;
};

struct acct_t *accts;

void *transact(void *dummy)


{
int i;
for (i = 0; i < num_trans; i++)
{
int acct_id_from = rand() % num_accts;
int acct_id_to = rand() % num_accts;
int amt = rand() % 100;

if (accts[acct_id_from].bal > amt) {


accts[acct_id_from].bal -= amt;
accts[acct_id_to].bal += amt;
amt *= think_time; while (amt--) ;}
}
}
int main(int argc, char **argv)
{
if (!(argc == 1 || argc == 3 || argc == 5 || argc
== 7 || argc == 9)) {
fprintf(stderr, "usage: %s [-a <accts>] [-i
<transactions>] [-t <think-time>] [-p<thread-
num>]\n", argv[0]);
exit(-1);}

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 if (!strcmp(argv[i], "-p")) {
num_thread = atoi(argv[i+1]);
i++;}
else {
fprintf(stderr, "Pemakaian: %s [-a <accts>] [-i
<transactions>] [-t <think-time>] [-p<thread-
num>]\n", argv[0]);
exit(-1);}
}

fprintf(stderr, "%s: -a %d -i %d -t %d -p %d\n",


argv[0], num_accts, num_trans,think_time,
num_thread);

srand(1);

accts = (struct acct_t *)malloc(num_accts *


sizeof(struct acct_t));

int original_sum = 0;
for (i = 0; i < num_accts; i++) {
accts[i].bal = rand() % 1000;
original_sum += accts[i].bal;
}

pthread_t* threads[num_thread];
num_trans = num_trans / num_thread;
for(i = 0; i < num_thread; i++) {
thread_count = i+1;
printf("THREAD %d telah terbuat \n", i+1);
pthread_t * p =
(pthread_t*)malloc(sizeof(pthread_t));
pthread_create(p, NULL, transact, (void*)&i+1);
threads[i] = p;
}

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

if (sum != original_sum) {
fprintf(stderr, "ERROR! Total Awal = %d, Total
= %d\n", original_sum, sum);}
else{
fprintf(stderr, "Nilai tetap KONSISTEN\n");}

return 0;
}

Yang mana akan menghasilkan output sebagai berikut apabila


sudah dikompilasi dengan

$ gcc threadtiga.c -lpthread -othreadtiga

Hasil dari program yang telah dibuat akan menampilakan


sejumlah berapa banyak thread yang terbuat, untuk secara
detilnya kita akan membahas setiap kodingannya.

Untuk library sendiri yang akan kita gunakan iallah sebagai


berikut:

 Stdio.h
Library ini merupakan jenis library umum yang harus
dipakai pada setiap pemrograman C. stdio sendiri adalah
singkatan dari Standar Input and Output, library ini
menggunakan apa yang akan dikenal sebagai streams
untuk mengoperasikan hardware input yang dikenal oleh
system.
 Pthread.h
Library jenis ini diperlukan dalam konteks membuat suatu
thread pada kodingan kita. Karena library ini akan
memungkinkan kita membuat thread melalui
pthread_create()
Fungsi diatas diperlukan untuk membuat thread baru dan
hanya bisa diberhentikan dengan fungsi kembali
Pthread_exit()
 Stdlib.h
Library ini merupakan jenis library yang bertujuan
multifungsi khusunya dalam hal manajemen memori,
angka acak, komunikasi antar peralatan, aritmatika,
sorting maupun perubahan serta pencarian.
 Time.h
Library ini merupakan jenis library yang diperlukan disaat
kita ingin memakai nilai waktu untuk kodingan kita,
berguna untuk memanipulasi data maupun informasi
waktu.
 String.h
Library ini merupakan jenis linrary yang berguna untuk
memakai tulisan yang akan menggunakan array sehingga
dapat disimpan pada array tersebut. Karena pada
dasarnya C tidak memiliki array sehingga jenis string tidak
akan terbaca.

Selain itu terdapat pula nilai statis yang akan bersifat tetap dan
global untuk semua fungsi yang ada, static ini berguna untuk
menetapkan nilai selama kodingan ini berjalan yakni:

 Num_accts
Tipe data ini merupakan integer yang akan diberi nilai
1024.
 Num_trans
Tipe data ini merupakan integer yang akan diberi nilai
5000.
 Think_time
Tipe data ini merupakan integer yang akan diberi nilai 50.
 Num_thread
Tipe data ini merupakan integer yang akan diberi nilai 4.
 Thread_count
Tipe data ini merupakan integer yang akan diberi nilai 1.

Lalu selain variabel global diatas, terdapat pula beberapa fungsi


sebagaimana berikut:

 Struct acct_t
Pada Bahasa pemmrograman C tidak terdapat opsi object
oriented programming namun terdapat opsi yang
mendekati yakni dengan menggunakan struct. Karena
pada dasarnya ia merupakan deklarasi pengelompokan
suatu variabel dalam satu blok memori sehingga variabel
ini dapat dipakai oleh fungsi lainnya, dalam hal ini ia akan
menyimpan nilai yang dikenal sebagai
int bal
yang mana ia akan menyimpan nilai dari suatu pemilik
(accts).
 Struct acct_t *accts
Struct jenis ini lebih berguna untuk memanggil dan
menunjukan alamat dari variabel accts.
 Void *transact(void *dummy)
Fungsi ini akan berguna untuk mengolah nilai transaction
dengan nilai yang dipakai yakni dummy
Pada fungsi ini akan dilakukan pengecekan dan
pengolahan nilai secara acak dan setelah diolah hal
tersebut, ia akan mengurangi/menambah nilai akhirnya
serta mengalikan total proses yang dibutuhkan untuk
melaksanakan hal itu semua.

Lalu kembali pada fungsi utama yakni int main(), fungsi main
ini terdapat kodingan untuk mengecek apakah terdapat suatu
kesalahan yakni dengan mengecek apakah nilainya ganjil apabila
tidak ia akan keluar dari pengolahan kodingan.

Setelah itu pada fungsi ini dideklarasikan juga variabel integer I


yang digunakan untuk mengecek sudah sejauh mana proses
pengolahan ini berjalan. Lalu dilanjutkan dengan method looping
dfor untuk mengecek berapa banyak proses sesuai dengan
argumentasi yang ada hal ini untuk menghitung jumlah thread
yang ada saat dieksekusi program ini.

Selain itu ia akan mencetak total dari hasil perhitungan method


looping diatas dan akan melakukan pembuatan angka secara
acak. Lalu akan dilakukan juga alokasi memori untuk struct yang
nantinya dipakai dalam program ini, setelah itu akan dijumlahkan
total yang terdapat dalam program ini yang akan dipergunakan
dalam hasil akhir program ini. Kemudian tibalah untuk membuat
thread lebih dari satu dengan membuat suatu looping dengan
mengguunakan total thread yang sudah dibuat dari method awal
main tadi dan menghitungnya dengan penjumlahan
(thread_count) dan untuk mengetahuinya kita akan memberikan
perintah untuk mencetak setiap kali terbuat thread baru. Dan
terakhir ialah untuk pengecekan apabila nilai saat ini tidak sesuai
dengan nilai yang telah ditetapkan di awal apabila tidak sesuai ia
akan mencetak error dan apabila masih sama ia akan mencetak
konsisten.

III. Penutup dan Kesimpulan


Pada bab ini telah dibahas bagaimana secara kodingan c
terjadinya dan terbentuknya suatu thread sehingga thread
tersebut tereksekusi dan terbaca oleh system. Dan bagaimana
kita dapat membuat suatu thread baru dalam jumlah lebih dari
satu. Pada dasarnya thread itu sendiri merupakan bagian yang
tidak terpisahkan dengan proses, dan tidak bisa digantikan satu
sama lain, untuk membuat thread dalam jumlah banyak sendiri
diperlukan suatu kodingan yang memiliki fungsi loop untuk
memanggil setiap thread yang telah terbuat sebelumya.

IV. Referensi
Operating System Concepts – 9th Edition; Silberschatz, Galvin
and Gagne (2013)

You might also like