Selasa, 12 April 2011

Sistem Tersebar

SISTEM TERSEBAR




1. Pendahuluan
Sistem tersebar adalah sistem yang terdiri atas sekumpulan komputer yang masing-masing berdiri sendiri namun tampak dari sisi pengguna sebagai sistem dengan komputer tunggal. [TAN 95] Sistem ini merupakan gagasan yang lahir dari keinginan untuk mengatasi kekurangan yang ada pada sistem terpusat (centralized systems) maupun pada komputer pribadi (personal computer).
Model yang telah umum digunakan pada sistem tersebar adalah model berorientasi objek dan model client-server. Pada model berorientasi objek, masing-masing sumber daya yang ada dalam sistem dipandang sebagai suatu objek yang dapat diakses dengan cara tertentu. Model ini memberi keuntungan pemrograman berorientasi objek dalam penggunaan ulang kode. Sedangkan model yang paling banyak digunakan adalah model client-server. Gagasan utama dalam model client-server adalah pembentukan struktur sistem sebagai sekumpulan proses yang bekerja sama, yaitu server, yang menawarkan pelayanan kepada para pengguna, yaitu client. Entitas dasar dalam model ini adalah proses-proses server sebagai pengelola sumber-sumber daya dan proses-proses client yang meminta akses ke sumber-sumber daya tersebut. Sebuah proses dapat menjadi server maupun client. Proses client menggunakan sumber daya dengan mengirim request ke server. Proses server mengerjakan request untuk keperluan client. [ROB 96]


Mesin-mesin dalam sistem tersebar saling berkomunikasi menggunakan protokol. Pada dasarnya protokol adalah persetujuan semua pihak yang berkomunikasi tentang bagaimana komunikasi harus dilakukan. [TAN 96] Sebagai langkah awal standardisasi protokol internasional, ISO (International Standards Organization) menciptakan model Referensi OSI (Open Systems Interconnection). Satu kelemahan penggunaan model OSI adalah bahwa pada waktu model referensi itu diterima, telah banyak jaringan yang sudah mapan. Oleh karena itu banyak organisasi yang jaringan komputernya tidak begitu sesuai dengan model OSI. Sebagian besar dari mereka menggunakan model TCP/IP.
Komunikasi di antara entitas-entitas yang ada dalam sistem tersebar merupakan hal yang penting untuk dipertimbangkan dalam perancangan, karena berpengaruh terhadap karakteristik sistem. Pada tulisan ini dibahas beberapa strategi komunikasi dalam sistem tersebar, khususnya sistem dengan model client-server. Disajikan studi kasus berupa pengiriman kondisi beban beberapa CPU (CPU loads) ke sebuah mesin pencatat yang ada pada sistem. Kemudian diberikan dua alternatif strategi komunikasi yang sangat berbeda sebagai contoh penyelesaian. Alternatif pertama ditulis dalam Bahasa C, sedang alternatif kedua ditulis dalam Bahasa Perl. Keduanya diimplementasikan di lingkungan Linux Red Hat 6.2.

2. Strategi-strategi Komunikasi
Secara umum terdapat dua kelas protokol komunikasi tingkat rendah yang menyediakan paradigma client-server yaitu protokol berorientasi koneksi (connection oriented) dan protokol tanpa koneksi (connectionless). Kedua protokol tersebut dikatakan sebagai protokol tingkat rendah karena komunikasi antara client dan server dapat dilihat atau ditelusuri. Dengan kata lain, pada saat menulis program, server dan lokasinya disebutkan secara eksplisit.
Dalam model komunikasi berorientasi koneksi, server menunggu permintaan koneksi dari client. Setelah koneksi ditetapkan, komunikasi terjadi melalui handle (file descriptor). Salah satu kelemahan protokol berorientasi koneksi adalah setup overhead. Pada protokol tanpa koneksi overhead seperti itu tidak terjadi, namun protokol tanpa koneksi mempunyai kelemahan lain yaitu tidak ada jaminan bahwa pesan yang dikirimkan akan sampai di tujuan (unreliable).
Komunikasi client-server yang paling sederhana dapat digambarkan sebagai hubungan dengan port komunikasi tunggal sebagaimana ditunjukkan Gambar 2. Jika client dan server menggunakan filesystem bersama dan bekerja di mesin yang sama, port tunggal tersebut dapat menjadi antrian yang bersifat FIFO (first in first out).



Pada saat server diaktifkan (starts up), server membuka antriannya dengan cara membuat hubungan socket ke port, dan menunggu (listen) permintaan layanan (request) dari client. Pada saat client butuh layanan, client membuat hubungan socket ke port server dan menulis request. Server lalu menyediakan layanannya. Pendekatan dengan port tunggal seperti ini akan bekerja dengan baik sepanjang jumlah client hanya satu dan client tidak minta balasan (reply). Jika ada lebih dari satu client, harus ada semacam konvensi untuk mengirimkan identitas proses client sedemikian rupa sehingga server dapat membedakan request dari client yang satu dengan request dari client yang lain.
Port tunggal saja tidak cukup jika ada kasus di mana client meminta respon dari server, sebab tidak ada mekanisme bagi client untuk menentukan mana respon yang ditujukan untuknya. Misalkan server menggunakan antrian tunggal untuk mengirimkan respon kepada client, maka masing-masing client butuh channel khusus.




Dalam penerapannya, server membuka antrian untuk client tertentu dengan menyatukan identitas proses client ke dalam antrian respon. Client membuat request yang mengandung identitas dan membuka hubungan berupa antrian lain untuk membaca respon server.
Jika client dan server membutuhkan interaksi tambahan selama pemrosesan request, maka digunakan channel komunikasi dua arah yang privat yang tidak membolehkan pertukaran informasi tentang identitas proses dari pesan yang satu ke pesan yang lain. Protokol berorientasi koneksi menggunakan mekanisme hand-off untuk menetapkan channel komunikasi di antara client dan server.



Mekanisme hand-off yang mana request client pertama-tama hanya digunakan melulu untuk menetapkan channel komunikasi dua arah yang privat namun tidak diidentifikasi oleh identitas proses client. Channel bersifat privat, dalam arti tidak bisa diakses proses-proses lain.
Setelah server menerima request dan menetapkan channel komunikasi, maka ia dapat menggunakan strategi-strategi yang berbeda untuk menangani request. Strategi yang dibahas dalam tulisan ini adalah strategi server serial, strategi forking, dan strategi multithread.
Strategi server serial menangani request secara total dan sekuensial. Apabila ada request datang maka request akan ditangani sampai selesai, baru kemudian server menangani request berikutnya. Tentu saja server yang sibuk sebagaimana transfer-transfer file tidak dapat menggunakan strategi server serial ini karena ia hanya memperbolehkan satu request dilayani pada suatu saat.
Pada strategi forking, server ayah (parent) membuat anak (child) untuk menangani request yang datang, kemudian server kembali mendengarkan port kalau-kalau ada request-request berikutnya, seperti digambarkan pada Gambar 5. Strategi forking ideal untuk layanan-layanan seperti transfer file, yang membutuhkan perioda waktu relatif lama dan melibatkan banyak blocking. Karena layanan aktual ditangani oleh server anak, maka server ayah dapat menerima lebih banyak request.

(a) Strategi forking.
(b) Strategi multithread.

Strategi server multithread merupakan alternatif strategi server dengan overhead yang rendah. Server tidak melakukan forking untuk menangani request, melainkan membuat sebuah thread baru dalam ruang prosesnya. Pendekatan ini dapat sangat efisien, khususnya untuk request yang relatif kecil atau I/O yang intensif. Kelemahan strategi ini adalah adanya kemungkinan interferensi di antara banyak request dalam penggunaan bersama ruang alamat (address space). Untuk itu rancangan server harus mempunyai paralelisme tingkat kernel yang cukup memadai sehingga strategi ini dapat bekerja dengan baik.

3. Studi Kasus
Sebuah sistem tersebar, katakanlah X, mempunyai skema seperti tampak pada Gambar 6. Diinginkan pencatatan beban CPU pada mesin 2, mesin 3, dan mesin 4. Hasil pencatatan dikirimkan ke mesin 1.


Persoalan di atas dapat dianalogikan dengan persoalan pembaca dan penulis (readers and writers problem). Terdapat beberapa ketentuan yang harus ditaati pada kasus ini.
1. Pembaca diperbolehkan membaca apabila file dalam keadaan
a) sedang dibaca oleh pembaca lain,
b) tidak sedang ditulis,
c) tidak sedang dibaca dan tidak sedang ditulis.
2. Penulis diperbolehkan menulis apabila file dalam keadaan
a) tidak sedang dibaca,
b) tidak sedang ditulis oleh penulis lain,
c) tidak sedang dibaca dan tidak sedang ditulis.
Ketentuan tersebut memuat arti bahwa apabila file sedang ditulis, maka hanya ada satu penulis yang bisa mengakses file. Dengan kata lain, apabila file sedang ditulis, tidak satupun dari pembaca maupun penulis boleh mengakses file. Apabila file sedang dibaca, kemudian datang pembaca lain maka pembaca lain yang datang boleh ikut membaca, penulis tidak boleh ikut menulis. Dan apabila file sedang tidak dibaca dan tidak ditulis, maka siapapun yang datang baik pembaca maupun penulis dapat mengakses file tersebut.
Algoritma yang digunakan untuk menyelesaikan masalah tersebut dituliskan pada program 1. Ada dua karakteristik penting algoritma pemrograman konkuren yang berlaku untuk kasus ini.
(1) Tidak ada asumsi tentang kecepatan proses.
(2) Setiap proses akan dilaksanakan sampai selesai.


Program 1. Algoritma pembacaan dan penulisan catatan beban CPU.


Terdapat dua antrian pada algoritma tersebut, yaitu mutex dan F. Dalam kasus ini mutex tidak hanya digunakan sebagai pembatas jumlah proses yang boleh masuk ke dalam seksi kritis, melainkan juga digunakan sebagai antrian bagi para pembaca selain pembaca pertama. Pembaca pertama mengantri pada antrian F, bersama-sama dengan para penulis.

Ada dua macam penyelesaian persoalan ditinjau dari protokol tingkat rendah yang telah dibahas. Penyelesaian pertama menggunakan protokol berorientasi koneksi, yaitu TCP, penyelesaian kedua menggunakan protokol tanpa koneksi, yaitu UDP. Pemilihan mesin tertentu sebagai client atau sebagai server semata-mata berdasarkan atas kaidah bahwa client adalah pengirim request dan server adalah pelaksana request atau pengirim reply.
Apabila digunakan protokol berorientasi koneksi maka ada dua alternatif solusi yaitu penggunaan strategi server forking dan strategi server multithread. Strategi server serial tidak bisa digunakan, karena server serial hanya melayani satu client pada suatu saat. Kelemahan strategi forking adalah terlalu banyak overhead pada penciptaan proses baru. Bagi sistem yang tidak terlalu banyak pengunjung, kelemahan ini dapat diabaikan karena jumlah client hanya tiga, sehingga hanya butuh penciptaan tiga proses baru. Strategi server multithread juga dapat digunakan namun dibutuhkan kehati-hatian agar tidak terjadi interferensi antar thread.


Apabila digunakan protokol tanpa koneksi, tidak ada jaminan bahwa catatan akan sampai ke alamat tujuan. Namun pada sistem-sistem yang mempunyai sangat banyak pengunjung, penggunaan protokol tanpa koneksi lebih menguntungkan sebab tidak membebani jaringan.


4. Implementasi
Antarmuka socket yang pertama berasal dari BSD UNIX versi 4.1c di awal tahun 1980-an. Spec 1170 menggunakan versi 4.3 BSD, dan kemudian menyusul standar socket POSIX. [ROB 96]
Untuk menggunakan panggilan-panggilan socket dalam Bahasa C, program di-compile dengan opsi library -lsocket dan -lnsl. Semua panggilan sistem yang berhubungan dengan socket akan menghasilkan nilai -1 jika gagal dan men-set variabel eksternal errno.
Server menangani request dengan membuat handle (socket), mengasosiasikannya dengan lokasi fisik pada jaringan lokal (bind), dan men-set up ukuran antrian untuk request yang akan datang (listen). Kemudian server menerima request dari client (accept). Fungsi-fungsi tersebut selengkapnya disajikan pada Program 2.


#include
#include

int socket (int domain, int type, int protocol);
int bind (int s, const struct sockaddr *address,
size_t address_len);
int listen (int s, int backlog);
int accept (int s, struct sockaddr *address,
int *address_len);
int connect (int s, struct sockaddr *address,
size_t address_len);
int close (int s);


Program 2. Fungsi-fungsi utama socket dalam sintaks C.


Client juga membuat suatu handle (socket) lalu mengasosiasikannya dengan lokasi jaringan server (connect). Handle yang dibuat oleh server dan client tersebut, yang juga disebut sebagai titik awal dan titik akhir transmisi (transmission endpoints), merupakan sebuah file descriptor. Dengan kata lain, panggilan socket menentukan titik-titik komunikasi dan menghasilkan file descriptor. Setelah client dan server menetapkan koneksi, mereka berkomunikasi menggunakan panggilan read dan write.
Pada fungsi socket, domain adalah nama keluarga protokol. Untuk komunikasi antar proses yang berlangsung pada sistem UNIX tunggal, digunakan domain AF_UNIX, sedang untuk komunikasi antar proses yang berada pada host yang berlainan melalui Internet digunakan domain AF_INET. Nilai type SOCK_STREAM merupakan implementasi TCP yang bersifat reliable, dua arah, byte streams kontigu, dan berorientasi koneksi. Untuk implementasi UDP yang bersifat unreliable, tanpa koneksi, panjang message tetap, digunakan type SOCK_DGRAM. Parameter protokol biasanya diberi nilai 0.
Fungsi bind() mengasosiasikan titik akhir transmisi atau menangani koneksi jaringan secara fisik. Koneksi fisik untuk domain Internet adalah nomor port, dan koneksi fisik untuk domain UNIX tunggal adalah pathname. Parameter s adalah file descriptor yang dihasilkan oleh fungsi socket, sedangkan address_len adalah jumlah bytes dalam struktur *address. Struktur *address berisi nama keluarga dan informasi protokol tertentu. Domain Internet menggunakan struct sockaddr_in untuk struct sockaddr, yang didefinisikan dalam Program 3.
Pada domain Internet, sin_family adalah AF_INET, sin_port adalah nomor port, sin_addr dapat di-set INADDR_ANY apabila digunakan untuk komunikasi dari host sembarang. Array sin_zero merupakan struktur umum yang mencirikan struct sockaddr.
Seperti telah disebutkan di atas bahwa satu server dapat memproses banyak permintaan komunikasi untuk port tertentu dengan forking atau multithread. Pada saat server memproses permintaan komunikasi untuk client, ia tidak dapat merespon request yang lain. Fungsi listen() menentukan berapa banyak request client yang dapat didaftarkan kembali sebelum server menolak permintaan hubungan. Apabila server menolak permintaan hubungan, client menerima ECONNREFUSED.
Setelah mengasosiasikan titik akhir transmisi atau menangani koneksi jaringan secara fisik, server menunggu client untuk menginisiasi hubungan dengan fungsi accept(). Sedang fungsi connect() digunakan client untuk menetapkan link ke port tertentu pada server. Pemutusan hubungan dilakukan dengan fungsi close().



struct sockaddr_in {
short sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};


Program 3. Struktur identitas host untuk domain Internet.

Perl menyediakan antarmuka tingkat tinggi dalam pengelolaan socket. Ia mempunyai fungsi-fungsi built-in yang diharapkan mencakup dua keuntungan sekaligus. [CHR 98]
1) Bagus untuk pemrograman tingkat rendah, dalam arti dapat secara langsung mengakses sistem.
2) Menyediakan cara pemrograman yang lebih menyenangkan dibanding dengan bahasa pada tingkat yang lebih rendah.
Fungsi socket membuat socket, fungsi bind memberi alamat lokal pada socket, fungsi connect menghubungkan socket lokal dengan socket yang hendak dihubungi, fungsi listen membaca sebuah permintaan hubungan dari socket lain. Fungsi accept menerima hubungan satu per satu.
Beberapa fungsi utama socket dalam sintaks Perl disajikan pada Program 4. Pada fungsi socket, name adalah nama socket, domain adalah PF_INET, PF_UNIX, atau PF_LOCAL, type dapat dipilih salah satu dari SOCK_DGRAM atau SOCK_STREAM, sedang protocol dapat diisi ‘tcp’ atau ‘udp’ sesuai dengan protocol yang digunakan. Pada fungsi bind, name adalah nama socket dan address merupakan alamat lokal yang diasosiasikan. Pada fungsi listen, name adalah nama socket, backlog adalah integer yang telah tertentu. Fungsi accept memilih sebuah nama yang berusaha meminta koneksi ke socket dengan nama name. Fungsi connect digunakan oleh client untuk meminta koneksi kepada server, fungsi close untuk memutus hubungan socket.


use Socket;

int socket (name, domain, type, protocol);
int bind (name, address);
int listen (name, backlog);
int accept (name_selected, name);
int connect (name, address);
int close (name);


Program 4. Beberapa fungsi utama socket dengan sintaks Perl.

5. Penutup
Masing-masing strategi komunikasi di antara client dan server mempunyai sifat tertentu, yang memuat kelebihan dan kekurangan. Pemilihan strategi biasanya didasarkan atas jenis data yang akan ditransmisi melalui hubungan tersebut. Kesalahan pemilihan strategi mengakibatkan utilitas sistem tidak optimal. Dengan kata lain, ketepatan pemilihan strategi komunikasi dapat meningkatkan utilitas sistem, dan dengan demikian akan meningkatkan performansi sistem.
Pada penyelesaian kasus yang diberikan, pemilihan bahasa pemrograman bukan hal yang esensial. Aspek penting yang menjadi pertimbangan antara lain tingkat abstraksi baik data maupun logika yang berbeda-beda antara pemrogram yang satu dan pemrogram yang lainnya.
Terima kasih atas koreksi pada kode Perl yang diberikan Bp. Edwin Pratomo untuk implementasi UDP. Juga atas saran pengujian pada kode C untuk implementasi TCP.


Daftar Pustaka

1) [CHR 98] Christiansen, Tom; Torkington, Nathan, 1998, Perl Cookbook, O’Reilly & Associates, Inc.
2) [ROB 96] Robbins, Kay A.; Robbins, Steven, 1996, Practical Unix Programming, Prentice-Hall, Inc.
3) [STE 98] Stevens, Richard A., 1998, Unix Network Programming, Prentice-Hall, Inc.
4) [TAN 95] Tanenbaum, Andrew S., 1995, Distributed Operating Systems, Prentice-Hall, Inc.
5) [WAL 91] Wall, Larry; Schwartz, Randall L., 1991, Programming Perl, O’Reilly & Associates, Inc.