Kamis, 20 November 2014

Cara Menggunakan Thread, Join Thread dan Mutex pada Linux

1. Thread 

Thread terbagi menjadi 2 macam yaitu:
  • Single thread
Proses hanya mengeksekusi satu thread saja pada satu waktu, sehingga proses hanya dapat menjalankan satu tugas/perintah pada satu waktu.
  • Multi thread
Proses dapat mengeksekusi banyak thread pada satu waktu, sehingga proses dapat menjalankan lebih dari satu tugas/perintah pada waktu yang bersamaan.

Contoh kasus single dan multi thread :
Misalnya, user ingin menjalankan 2 perintah sekaligus yaitu menginputkan suatu string sambil menjalankan sebuah file lagu.
Jika menggunakan single thread, alur proses yang akan terjadi adalah proses akan menunggu hingga user selesai menginputkan string, setelah itu perintah selanjutnya dieksekusi yaitu menjalankan sebuah file lagu.
Jika menggunakan multi thread keiinginan user dapat tercapai, proses akan langsung menjalankan 2 perintah tersebut sekaligus sehingga meskipun user belum selesai menginputkan string, file lagu sudah dijalankan/di-play.

Thread Identification

Seperti halnya sebuah proses diidentifikasi melalui sebuah proses ID, sebuah thread juga diidentifikasi melalui sebuah thread ID. Thread ID direpresentasikan menggunakan tipe data 'pthread_t'





Thread Creation

Ketika suatu program dijalankan dan menjadi proses, proses tersebut berjalan dengan default thread. Jadi bisa dibilang setiap proses pasti memiliki minimal single thread. Sebuah proses dapat membuat thread tambahan(multi thread) dengan menggunakan fungsi :






Fungsi di atas menggunakan 4 argumen :

  • Argumen pertama merupakan alamat dari variabel yang bertipe data pthread_t, ketika fungsi berhasil dijalankan, variabel tersebut akan berisi ID thread dari thread yang baru dibuat.
  • Argumen kedua dapat berisi atribut yang kita ingin tambahkan ke thread, atribut tersebut bisa berupa prioritas, dll.
  • Argumen ketiga merupakan alamat fungsi yang akan dijalankan thread baru tersebut.
  • Argumen keempat merupakan argumen yang akan di pass ke fungsi yang akan dijalankan thread sebagai parameter fungsi tersebut.

Contoh Multi thread sederhana:
























Outputnya :









Jadi, proses di atas membuat 2 thread menggunakan fungsi pthread_create, di mana kedua thread tersebut akan dijalankan secara bersamaan pada fungsi yang ditujunya, sehingga kedua fungsi tersebut dapat berjalan bersamaan. Hasil output code di atas mungkin akan berbeda-beda(misal pesan dari thread 1 ditampilkan terlebih dahulu), karena urutan dari eksekusi thread tidak selalu sama, tergantung dari algoritma scheduling OS.


2. Join Thread

Perhatikan program berikut :



















Outputnya :





Jadi, proses di atas membuat 2 thread, yang seharusnya akan menjalankan fungsi tulis, namun pada outputnya hanya tercetak tulisan bahwa thread tersebut berhasil dibuat, mengapa demikian? Hal tersebut terjadi karena sebelum kedua thread di-scheduled atau dijadwalkan, parent thread (yang menciptakan kedua thread tersebut) telah selesai dieksekusi. Maksud dari parent thread adalah default thread yang terdapat dalam fungsi main. Sehingga ketika default thread pada fungsi main tersebut selesai dieksekusi, proses diterminasi ketika nilai main() di return.

Cara untuk mengatasi persoalan di atas adalah menggunakan fungsi :





Fungsi di atas berfungsi menunda eksekusi calling thread (misal parent thread) hingga target thread (argumen pertama pada fungsi pthread_join) selesai dieksekusi. Argumen kedua pada fungsi pthread_join merupakan return value dari target thread. Dengan menggunakan fungsi ini, parent thread pada fungsi main akan di-suspend/menunggu hingga target thread / child thread yang diinginkan selesai dieksekusi. 

Perhatikan program berikut :




















Outputnya :







Perhatikan penggunaan fungsi pthread_join pada program di atas, parent thread pada fungsi main akan menunggu hingga thread kesatu dan kedua selesai dieksekusi barulah proses diterminasi.


3. Mutex

Mutex(Mutual Exclusion Device) berfungsi untuk sinkronisasi thread yang diibaratkan sebagai kunci yang dipakai oleh thread untuk mengunci shared resources agar tidak digunakan oleh thread yang bukan penguncinya, setelah proses di dalamnya selesai maka thread tersebut akan membuka kuncinya agar kunci tersebut dapat digunakan oleh thread lain secara bergiliran.

Tujuan dari penguncian shared resources tersebut agar menjaga shared resources tidak dimodifikasi oleh thread lain apabila suatu thread belum selesai menggunakannya.

Perhatikan program berikut :























Outputnya :









Perhatikan outputnya, output yang diharapkan adalah program tersebut akan mencetak "Thread 1 selesai" dan "Thread 2 selesai", namun faktanya yang tercetak adalah 2 line "Thread 2 selesai". Hal tersebut terjadi karena ketika thread ke-1 masih processing, scheduler menjadwalkan/menjalankan thread ke-2, sehingga nilai i di-increment sebelum proses thread ke-1 selesai, menyebabkan nilai i yang dicetak pada thread ke-1 salah(nilainya 2 harusnya 1). Untuk mengatasi masalah tersebut digunakanlah mutex.

Fungsi untuk inisialisasi objek mutex(pada contoh dinamakan lock) :





Fungsi untuk mengunci & membuka kunci source code/shared source menggunakan mutex :






Perhatikan program berikut :
























Outputnya :









Dengan menerapkan mutex pada program di atas, thread ke-2 yang akan meng-akses daerah source code yang di lock oleh thread ke-1 akan menunggu hingga thread ke-1 membuka lock tersebut, sehingga nilai i dapat dijaga pada setiap proses thread.


Sekian postingan dari saya, terima kasih :)

Minggu, 26 Oktober 2014

Inter Process Communication Menggunakan Named Pipes(FIFO) pada Linux

Named Pipe atau biasa disebut special file FIFO(First In First Out) karena data akan di read berurutan dari data yang pertama di write ke pipe. Perbedaan named pipe dengan unnamed pipe adalah :

  • Named pipe eksis sebagai bagian dari filesystem.
  • Named pipe dapat diakses oleh berbagai proses untuk sharing data(reading dan writing).
  • Ketika semua I/O telah selesai dilakukan ketika proses komunikasi, named pipe tetap berada di filesystem sehingga dapat digunakan di lain waktu.
  • Bersifat bidirectional, file FIFO yang sama dapat di read from dan write into.


Ketika proses melakukan pertukaran data via named pipes, kernel melewatkan semua data secara internal tanpa melakukan write ke filesystem. Maka, special file FIFO tidak mempunyai isi di filesystem, file tersebut hanya digunakan sebagai reference point sehingga proses dapat meng-akses pipe menggunakan nama pipe tersebut di filesystem.

Berikut merupakan contoh implementasi FIFO yaitu komunikasi antar server dan client :

server.cpp




















































































































client.cpp































  • Named pipe atau FIFO dibuat menggunakan fungsi mkfifo() yang mempunyai 2 argumen, argumen ke-1 adalah nama FIFO yang akan dibuat dan argumen ke-2 adalah hak akses untuk file tersebut. Jika program ingin dijalankan lebih dari sekali, sebaiknya pembuatan named pipe/FIFO dilakukan di program lain yang khusus untuk membuat file FIFO tersebut. Ada baiknya jika return value sebuah fungsi seperti yang berhubungan dengan create dan open file diletakkan di sebuah variabel untuk mengecek apakah fungsi tersebut sukses dijalankan atau tidak. 

  • Setelah file FIFO dibuat(pada contoh di atas menggunakan nama server dan client), file tersebut dapat dibuka menggunakan system call open(). Argumen ke-2 pada system call open() menandakan apakah file tersebut hanya dapat di read(O_RDONLY) atau hanya dapat di write(O_WRONLY) atau bisa kedua-duanya(O_RDWR). 

 

  • Sebuah file FIFO harus dibuka kedua sisinya(reading dan writing) sebelum data dapat masuk. Contohnya jika server di execute, ketika file server di open untuk di read, terminal akan menunggu(wait state) hingga file server di open untuk di write suatu data oleh client.



  • Alur dari contoh program di atas adalah setelah client selesai menuliskan(write) data melalui file server, server akan membaca(read) data yang disampaikan melalui file server dan menampilkan data tersebut ke layar. Kemudian server akan membuka file client untuk menuliskan kembali data yang didapatkan tadi, dan client akan membaca data yang disampaikan melalui file client dan menempatkannya di string baru untuk ditampilkan ke layar. 

  • Hasilnya kedua proses tersebut dapat berkomunikasi melalui file FIFOs/named pipes.




  • Intinya agar dapat melakukan IPC menggunakan named pipes pada Linux dilakukan langkah-langkah seperti berikut :
  1. Buat named pipes/file FIFOs yang akan digunakan untuk berkomunikasi antar proses menggunakan fungsi mkfifo()
  2. File FIFO yang telah dibuat dibuka menggunakan system call open()
  3. File FIFO tersebut harus dibuka kedua sisinya(read dan write)(baik oleh dirinya sendiri atau melalui proses lain) agar dapat digunakan untuk berkomunikasi.
  4. Gunakan system call write() jika ingin menulis/mengirim data ke proses lain melalui file FIFO(bisa ke dirinya sendiri).
  5. Gunakan system call read() jika ingin membaca/menerima data dari proses lain melalui file FIFO(bisa dari dirinya sendiri).






Sekian postingan dari saya, semoga bermanfaat :)

Senin, 20 Oktober 2014

Cara Menggunakan Command "date" pada Terminal Linux

Command date pada Linux berguna untuk menampilkan date(tanggal, bulan, tahun) atau time(jam, menit, detik) dalam berbagai format. Command date juga dapat digunakan untuk mengatur date dan time sistem.

Syntax


date [OPTION]... [+FORMAT]



Berikut merupakan tabel beberapa format yang sering dipakai untuk command date :



Format optionsPurpose of OptionOutput
date +%aMenampilkan nama hari (pendek)Sen
date +%AMenampilkan nama hari (panjang)Senin
date +%bMenampilkan nama bulan (pendek)Feb
date +%BMenampilkan nama bulan (panjang)Februari
date +%dMenampilkan hari dalam bulan (01-31)07
date +%DMenampilkan bulan/tanggal/tahun sekarang02/07/13
date +%FMenampilkan tahun-bulan-tanggal sekarang2013-02-07
date +%HMenampilkan jam dengan jangkauan 00-2323
date +%IMenampilkan jam dengan jangkauan 01-1211
date +%jMenampilkan hari dalam tahun (001-366)038
date +%mMenampilkan bulan (01-12)02
date +%MMenampilkan menit (00-59)44
date +%SMenampilkan detik (00-60)17
date +%NMenampilkan nanoseconds (000000000-999999999)573587606
date +%TMenampilkan waktu dengan format HH:MM:SS
Note: Jam menggunakan format 24 jam
23:44:17
date +%uMenampilkan hari dalam minggu (1 = hari Senin)4
date +%UMenampilkan minggu dalam tahun, dengan hari Minggu sebagai awalnya (00-53)01
date +%YMenampilkan tahun (panjang)2014
date +%ZMenampilkan singkatan dari zona waktuWIB


Contoh Penggunaan :
  • date
Jika command date dijalankan tanpa option, akan menampilkan date dan time sistem/sekarang.





  • date +"%d-%m-%Y"
Beberapa format dapat dijalankan dalam 1 command date seperti berikut :





  • date -s "month/day/year HH:MM:SS"
Untuk mengatur/men-set date/time sistem digunakan option -s (jika perlu tambahkan sudo di depan date). Contoh di bawah ini mengubah waktu dari 17:51:17 ke 17:55:00.








  • date -r "nama_file"
Untuk mengetahui kapan terakhir kalinya suatu file dimodifikasi dapat menggunakan option -r





  • Menyimpan format date/time ke variabel pada shell script
Contoh di bawah ini menyimpan waktu sekarang(format HH:MM:SS) ke variabel bernama NOW, kemudian isi variabel NOW di echo(ditampilkan ke layar). Shell script tersebut disimpan dengan nama waktu.sh

 Outputnya ketika dijalankan :







Sekian postingan dari saya, semoga bermanfaat :)

Kamis, 16 Oktober 2014

Cara Download dan Upload File Menggunakan cURL pada Linux

cURL adalah paket software yang berisi command line tool dan library yang berguna untuk transfer data menggunakan sintaks URL Tujuan utama dari penggunaan cURL adalah mentransfer files dengan interface command line via protocols seperti DICT, FILE, FTP, FTPS, Gopher, HTTP, HTTPS, IMAP, IMAPS, LDAP, LDAPS, POP3, POP3S, RTMP, RTSP, SCP, SFTP, SMTP, SMTPS, Telnet dan TFTP.


  • Cara Download File Menggunakan cURL via Terminal/Shell Script
Cara download file menggunakan cURL via terminal/shell script menggunakan perintah :

curl -o <nama_file> <alamat_download>

Fungsi -o pada option curl adalah untuk menuliskan/write output dalam bentuk file.
Intinya perintah di atas akan mengambil content dari alamat_download dan menyimpannya dalam bentuk file yang bernama nama_file.

Contoh penggunaanya:



Jika ingin menyimpan file yang di download di direktori yang berbeda, tinggal menuliskan path direktori yang diinginkan ditambah nama file yang ingin disimpan di akhir path seperti contoh di atas.


  • Cara Upload File Menggunakan cURL via Terminal/Shell Script
Cara upload file menggunakan cURL via terminal/shell script menggunakan perintah :

curl -F <form>=@<nama_file> <alamat_upload>

Fungsi -F pada option curl adalah agar curl meng-upload data dalam bentuk form.
Fungsi @ agar isi dari form adalah sebuah file.
Intinya perintah di atas akan mengisi form yang contentnya adalah sebuah file dan meng-upload form tersebut ke alamat_upload.

Contoh penggunaanya:



Hasilnya file password.txt akan ter-upload di http://bboynero.blogspot.com/uploader.php


Sekian postingan dari saya, semoga bermanfaat :)

Senin, 13 Oktober 2014

Tutorial Menggunakan Crontab di Linux

Crontab adalah aplikasi daemon (berjalan dibalik layar) yang digunakan untuk menjalankan tugas yang dijadwalkan pada suatu waktu di sistem operasi Linux. Misalnya jika kita membuat suatu shell script, dan shell script tersebut perlu dijalankan secara otomatis pada waktu-waktu tertentu, pada contoh kasus inilah penggunaan crontab dapat diimplementasikan.

Berikut merupakan perintah-perintah cron jobs yang dapat digunakan :

  • crontab -e
    • Berfungsi untuk memasukkan/menambah perintah cron jobs
  • crontab -l
    • Berfungsi untuk melihat aktifitas crontab yang sedang berjalan
  • crontab -r
    • Berfungsi untuk menghapus semua perintah cron jobs yang sudah di set


Jadi, untuk membuat crontab buka terminal kemudian ketikkan perintah :





Jika ini pertama kalinya kamu membuat crontab, maka akan muncul opsi berikut :






Di sini saya memilih editor nano[2] karena penggunaanya paling mudah.


Berikut ini adalah format penulisan crontab :

* * * * * /home/gian/contoh.sh

5 bintang (*) diatas merepresentasikan bagian-bagian format tanggal yang berbeda, urutannya sebagai berikut :
1. (* pertama) : menit (isian : 0 – 59)
2. (* kedua) : jam (isian : 0 – 23)
3. (* ketiga) : hari dari bulan / tanggal (isian : 1 – 31)
4. (* keempat) : bulan (isian : 1 – 12)
5. (* kelima) : hari dari minggu (isian : 0 – 6) 

Contoh beberapa crontab :

Eksekusi setiap menit :





Eksekusi setiap hari jam 22.00 :





Eksekusi setiap Jumat jam 15.00 :





Eksekusi setiap 2 jam sekali : (garis miring memiliki arti setiap (x) sekali)





Eksekusi setiap 10 menit sekali :





Eksekusi setiap hari Senin-Jumat jam 20.00 :







Selain itu crontab menyediakan short code atau sejenis shortcut untuk digunakan.

@reboot      Dieksekusi sekali, ketika startup
@yearly      Dieksekusi setaun sekali  "0 0 1 1 *"
@annually  Sama dengan @yearly
@monthly   Dieksekusi sebulan sekali  "0 0 1 * *"
@weekly     Dieksekusi seminggu sekali  "0 0 * * 0"
@daily        Dieksekusi sehari sekali  "0 0 * * *"
@midnight  Sama dengan @daily
@hourly      Dieksekusi setiap jam  "0 * * * *"

Cara memakainya adalah seperti ini :






Untuk mengetahui apakah crontab berjalan seperti seharusnya atau tidak, crontab dapat dibuat log nya menggunakan :




  • Perintah >> berarti isi file contoh.log akan ditambahkan dengan output dari crontab tersebut
  • Perintah 2>&1 berarti melewatkan setiap output dari stderr(2) ke stdout(1), jadi setiap error yang dikeluarkan akan diteruskan menuju standar output. Tanda > sendiri adalah redirection pada suatu file tetapi karena tanda & maka output tersebut diteruskan lagi ke stdout.


Sekian postingan dari saya, semoga bermanfaat :)