Saturday, November 7, 2015

Thread dan IPC

THREAD 

Proses merupakan sebuah program yang mengeksekusi thread tunggal. Kendali thread tunggal ini hanya memungkinkan proses untuk menjalankan satu tugas pada satu waktu. Banyak sistem operasi modern telah memiliki konsep yang dikembangkan agar memungkinkan sebuah proses untuk mengeksekusi multi-threads. Misalnya user melakukan pekerjaan secara bersamaan yaitu mengetik dan menjalankan pemeriksaan ejaan didalam proses yang sama. Thread merupakan unit dasar dari penggunaan CPU, yang terdiri dari Thread ID, program counter, register set, dan stack. Sebuah threadberbagi code section, data section, dan sumber daya sistem operasi dengan Thread lain yang dimiliki oleh proses yang sama. Thread juga sering disebut lightweight process. Sebuah proses tradisional atau heavyweight process mempunyai thread tunggal yang berfungsi sebagai pengendali. Perbedaannya ialah proses dengan thread yang banyakmengerjakan lebih dari satu tugas pada satu satuan waktu.
Pada umumnya, perangkat lunak yang berjalan pada komputer modern dirancang secara multithreading. Sebuah aplikasi biasanya diimplementasi sebagai proses yang terpisah dengan beberapa thread yang berfungsi sebagai pengendali. Contohnya sebuah web browser mempunyai thread untuk menampilkan gambar atau tulisan sedangkan thread yang lain berfungsi sebagai penerima data dari network.
Terkadang ada sebuah aplikasi yang perlu menjalankan beberapa tugas yang serupa. Sebagai contohnya sebuah web server dapat mempunyai ratusan klien yang mengaksesnya secara concurrent. Kalau web server berjalan sebagai proses yang hanya mempunyai thread tunggal maka ia hanya dapat melayani satu klien pada pada satu satuan waktu. Bila ada klien lain yang ingin mengajukan permintaan maka ia harus menunggu sampai klien sebelumnya selesai dilayani. Solusinya adalah dengan membuat web server menjadi multi-threading. Dengan ini maka sebuah web server akan membuat thread yang akan mendengar permintaan klien, ketika permintaan lain diajukan maka web server akan menciptakan thread lain yang akan melayani permintaan tersebut [MDGR2006]. 

a. Single thread dan multi thread
1. Single thread: process hanya mengeksekusi satu thread saja pada satu waktu

2. Multi thread: process dapat mengeksekusi sejumplah thread dalam satu waktu


b. Model Multithreading 
Dukungan thread disediakan pada tingkat user yaitu user threads atau tingka kernel untuk kernel threads. User Threads disediakan oleh kernel dan diatur tanpa dukungan kernel, sedangkan kernel therads didukung dan diatur secara langusng oleh sistem operasi. Hubungan antara user threads dan kernel threads terdiri dari tiga model relasi, yaitu:
  • Model Many to One: Model Many-to-One memetakan beberapa thread tingkatan pengguna ke sebuah thread tingkatan kernel. Pengaturan thread dilakukan dalam ruang pengguna, sehingga efisien. Hanya satu thread pengguna yang dapat mengakses thread kernel pada satu saat. Jadi, multiple thread tidak dapat berjalan secara paralel pada multiprocessor. Thread tingkat pengguna yang diimplementasi pada sistem operasi yang tidak mendukung thread kernel menggunakan model Many-to-One.

  • Model One to One: Model One-to-One memetakan setiap thread tingkatan pengguna ke thread kernel. Ia menyediakan lebih banyak concurrency dibandingkan model Many-to-One. Keuntungannya sama dengan keuntungan thread kernel. Kelemahannya model ini ialah setiap pembuatan thread pengguna memerlukan pembuatan thread kernel. Karena pembuatan thread dapat menurunkan kinerja dari sebuah aplikasi maka implmentasi dari model ini jumlah thread dibatasi oleh sistem. Contoh sistem operasi yang mendukung model One-to-One ialah Windows NT dan OS/2.


  • Model Many To Many: Model ini me-multipleks banyak thread tingkatan pengguna ke thread kernel yang jumlahnya lebih sedikit atau sama dengan tingkatan pengguna. thread. Jumlah thread kernel spesifik untuk sebagian aplikasi atau sebagian mesin. Many-to-One model mengizinkan developer untuk membuat user thread sebanyak yang ia mau tetapi concurrency (berjalan bersama) tidak dapat diperoleh karena hanya satu thread yang dapat dijadwal oleh kernel pada suatu waktu. One-to-One menghasilkan concurrency yang lebih tetapi developer harus hati-hati untuk tidak menciptakan terlalu banyak thread dalam suatu aplikasi (dalam beberapa hal, developer hanya dapat membuat thread dalam jumlah yang terbatas). Model Many-to-Many tidak mengalami kelemahan dari dua model di atas. Developer dapat membuat user thread sebanyak yang diperlukan, dan kernel thread yang bersangkutan dapat bejalan secara paralel pada multiprocessor. Dan juga ketika suatu thread menjalankan blocking system call maka kernel dapat menjadwalkan thread lain untuk melakukan eksekusi. Contoh sistem operasi yang mendukung model ini adalah Solaris, IRIX, dan Digital UNIX.

 IPC (Inter-Process Communication) 

IPC adalah komunikasi antar proses untuk mengirim data dari satu proses ke proses yang lain, baik antar proses dalam satu komputer maupun proses-proses dalam komputer yang berbeda. Salah satu metode IPC adalah 'pipe'.
     Pipe merupakan komunikasi sekuensial antar proses yang saling terelasi, namun pipe memiliki kelemahan yaitu hanya bisa digunakan untuk komunikasi antar proses yang saling berhubungan, dan komunikasinya yang dilakukan adalah secara sekuensial. Urutan informasi yang ada dalam sebuah pipe ada yang mirip dengan antrian queue. Jika komunikasi yang diinginkan adalah komunikasi dua arah maka kita harus membuat dua pipe, karena sebuah pipe hanya bisa digunakan untuk komunikasi satu arah saja. 
     Ada 2 jenis pipe, yaitu Named Pipe dan Unnamed Pipe. Namun metode pipe yang sering digunakan adalah named pipe. Keuntungan named pipe adalah kemampuan untuk mengkomunikasikan dua proses yang dimulai secara independent, dimana salah satu proses tidak fork off sebuah proses baru.
     Named pipe bisa juga disebut FIFO karena prinsip kerjanya FIFO. Data yang pertama kali ditulis di pipe adalah data yang pertama dibaca.  Named pipe digunakan untuk 2 proses yang berjalan sendiri-sendiri dan hanya bisa digunakan pada proses-proses yang menggunakan filesystem yang sama. Secara umum, named pipe yaitu metode yang menggunakan file bertipe pipe file yang diciptakan terlebih dahulu oleh salah satu proses dengan menggunakan mkfifo, kemudian proses yang lain membacanya.

Berikut adalah langkah-langkah membuat named pipe :


Write Process :
1. Deklarasi variabel
     Variabel pertama bertype char pointer (char *fifo), di mana variabel fifo tersebut berisi lokasi yang akan digunakan untuk membuat file pipe, misal lokasinya adalah "/tmp/fifo/". Maka deklarasinya adalah :

               char *fifo = "/tmp/fifo/";

     Variabel kedua adalah variabel bertype integer yang akan digunaka untuk membuka file pipe tadi (int fd) dan juga variabel array of integer untuk ditulis ke dalam file pipe tersebut (arr[100]). Maka deklarasinya adalah :

               int fd,arr[100];

2. Membuat file pipe
     File pipe bisa dibuat melalui perintah mkfifo, di mana salah satu parameternya adalah 0666, yaitu menandakan bahwa file pipe tersebut bisa di read dan write.

               mkfifo(fifo,0666);

3. Membuka file pipe
     File pipe yang tadi telah kita buat kemudian dibuka dengan menggunakan perintah "open", lalu dimasukkan ke dalam variabel integer yang telah kita buat tadi.Parameter ke dua isikan dengan "O_WRONLY" yang dimaksudkan untuk file tersebut dibuka dengan dalam mode write only.

               fd = open(fifo,O_WRONLY);

4. Menuliskan isi file pipe
     Menuliskan isi file pipe bisa menggunakan perintah "write".

               write (fd,arr,sizeof(arr));

5. Menutup file pipe
     Menutup file pipe bertujuan agar file pipe tersebut tidak akan diakses terus menerus. Menutup file pipe menggunakan perintah "close"

               close(fd);

6. Menghapus file pipe
     Menghapus file pipe menggunakan perintah "unlink";
  
               unlink(fifo);

Read Process :


1. Deklarasi variabel

     Variabel pertama bertype char pointer (char *fifo), di mana variabel fifo tersebut berisi lokasi yang telah digunakan untuk membuat file pipe, misal lokasinya adalah "/tmp/fifo/". Maka deklarasinya adalah :

               char *fifo = "/tmp/fifo/";

     Variabel kedua adalah variabel bertype integer yang akan digunaka untuk membuka file pipe tadi (int fd) dan juga variabel array of integer untuk ditulis ke dalam file pipe tersebut (arr[100]). Maka deklarasinya adalah :

               int fd,arr[100]; 
2. Membuka file pipe
     File pipe yang tadi telah kita buat kemudian dibuka dengan menggunakan perintah "open", lalu dimasukkan ke dalam variabel integer yang telah kita buat tadi.Parameter ke dua isikan dengan "O_RDONLY" yang dimaksudkan untuk file tersebut dibuka dengan dalam mode read only.



               fd = open(fifo,O_RDONLY);

3. Membaca isi file pipe
     Membaca isi file pipe bisa menggunakan perintah "read".



               read (fd,arr,sizeof(arr));

4. Menutup file pipe
     Menutup file pipe bertujuan agar file pipe tersebut tidak akan diakses terus menerus. Menutup file pipe menggunakan perintah "close"

               close(fd);

Kode Program

Write Process :

               char *fifo = "/tmp/fifo/";
               int fd,arr[100];
               mkfifo(fifo,0666);
               fd = open(fifo,O_WRONLY);
               write (fd,arr,sizeof(arr));
               close(fd);
               unlink(fifo);

Read Process :

               char *fifo = "/tmp/fifo/";
               int fd,arr[100]; 
               fd = open(fifo,O_RDONLY);
               read (fd,arr,sizeof(arr));
               close(fd);


Shared Memory

Shared memory adalah memori yang dapat diakses secara bersamaan oleh beberapa program  dengan maksud untuk menyediakan komunikasi di antara mereka atau menghindari salinan yang berlebihan. Tergantung pada konteks, program dapat berjalan pada satu prosesor atau beberapa prosesor yang terpisah.     Merupakan salah satu cara komunikasi antar proses dengan cara mengalokasikan suatu alamat memori untuk dipakai berkomunikasi antar proses. Alamat dan besar alokasi memori yang digunakan biasanya ditentukan oleh pembuat program. Pada metode ini, sistem akan mengatur proses mana yang akan memakai memori pada waktu tertentu sehingga pekerjaan dapat dilakukan secara efektif.

     Ada 2 cara untuk menggunakan shared memory, yaitu :
  • Menggunakan mmap()
  • Menggunakan shmget() -> lebih populer

Langkah - langkah membuat shared memory :

  1. Membuat segment di memory dengan shmget() 
  2. Mendaftarkan (attach) segment ke data space dari proses dengan shmat() 
  3. Tulis/Baca dari memori 
  4. Detach segment dari data space dari proses dengan shmdt()
Penjelasan fungsi :

1. shmget();
          System call untuk membuat suatu segmen shared memory

#include <sys/ipc.h>
#include <sys/shm.h>
int shmget(key_t key, size_t size, int shmflg); 

          shmflg bisa diisi dengan : IPC_CREATE, IPC_EXCL, permission

2. shmat();
           System call untuk mendaftarkan segment shared memory ke dalam data space dari suatu proses

#include <sys/types.h>
#include <sys/shm.h>
void *shmat(int shmid, const void *shmaddr, int shmflg); 

Parameter :
shmid → ID dari shared memory
shmaddr → Lokasi shared memory di main memory
jika NULL akan dicarikan lokasi pada memory yang ingin ditempati 

Return :
Pointer ke lokasi shared memory

3. shmdt();
            System call untuk melepaskan shared memory segment dari data space dari proses.

#include <sys/types.h>
#include <sys/shm.h>
int shmdt(const void *shmaddr); 

Parameter :
shmaddr → pointer ke lokasi shared memory 

Return :
0 → sukses
(void *) -1 → error

4. shmctl();
           System call untuk mengetahui atau merubah informasi yang berkaitan dgn suatu shared memory

#include <sys/ipc.h>
#include <sys/shm.h>
int shmctl(int shmid, int cmd, struct shmid_ds *buf);

Argument cmd bisa berisi : 

IPC_STAT : mengambil informasi ttg shared memory segment
IPC_SET : mengubah informasi ttg shared memory segment
IPC_RMID : menandai suatu segment untuk dibuang ketika semua process yang menggunakannya sudah melepasnya
SHM_LOCK : Lock suatu segment, membuatnya tidak bisa di-swap
SHM_UNLOCK : Unlock suatu segment

Program Tambahan untuk IPC

     Ada 2 program tambahan yang berguna untuk melihat apa yang terjadi pada IPC yang dibuat :
  1. ipcs 
    Menyediakan informasi yang berkaitan dengan IPC yang sedang digunakan (message queue, shared memory, semaphore)
  2. ipcrm 
    Menghapus IPC tertentu (message queue, shared memory, semaphore)

No comments:

Post a Comment