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.
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 :
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);
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 :
Ada 2 cara untuk menggunakan shared memory, yaitu :
- Menggunakan mmap()
- Menggunakan shmget() -> lebih populer
Langkah - langkah membuat shared memory :
- Membuat segment di memory dengan shmget()
Mendaftarkan (attach) segment ke data space dari proses dengan shmat()
Tulis/Baca dari memori
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);
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);
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);
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 :
Program Tambahan untuk IPC
Ada 2 program tambahan yang berguna untuk melihat apa yang terjadi pada IPC yang dibuat :
- ipcs
Menyediakan informasi yang berkaitan dengan IPC yang sedang digunakan (message queue, shared memory, semaphore)
- ipcrm
Menghapus IPC tertentu (message queue, shared memory, semaphore)
No comments:
Post a Comment