Wednesday, November 26, 2014

Pthread

Halo sudah 2 minggu belum update, ok kesempatan kali ini saya ingin share salah satu ilmu yang sudah saya dapatkan lagi yaitu pthread atau bisa disebut juga POSIX thread

1. Dasar Teori
Library POSIX thread adalah thread standar berbasis API untuk C/C++. ini dapat mengembangkan satu  proses untuk mengijinkan proses yang lainya untuk ikut berproses. ini srangat efektif untuk sistem bermultiprosesor dimana alur proses bisa dialokasikan  untuk menjalankan prosesor lain sehingga kecepattan proses menjadi lebih cepat. selain pada sistem multiprosesor, kegunaan ini bisa didapatkan juga di sistem uniprosesor yang menggunakan I//O dan fungsi sistem lainya yang mungkin bisa mematikan proses lainya.  semua threads yang sedang  beproses memiliki kesamaan kapasitas alamat. thread akan dipanggil dengan mendefinisikan suatu fungsi dengan argumenya yang akan diproses dengan thread lainya. jadi kesimpulanya adalah kegunaan POSIX threads adalah agar suatu software dapat berjalan dengan lebih cepat.

 fungsi-fungsi yang ada pada library pthread.h:
  •  pthread_t = tipe data thread
  •  pthread_mutex_t= tipe data mutex thread
  •  pthread_create = int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);
    Fungsi yang digunakan untuk menciptakan thread baru   dalam suatu proses dengan atribut ditentukan oleh attr. Jika attr diisi NULL, atribut default akan dimuat. Jika pemanggilan fungsi berhasil, fungsi akan menyimpan ID dari thread ciptaan pada rujukan yang ditunjuk thread
  • pthread_detach = int pthread_detach(pthread_t thread);
    Fungsi ini digunakan untuk mengindikasikan pada implementasi bahwa ruang penyimpanan thread pada thread bisa diminta kembali ketika thread berakhir
  • pthread_cancel = int pthread_cancel(pthread_t thread);
    Fungsi ini digunakan untuk meminta agar thread dibatalkan. Kondisi kemampuan membatalkan dan tipedari thread yang dituju menentukan kapan pembatlan terjadi.
  • pthread_mutex_lock = int pthread_mutex_lock(pthread_mutex_t *mutex);
    Fungsi ini digunakan untuk mengunci objek mutex yang dirujuk oleh mutex. Jika mutex sudah dikunci, thrad pemanggil akan ditahan hingga mutex menjadi tersedia (tidak terkunci). Operasi ini mengembalikan objek mutex yang dirujuk oleh mutex pada keadaan terkunci dengan thread pemanggil sebagai pemiliknya
  • pthread_mutex_unlock = int pthread_mutex_unlock(pthread_mutex_t *mutex);
    Fungsi ini berguna untuk membebaskan objek mutex yang dirujuk mutex. Bagaimana cara mutex dibebaskan tergantung dari tipe atribut mutex
  • pthread_mutex_destroy = int pthread_mutex_destroy(pthread_mutex_t *mutex);
    Fungsi ini menghancurkan objek mutex yang dirujuk oleh mutex, sehingga objek tersebut menjadi tidak terinisialisasi. Objek yang dihancurkan bisa diinisialisasi masukan diberikan .
2. Contoh Soal:
 persoalan:
     Pembagian Kelompok untuk mengerjakan tugas secara berkelompok secara   acak. asumsikan bahwa anda seorang dosen/guru dan anda ingin membuat kelompok untuk mengerjakan suatu tugas. asumsikan bahwa siswa dikelas anda berjumlah 48 dan per kelompok terdiri atas 4 orang.
solusi:
Karena pthread berjalan secara serentak maka thread keberapapun diurutkan secara random sehingga kita tak tau pasti urutan ke berapa terlebih dahulu yang keluar. maka sebagai solusi pthread termasuk pthread yang tepat
berikut adalah instruksinnya:
  • untuk pertama-tama kita definisikan terlebih dahulu beberapa fungsi yang akan dipakai dan sebuah konstanta berupa jumlah thread maksimal/Jumlah Siswa yaitu 48

  • selanjutnya kita langsung main ke fungsi yang akan dijalankan oleh POSIX thread yaitu fungsi pengelompokan, karena berjalan secara bersamaan maka kita membutuhkan mutex lock sehingga pengelompokan dilaksanakan secara stabil walaupun secara bersamaan. lalu untuk penulisan kelompok jadi disini kita mendeklarasikan variable counter dan counter tersebut akan di modulus 4 sehingga kelompok akan di shift ke kelompok berikutnya apabila counter tersebut menghasilkan 0 apabila di modulus 4. lalu langsung kita memanfaatkan id thread yang sebagai nomor urut siswa disini lalu langsung di print nomor urut mahasiswa tsb, lalu counter di increment dan mutexnya di unlock.

  • di int main kita hanya perlu mendeklarasikan satu variable threads yang berarray, lalu langsung memulai perulangan untuk membuat thread tersebut dan memulai fungsi pengelompokan didalam thread tersebut. dan selesai. jangan lupa dengan pthread_exit. agar thread bisa berhenti berproses.


    Berikut hasil compile dan run'nya:



    Sekian dan Semoga bermanfaat :)

    Thursday, November 6, 2014

    FIFO example

    Halo semua, terimakasih apabila kalian masih follow up saya disini :v
    ok langsung aja, untuk kesempatan kali ini saya akan menjelaskan tentang FIFO dan contoh programnya.
    ok langsung saja ini yang akan saya lampirkan :)

    *pengertian 
    FIFO adalah akronim untuk First In, First Out (Pertama Masuk, Pertama Keluar), sebuah abstraksi yang berhubungan dengan cara mengatur dan memanipulasi data relatif terhadap waktu dan prioritas. Ungkapan ini menggambarkan prinsip teknik pengolahan antrean atau melayani permintaan yang saling bertentangan dengan proses pemesanan berdasarkan perilaku first-come, first-served (FCFS): di mana orang-orang meninggalkan antrean dalam urutan mereka tiba, atau menunggu giliran satu di sebuah sinyal kontrol lalu lintas.
    FCFS juga merupakan jargon istilah untuk sistem operasi penjadwalan algoritma FIFO, yang memberikan setiap proses CPU waktu sesuai dengan urutan mereka datang. Dalam arti yang lebih luas, abstraksi LIFO, atau Last-In-First-Out adalah kebalikan dari abstraksi organisasi FIFO. Bedanya mungkin adalah yang paling jelas dengan mempertimbangkan sinonim yang kurang umum digunakan dari LIFO, FILO (berarti First-In-Last-Out). Pada intinya, keduanya adalah kasus khusus dari daftar yang lebih umum (yang dapat diakses di mana saja). Perbedaannya adalah tidak ada dalam daftar (data), tetapi dalam aturan untuk mengakses konten. Satu sub-tipe menambah satu ujung, dan melepaskan dari yang lain, sebaliknya mengambil dan menempatkan sesuatu hanya pada salah satu ujungnya.
    sumber: id.wikipedia.org


    *contoh program

    Program yang ingin saya tunjukan adalah penerapan FIFO dalam hubungan antara client dan server di suatu warnet atau rental computer dalam bahasa c. ketentuanya adalah, client akan mendapatkan 5 pilihan di dalam warnet: 1.game offline -> rp 2000 2. Game online -> Rp 4000 3. internet-> Rp 3000 dan 4 game dan Internet -> Rp 5000 serta 5. tinggal saja(gak bayar). dan out putnya akan diterima hanya untuk server berupa pendapatan yang didapatkan per 10 pengunjung yang datang

    ok langsung saja berikut tahap2 pembuatanya.
    1. bukalah Gedit atau Geany(apabila anda memilikinya)
    2. Lalu kita akan memulai untuk membuat program untuk client terlebih dahulu
        a. include bbrp library seperti gambar di bawah, kurang lebih kita membutuhkan library tersebut dan         jangan lupa untuk menambahkan define  
      
        b. lalu langsung masuk ke fungsi main, definisikan suatu char untuk pop up message dan                           beberapa integer untuk menyimpan pilihan paket (pilihan[10]), dan banyak jam                                       penyewaan(jam[10]), serta 2 variable integer untuk memasukan data yang telah diinputkan                   user(gt dan ht) untuk selain itu urutan[10],ft dan countert di abaikan saja, karena saya lupa                   menghapus :p           

        c. lalu berikan user leluasa untuk mengisikan pilihan paket dan lama pakainya, langsung saja ikuti           kode sebagai berikut. (pengulangan terjadi 10 kali karena hanya akan memasuki 10 user saja               per run). jangan lupa dengan sprintf dan system("mssg") yang digunakan untuk pop up message,         namun ini sebenarnya optional
        d. setelah itu masukan kode dibawah ini, kode ini berfungsi untuk memberikan perintah kepada               sistem untuk membuat suatu FIFO(char * = "/tmp/ "; mkfifo( , 0666), dan memasukan isi dari              variable pilihan paket dan jam ke masing-masing FIFO ( = open(inout, OWRONLY); dst).                  lalu jangan lupa save file tsb dengan extension .c
             


    3. untuk client sudah selesai, maka kita sekarang fokus untuk server
        a. Sama Seperti Client inilah beberapa library yang akan kita butuhkan
           
           b. Lalu Deklarasikan beberapa variable (kecuali countert) untuk pengambilan data dari                            fifo(gt,ht,buf,buf1). lalu deklarasikan 2 fifo dan 2 fifo tersebut akan mengambil data dari                      client. 

             c. Lalu berikan harga dari inputan client, buf[i] digambar ini berlaku sebagai pilihan paket dan               buf1[i] akan berlaku sebagai banyaknya jam, serta sum sebagai total dan subsum sebagai                     jumlah yang harus dibayarkan setiap usernya
              d. setelah itu, lakukan pop up message apabila 10 user telah mengunjungi warnet server. dan                   print semua output dalam format pilihan paket i x jam= subsum sebanyak 10 user. lalu                         tampilkan sum yang berupa hasil penjumlahan dari smua subsum diatas. lalu save dengan                   extension .c
    4. Baik Sudah selesai. cheers! :D
    dan berikut bbrp screenshot run programnya





    Baik, Sekian Disini dulu, Semoga Bermanfaat! ;)