Home
CS
Showing posts with label CS. Show all posts
Showing posts with label CS. Show all posts
SEKILAS TENTANG CORBA
Common Object Request Broker Architecture (CORBA) adalah teknologi yang dipergunakan untuk heterogeneous computing (sistem komputer dengan berbagai macam
lingkungan). CORBA pada dasarnya menggunakan arsitektur client-server dimana klien dan server berupa objek. CORBA mendukung apa yang disebut interoperabilitas, yaitu kemampuan saling bekerjasama antar sistem computer.
CORBA berbeda dengan RMI, berikut perbedaan CORBA dengan RMI:
lingkungan). CORBA pada dasarnya menggunakan arsitektur client-server dimana klien dan server berupa objek. CORBA mendukung apa yang disebut interoperabilitas, yaitu kemampuan saling bekerjasama antar sistem computer.
CORBA berbeda dengan RMI, berikut perbedaan CORBA dengan RMI:
- CORBA adalah dapat diimplementasikan dengan sembarang bahasa pemrograman.
- CORBA terdiri dari beberapa mekanisme dimana RMI dapat termasuk di dalamnya.
- Pada RMI tidak menggunakan ORB (Object Request Broker).
Kenapa ada CORBA?
- Dapat menangani keberagaman lingkungan antara klien dan server (dapat diimplementasikan pada bahasa pemrograman yang berbeda). Hal ini karena CORBA menggunakan apa yang disebut antarmuka (interface) untuk menjembatani dua buah lingkungan yang berbeda.
Object Request Broker (ORB) merupakan inti dari CORBA dan bertanggung jawab untuk menjalankan semua mekanisme yang dibutuhkan, yaitu:
- Menemukan implementasi objek untuk memenuhi suatu request
- Menyiapkan implementasi objek untuk menerima suatu request
- Melakukan komunkasi data untuk memenuhi suatu request
Sebuah permintaan (request) yang dikirimkan suatu client ke suatu object implementation akan melewati ORB. Dengan ORB, yang terdiri dari interface, suatu client dapat berkomunikasi dengan object implementation tanpa adanya batasan platform, teknologi jaringan, bahasa pemrograman, dan letak objek. Dengan menggunakan ORB, objek client bisa meminta sebuah method pada sebuah object server yang bisa saja terdapat dalam satu mesin maupun jaringan yang berbeda. ORB menerima panggilan dan menemukan objek yang bisa mengimplementasikan permintaan, mengirim parameter, invoke method, dan mengembalikan hasil yang diperoleh.
Objek-objek CORBA dispesifikasikan menggunakan interface, yang merupakan penghubung anatara client dan server. Interface Definition Language (IDL) digunakan untuk mendefinisikan interface tersebut. IDL menentukan tipe-tipe suatu objek dengan mendefinisikan interface-interface objek tersebut. Sebuah interface terdiri dari kumpulan operasi dan parameter operasi tersebut. IDL hanya mendeskripsikan interface, tidak mengimplementasikannya. Meskipun sintaks yang dimiliki oleh IDL menyerupai sintaks bahasa pemrograman C++ dan Java., perlu diingat, IDL bukan bahasa pemrograman.
Objek-objek CORBA dispesifikasikan menggunakan interface, yang merupakan penghubung anatara client dan server. Interface Definition Language (IDL) digunakan untuk mendefinisikan interface tersebut. IDL menentukan tipe-tipe suatu objek dengan mendefinisikan interface-interface objek tersebut. Sebuah interface terdiri dari kumpulan operasi dan parameter operasi tersebut. IDL hanya mendeskripsikan interface, tidak mengimplementasikannya. Meskipun sintaks yang dimiliki oleh IDL menyerupai sintaks bahasa pemrograman C++ dan Java., perlu diingat, IDL bukan bahasa pemrograman.
CORBA mendefinisikan IIOP (Internet Inter-ORB Protocol) untuk mengatur bagaimana objek berkomunikasi melalui jaringan. IIOP merupakan open protocol yang berjalan diatas TCP/IP.
Pada Java, CORBA merupakan pelengkap untuk menyediakan framework distribusi objek, services pendukung framework itu, dan kemampuan antar operasi dengan bahasa pemrograman lainnya. CORBA untuk client-server menggunakan protokol IIOP (Internet InterORB Protocol) untuk komunikasi antara server dan klien.
Arsitektur CORBA adalah sebagai berikut:

Skeletons adalah bagian kode yang dibangin pada kode implementasi server pada antarmuka (interface). Stub adalah bagian kode yang membuat antarmuka (interface) dapat diakse (available) oleh klien.
Java menyediakan ORB (Object Request Broker) yang mendukung teknologi CORBA. ORB adalah komponen runtime yang dapat digunakan untuk distributed computing menggunakan komunikasi IIOP. OMG (Object Management Group) adalah industri yang membuat spesifikasi dan mempublikasikan CORBA.
Java IDL (Interface Definition Langauge) merupakan sebuah teknologi untuk distribusi
objek yang berinteraksi antar platform. CORBA menggunakan IDL untuk membuat antarmuka (interface). Java IDL adalah implementasi dari teknologi antarmuka pada CORBA. Model pemrograman IDL atau biasa disebut Java IDL terdiri dari ORB CORBA dan kompiler idlj yang memetakan OMG IDL ke Java dengan menggunakan Java CORBA ORB. Aplikasi CORBA dibuat dengan menggunakan IDL untuk mendefinisikan antarmuka objek agar dapat diakses oleh klien maupun server.
PEMBAHASAN PROBILITAS
Sebelum Anda melakukan trading yang sebenarnya, ada baiknya bila kita membahas masalah probabilitas secara lebih mendalam sekali lagi guna memaksimalkan teknik Anda di dalam melakukan trading.
Pada bab sebelumnya telah diberikan illustrasi kasus mengenai probabilitas dengan pelemparan koin secara acak untuk mendapatkan suatu data statistik tentang kemungkinan muka koin yang akan muncul di tangan kita. Apakah kita akan mendapatkan sisi koin yang bergambar atau sisi koin yang menunjukkan angka.
Pada pelemparan koin, kita hanya akan mendapatkan 2 kemungkinan atas apa yang kita lakukan terhadap koin tersebut, yaitu gambar atau angka.
Di dalam pendekatan statistik, probabilitas yang akan kita dapatkan adalah sama. Bila Anda melempar koin tersebut, Anda dapat mencatat berapa kali muncul gambar dan berapa kali muncul angka. Dari catatan yang Anda dapatkan mungkin Anda akan merasa bahwa eksperimen yang Anda lakukan merupakan suatu bentuk perjudian sederhana. Namun demikian apa yang Anda lakukan tersebut merupakan suatu eksperimen yang baik tentang probabilitas.
Jika Anda melakukan eksperimen pelemparan koin, misalkan saja, sebanyak 10 kali, maka berikut adalah kemungkinan data berapa kali sisi gambar akan muncul dan berapa kali sisi angka akan muncul:
Gambar
|
Angka
|
10
|
0
|
9
|
1
|
8
|
2
|
7
|
3
|
6
|
4
|
5
|
5
|
4
|
6
|
3
|
7
|
2
|
8
|
1
|
9
|
0
|
10
|
Dari tabel di atas, menurut Anda. manakah sisi koin yang paling berpeluang muncul dari pelemparan koin sebanyak 10 kali? Sekarang coba Anda amati tibel di atas. Di situ nampak bahwa kita akan mendapatkan suatu kombinasi probabilitas yang sama antara peluang munculnya sisi gambar dan sisi angka.
Jika Anda ingin menguji sekali lagi apa yang telah Anda lakukan dengan meminta tolong orang lain untuk melakukan hal yang sama seperti yang Anda lakukan, cobalah Anda bandingkan antara data yang Anda dapatkan dengan data yang didapatkan orang tersebut. Apakah Anda mendapatkan hasii yang sama?
Pertanyaan di atas adalah harus Anda kemukakan ketika Anda ingin mempelajari lebih lanjut tentang probabilitas. Kita akan membahas bersama untuk mengkaji lebih lanjut tentang probabilitas ini.
Ketika Anda melakukan pelemparan koin tersebut sebanyak 1 kali, atau sebanyak 10 kali, maka jawaban yang akan kita dapatkan tentang probabilitas adalah sama, karena masing-masing sisi koin memiliki peluang yang sama, untuk muncul. Dengan kondisi ini kita telah mendapatkan suatu prediksi tentang probabilitas sisi koin mana yang akan muncul. Jika misalnya koin tersebut cacat sehingga pada saat kita lemparkan ternyata sisi tertentu dari koin menjadi lebih sering muncul maka kita akan kesulitan untuk melakukan prediksi. Sekilas hal ini tampak aneh dan kontradiktif, karena dengan adanya cacat pada koin maka kita harus mempelajari perilaku atau karakter dari koin yang cacat itu. Jika kita melemparkan koin cacat tersebut sebanyak 1000 kali, misalnya, maka bisa jadi kita akan mendapatkan sisi gambar muncul sebanyak 700 kali dibanding sisi angka sebanyak 300 kali. Jika hal itu yang terjadi maka biasanya kita akan segera berkesimpulan bahwa kita dengan mudah dapat memprediksikan hasil pelemparan koin cacat tersebut, meskipun kenyataan tidaklah demikian. Sekali lagi kita harus mengerti dan memahami karakter dari koin cacat tersebut sebelum kita melakukan prediksi dan itu tidak semudah jika kita melakukannya terhadap koin yang tidak cacat.
Dari uji coba pelemparan koin di atas kita mencatat bahwa hasil dari setiap pelemparan koin merupakan suatu peristiwa independen. Tidak ada faktor apapun yang mempengaruihi hasil dari uji pelemparan koin. Berapa kalipun Anda melakukan uji pelemparan, angka probabilitas sisi koin mana yang akan muncul adalah sama. Koin tersebut tidak akan “mengingat” hasil akhir pelemparan sebelumnya. Juga tidak bisa ditentukan sisi mana yang akan muncul pada pelemparan berikutnya. Ini adalah suatu peristiwa yang benar-benar independen.
Akan lain halnya jika kita mengambil suatu contoh kasus lain tentang peristiwa uji coba yang bersifat tidak independen. Katakanlah kita melakukan uji coba terhadap 20 biji kelereng, 19 kelereng berwarna hijau dan hanya 1 yang berwarna merah, dengan ukuran dan berat yang benar-benar sempurna sama. Ketika kita memasukkan semua kelereng tersebut ke dalam sebuah toples lalu kita mencoba mengambil kelereng berwarna merah dengan mata tertutup, berapakah probabilitas keberhasilan kita untuk mendapatkan kelereng merah tersebut? Ketika Anda mulai mengambil kelereng merah tersebut, angka probabilitas yang kita hadapi adalah 1 banding 20. Pada pengambilan pertama bisa jadi kita akan gagal dan kemudian kita mencoba lagi. Kali ini dengan perbandingan 1 banding 19 kerena jumlah kelereng sudah berkurang satu.
Jika kita terus mencoba untuk mengambil kelerengmerah dengan cara yang sama, dan ketika Anda berhasil mengambil kelereng merah sementara yang masih tersisa hanya beberapa biji kelereng hijau, maka permainan telah berakhir. Namun jika Anda gagal dan Anda tidak mengganti kelereng hijau yang terambil dengan kelereng berwama merah maka probabilitasnya adalah sama. Kecuali jika Anda melanjutkan pengambilan kelereng tersebut hingga jumlah kelereng di dalam toples tersebut terus berkurang hingga akhimya menyisakan satu kelereng saja. Dalam hal demikian bukanlah probabilitas lagi yang berlaku, namun sebuah kepastian.
Contoh kasus ini, jika kita bandingkan dengan uji pelemparan koin, sangatlah berbeda kondisinya. Uji pelemparan koin adalah suatu bentuk uji coba yang bersifat independen event dan tidak didasarkan atas suatu kepastian. Dari pembahasan ini saya berharap Anda sudah mendapatkan gambaran yang jelas tentang probabilitas.
Multi Threading dan Multiplexing
Dalam ilmu komputer , sebuah thread eksekusi adalah urutan terkecil instruksi diprogram yang dapat dikelola secara independen oleh sistem operasi scheduler . Sebuah thread adalah proses ringan . Pelaksanaan benang dan proses berbeda dari satu sistem operasi yang lain, tetapi dalam banyak kasus, thread yang terkandung di dalam proses. Beberapa benang bisa ada dalam proses yang sama dan berbagi sumber daya seperti memori , sedangkan berbeda proses tidak berbagi sumber daya tersebut. Secara khusus, benang-benang proses berbagi petunjuk yang terakhir (kode) dan konteksnya (nilai-nilai yang variabel yang referensi pada saat tertentu).
Pada prosesor tunggal, multithreading umumnya terjadi oleh time-division multiplexing (seperti dalam multitasking ): dengan prosesor switch antara benang yang berbeda. Ini switching konteks umumnya terjadi cukup sering bahwa pengguna merasakan benang atau tugas sebagai berjalan pada waktu yang sama. Pada multiprosesor atau multi-core sistem, benang dapat benar-benar bersamaan, dengan setiap prosesor atau inti mengeksekusi thread terpisah secara bersamaan.
Banyak sistem operasi modern langsung mendukung baik waktu-iris dan multiprosesor threading dengan scheduler proses. The kernel dari sistem operasi memungkinkan programmer untuk memanipulasi benang melalui system call interface. Beberapa implementasi yang disebut kernel thread, sedangkan proses ringan (LWP) adalah jenis spesifik kernel thread yang berbagi negara dan informasi yang sama.
Program dapat memiliki benang user-space ketika threading dengan timer, sinyal, atau metode lain untuk menghentikan eksekusi mereka sendiri, melakukan semacam ad-hoc waktu mengiris .
Thread berbeda dari tradisional multitasking proses sistem operasi dalam hal:
proses biasanya independen, sedangkan benang ada sebagai subset dari sebuah proses
proses membawa jauh lebih negara informasi dari benang, sedangkan beberapa thread dalam proses berbagi proses negara serta memori dan lainnya sumber daya
proses memiliki terpisah ruang alamat , sedangkan benang berbagi ruang alamat mereka
proses berinteraksi hanya melalui disediakan sistem komunikasi antar-proses mekanisme
konteks beralih antara benang dalam proses yang sama biasanya lebih cepat daripada konteks beralih antara proses.
Multithreading
Multi-threading adalah pemrograman meluas dan eksekusi model yang memungkinkan beberapa thread untuk tetap eksis dalam konteks sebuah proses tunggal. Benang ini berbagi sumber daya proses, tetapi mampu melakukan secara mandiri. Model threaded menyediakan pengembang dengan abstraksi yang berguna eksekusi konkuren. Namun, mungkin aplikasi yang paling menarik dari teknologi ini bila diterapkan pada proses tunggal untuk memungkinkan eksekusi paralel pada sistem multiprocessing.
Ini keuntungan dari program multithreaded memungkinkan untuk beroperasi lebih cepat pada sistem komputer yang memiliki beberapa CPU , CPU dengan beberapa core, atau melintasi sekelompok mesin - karena benang dari program alami meminjamkan diri untuk benar-benar bersamaan eksekusi . Dalam kasus seperti itu, programmer perlu berhati-hati untuk menghindari kondisi ras , dan perilaku non-intuitif lainnya. Agar data yang akan dimanipulasi dengan benar, benang akan sering perlu untuk pertemuan dalam waktu untuk memproses data dalam urutan yang benar. Thread mungkin juga memerlukan saling eksklusif operasi (sering diimplementasikan menggunakan Semaphore ) untuk mencegah data umum dari yang bersamaan dimodifikasi, atau membaca sementara dalam proses modifikasi. Penggunaan ceroboh primitif tersebut dapat menyebabkan deadlock .
Penggunaan lain multithreading, berlaku bahkan untuk sistem single-CPU, adalah kemampuan untuk sebuah aplikasi untuk tetap responsif terhadap masukan. Dalam program single-threaded, jika blok utama benang eksekusi pada tugas lama berjalan, seluruh aplikasi dapat muncul untuk membekukan. Dengan memindahkan tugas berjalan lama tersebut kepada pekerja thread yang berjalan bersamaan dengan eksekusi thread utama, adalah mungkin untuk aplikasi tetap responsif terhadap input pengguna ketika menjalankan tugas di latar belakang. Di sisi lain, dalam banyak kasus multithreading bukan satu-satunya cara untuk menjaga program responsif, dengan non-blocking I / O dan / atau sinyal Unix yang tersedia untuk mendapatkan hasil yang sama. [1]
Sistem operasi menjadwalkan thread di salah satu dari dua cara:
Preemptive multitasking umumnya dianggap pendekatan unggul, karena memungkinkan sistem operasi untuk menentukan kapan beralih konteks harus terjadi. Kerugian untuk multithreading preemptive adalah bahwa sistem dapat membuat context switch pada waktu yang tepat, menyebabkan kunci konvoi , prioritas inversi atau efek negatif lainnya yang dapat dihindari dengan multithreading koperasi.
Multithreading Koperasi, di sisi lain, bergantung pada benang sendiri untuk melepaskan kontrol setelah mereka berada pada titik berhenti. Hal ini dapat menciptakan masalah jika thread sedang menunggu sumber daya untuk menjadi tersedia.
Sampai akhir 1990-an, CPU dalam komputer desktop tidak memiliki banyak dukungan untuk multithreading, meskipun benang masih digunakan pada komputer tersebut karena beralih antara benang itu umumnya masih lebih cepat daripada proses penuh konteks switch . Prosesor di embedded system , yang memiliki persyaratan yang lebih tinggi untuk real-time perilaku, mungkin mendukung multithreading dengan mengurangi waktu benang-switch, mungkin dengan mengalokasikan dedicated register file untuk setiap thread bukan menyimpan / mengembalikan register file umum. Pada akhir 1990-an, ide melaksanakan instruksi dari beberapa thread secara simultan, yang dikenal sebagai multithreading simultan , telah mencapai desktop dengan Intel 's Pentium 4 prosesor, di bawah nama hiper threading . Telah turun dari Intel Core dan Core 2 arsitektur, tetapi kemudian kembali instated di Core I3 , Core i5 dan i7 arsitektur.
Proses, kernel thread, thread pengguna, dan serat
Artikel utama: Proses (komputasi) dan Serat (ilmu komputer)
Sebuah proses adalah "terberat" unit penjadwalan kernel. Proses sudah memiliki sumber daya yang dialokasikan oleh sistem operasi. Sumber daya termasuk memori, menangani file , soket, perangkat menangani, dan jendela. Proses tidak berbagi ruang alamat atau file sumber daya kecuali melalui metode eksplisit seperti mewarisi menangani file atau segmen memori bersama, atau pemetaan file yang sama dengan cara berbagi. Proses biasanya preemptively multitasked.
Suatu kernel thread adalah "ringan" unit penjadwalan kernel. Setidaknya satu thread kernel ada dalam setiap proses. Jika beberapa thread kernel bisa ada dalam proses, maka mereka berbagi memori yang sama dan sumber daya berkas. Kernel thread yang preemptively multitasked jika sistem operasi proses scheduler adalah preemptive. Kernel thread tidak sumber daya sendiri kecuali tumpukan , salinan register termasuk program counter , dan penyimpanan thread-lokal (jika ada). Kernel dapat menetapkan satu thread untuk masing-masing inti logis dalam sistem (karena setiap prosesor membagi dirinya menjadi beberapa logical core jika mendukung multithreading, atau hanya mendukung satu inti logis per core fisik jika tidak mendukung multithreading), dan dapat menukar benang yang bisa diblokir. Namun, benang kernel memakan waktu lebih lama daripada benang pengguna untuk ditukarkan.
Thread kadang-kadang diimplementasikan dalam userspace perpustakaan, sehingga disebut benang pengguna. Kernel tidak menyadari dari mereka, sehingga mereka dikelola dan dijadwalkan di userspace . Beberapa basis implementasi thread pengguna mereka di atas beberapa thread kernel untuk mendapatkan keuntungan dari multi-prosesor mesin ( M: Model N ). Dalam artikel ini istilah "benang" (tanpa kernel atau petunjuk kualifikasi) defaultnya mengacu pada kernel thread. Benang pengguna seperti yang diterapkan oleh mesin virtual juga disebut benang hijau . Benang Pengguna umumnya cepat untuk membuat dan mengelola, tetapi tidak dapat memanfaatkan multithreading atau multiprocessing dan mendapatkan diblokir jika semua yang terkait thread kernel mereka mendapatkan diblokir bahkan jika ada beberapa thread pengguna yang siap dijalankan.
Serat adalah unit bahkan lebih ringan dari penjadwalan yang kooperatif dijadwalkan : serat berjalan secara eksplisit harus "menyerah" untuk memungkinkan serat lain untuk menjalankan, yang membuat pelaksanaannya jauh lebih mudah daripada kernel atau petunjuk benang. Sebuah serat dapat dijadwalkan untuk berjalan di thread apapun dalam proses yang sama. Hal ini memungkinkan aplikasi untuk mendapatkan peningkatan kinerja dengan mengelola penjadwalan sendiri, bukan mengandalkan pada scheduler kernel (yang mungkin tidak disetel untuk aplikasi). Lingkungan pemrograman paralel seperti OpenMP biasanya menerapkan tugas mereka melalui serat. Terkait erat dengan serat yang coroutines , dengan perbedaan adalah bahwa coroutines adalah membangun bahasa tingkat, sementara serat adalah sistem tingkat membangun.
Thread dan serat isu
Concurrency dan struktur data
Thread dalam proses yang sama berbagi ruang alamat yang sama. Hal ini memungkinkan bersamaan menjalankan kode untuk pasangan erat dan nyaman pertukaran data tanpa overhead atau kompleksitas dari IPC . Bila dibagi antara benang, bagaimanapun, struktur data sederhana bahkan menjadi rentan terhadap bahaya ras jika mereka membutuhkan lebih dari satu instruksi CPU untuk memperbarui: dua benang mungkin berakhir mencoba untuk memperbarui struktur data pada waktu yang sama dan merasa tiba-tiba berubah di bawah kaki. Bugs yang disebabkan oleh bahaya ras bisa sangat sulit untuk mereproduksi dan mengisolasi.
Untuk mencegah hal ini, threading API menawarkan sinkronisasi primitif seperti mutexes untuk mengunci struktur data terhadap akses konkuren. Pada sistem prosesor tunggal, benang berlari ke mutex terkunci harus tidur dan karenanya memicu context switch. Pada sistem multi-prosesor, benang mungkin bukan polling mutex dalam spinlock . Kedua mungkin kinerja getah dan kekuatan prosesor di SMP sistem untuk bersaing untuk bus memori, terutama jika granularity penguncian baik-baik saja.
I / O dan penjadwalan
Benang atau serat pengguna implementasi biasanya sepenuhnya dalam userspace . Akibatnya, konteks beralih antara benang pengguna atau serat dalam proses yang sama ini sangat efisien karena tidak memerlukan interaksi dengan kernel sama sekali: context switch dapat dilakukan dengan lokal menyimpan CPU register yang digunakan oleh thread pengguna yang sedang dijalankan atau serat dan kemudian memuat register yang dibutuhkan oleh thread pengguna atau serat akan dieksekusi. Sejak penjadwalan terjadi di userspace, kebijakan penjadwalan dapat lebih mudah disesuaikan dengan kebutuhan beban kerja program.
Namun, penggunaan sistem memblokir panggilan di thread user (sebagai lawan kernel thread) atau serat dapat menjadi masalah. Jika thread pengguna atau serat melakukan panggilan sistem yang blok, benang pengguna lain dan serat dalam proses tidak dapat berjalan sampai kembali system call. Sebuah contoh khas dari masalah ini adalah ketika melakukan I / O: sebagian besar program yang ditulis untuk melakukan I / O serempak. Ketika operasi I / O dimulai, panggilan sistem dibuat, dan tidak kembali sampai operasi I / O telah selesai. Pada periode intervensi, seluruh proses "diblokir" oleh kernel dan tidak dapat dijalankan, yang kelaparan thread pengguna lain dan serat dalam proses yang sama dari mengeksekusi.
Sebuah solusi umum untuk masalah ini adalah menyediakan I / O API yang mengimplementasikan antarmuka sinkron dengan menggunakan non-blocking I / O internal, dan penjadwalan lain benang pengguna atau serat sementara operasi I / O sedang berlangsung. Solusi serupa dapat disediakan untuk panggilan memblokir sistem lainnya. Atau, program dapat ditulis untuk menghindari penggunaan sinkron I / O atau panggilan memblokir sistem lainnya.
SunOS 4.x diimplementasikan " proses ringan "atau LWPs. NetBSD 2.x +, dan DragonFly BSD menerapkan LWPs sebagai thread kernel (Model 1:1). SunOS 5.2 melalui SunOS 5.8 serta NetBSD NetBSD 2 sampai 4 menerapkan model tingkat dua, multiplexing satu atau lebih benang level pengguna pada setiap thread kernel (M: Model N). SunOS 5.9 dan kemudian, serta NetBSD 5 dieliminasi pengguna dukungan benang, kembali ke model 1:1. [1] FreeBSD 5 diimplementasikan M: Model N. FreeBSD 6 mendukung kedua 1:1 dan M: N, pengguna bisa memilih mana yang harus digunakan dengan program yang diberikan dengan menggunakan / etc / libmap.conf. Dimulai dengan FreeBSD 7, 1:1 menjadi default. FreeBSD 8 tidak lagi mendukung M: Model N.
Penggunaan benang kernel menyederhanakan kode pengguna dengan memindahkan beberapa aspek yang paling kompleks threading ke dalam kernel. Program ini tidak perlu menjadwalkan benang atau eksplisit menghasilkan prosesor. Kode pengguna dapat ditulis dalam gaya prosedural akrab, termasuk panggilan untuk memblokir API, tanpa kelaparan benang lain. Namun, kernel threading mungkin memaksa konteks beralih antara benang setiap saat, dan dengan demikian mengekspos bahaya ras dan concurrency bug yang dinyatakan akan berbohong laten. Pada sistem SMP, ini lebih diperparah karena kernel thread dapat harfiah mengeksekusi secara bersamaan pada prosesor yang terpisah.
Model
01:01 (Kernel-level threading)
Thread yang dibuat oleh pengguna dalam korespondensi 1-1 dengan entitas schedulable di kernel. Ini adalah sederhana kemungkinan pelaksanaan threading. Win32 menggunakan pendekatan ini dari awal. Pada Linux , yang C library yang biasa menerapkan pendekatan ini (melalui NPTL atau lebih LinuxThreads ). Pendekatan yang sama digunakan oleh Solaris , NetBSD dan FreeBSD .
[ sunting ]N: 1 (User-level threading)
Sebuah N: 1 Model menyiratkan bahwa semua benang level aplikasi peta ke level kernel dijadwalkan entitas tunggal, kernel tidak memiliki pengetahuan tentang benang aplikasi. Dengan pendekatan ini, switching konteks dapat dilakukan dengan sangat cepat dan, di samping itu dapat diimplementasikan bahkan pada kernel sederhana yang tidak mendukung threading. Salah satu kelemahan utama bagaimanapun adalah bahwa ia tidak bisa mendapatkan keuntungan dari akselerasi hardware pada multi-threaded prosesor atau multi-prosesor komputer: tidak pernah lebih dari satu thread yang dijadwalkan pada waktu yang sama. Misalnya: Jika salah satu benang perlu mengeksekusi permintaan I / O, seluruh proses akan diblokir dan keuntungan threading tidak dapat dimanfaatkan. The GNU Portabel Thread menggunakan User-level threading, seperti halnya Thread Negara .
M: N (Hybrid threading)
M: N peta beberapa nomor M benang aplikasi ke beberapa nomor N entitas kernel, atau "prosesor virtual." Ini adalah kompromi antara kernel-level ("01:01") dan user-level ("N: 1") threading. Secara umum, "M: N" sistem threading lebih kompleks untuk diterapkan daripada baik kernel atau benang pengguna, karena perubahan baik kernel dan kode user-space yang diperlukan. Dalam M: N pelaksanaan, perpustakaan threading bertanggung jawab untuk penjadwalan thread pengguna pada entitas schedulable tersedia, ini membuat konteks switching benang yang sangat cepat, karena menghindari panggilan sistem. Namun, ini meningkatkan kompleksitas dan kemungkinan inversi prioritas , serta penjadwalan suboptimal tanpa ekstensif (dan mahal) koordinasi antara scheduler userland dan scheduler kernel.
contoh implementasi Hybrid
Scheduler aktivasi yang digunakan oleh NetBSD asli POSIX thread implementasi perpustakaan (sebuah M: Model N sebagai lawan kernel 1:1 atau model implementasi userspace)
Marcel dari PM2 proyek.
OS untuk Tera / Cray MTA
Microsoft Windows 7
contoh implementasi Fiber
Serat dapat dilaksanakan tanpa dukungan sistem operasi, meskipun beberapa sistem operasi atau perpustakaan memberikan dukungan eksplisit untuk mereka.
Win32 API memasok serat [3] (Windows NT 3.51 SP3 dan kemudian)
Ruby sebagai benang Hijau
Netscape Portabel Runtime (termasuk implementasi serat user-space)
Pemrograman dukungan bahasa
Banyak bahasa pemrograman mendukung threading dalam beberapa kapasitas. Banyak implementasi dari C dan C + + memberikan dukungan untuk threading sendiri, tetapi juga memberikan akses ke threading API asli yang disediakan oleh sistem operasi. Beberapa tingkat yang lebih tinggi (dan biasanya lintas platform) bahasa pemrograman seperti Java, Python, dan NET., Mengekspos threading untuk pengembang sedangkan abstrak perbedaan spesifik platform dalam implementasi threading di runtime untuk pengembang. Sejumlah bahasa pemrograman lain juga mencoba abstrak konsep concurrency dan threading dari pengembang sama sekali ( Cilk , OpenMP , MPI ). Beberapa bahasa yang dirancang untuk paralelisme (Ateji PX, CUDA ).
Beberapa bahasa pemrograman ditafsirkan seperti Ruby dan (pelaksanaan CPython dari) Python dukungan threading, tetapi memiliki keterbatasan yang dikenal sebagai Juru Kunci global (GIL). GIL merupakan kunci saling pengecualian diselenggarakan oleh interpreter yang dapat mencegah penafsir dari bersamaan menafsirkan aplikasi kode pada dua atau lebih benang pada saat yang sama, yang secara efektif membatasi concurrency pada beberapa sistem inti (sebagian besar untuk benang prosesor-terikat, dan tidak banyak untuk yang network-bound).
Pemrograman event-driven bahasa deskripsi hardware seperti Verilog memiliki model threading berbeda yang mendukung sangat besar jumlah benang (untuk modeling hardware).
JDBC
Apa itu JDBC?
JDBC (Java database connectivity) adalah spesifikasi standar
dari JavaSoft API (Aplication
Programming Interface) yang memungkinkan program Java untuk mengakses sistem
database manajemen. JDBC API terdiri dari satu set interface dan kelas yang
ditulis dalam bahasa pemrograman Java. JDBC API Menggunakan interface standar
dan kelas, programmer dapat menulis aplikasi yang terhubung ke database,
mengirimkan pertanyaan ditulis SQL (Structured Query Language), dan memproses hasilnya.
JDBC API ini konsisten dengan gaya inti interface Java dan
kelas, seperti java.lang dan java.awt. Tabel berikut ini menjelaskan antarmuka,
kelas, dan pengecualian (kelas dilempar sebagai pengecualian) yang membentuk
API JDBC. Pada tabel, interface milik paket javax.sql adalah ekstensi untuk
antarmuka JDBC standar dan yang terkandung dalam Java 2 SDK, Enterprise
Edition.
|
Interface/class/exception
|
Deskripsi
|
|
|
|
|
Interfaces:
|
|
|
java.sql.Connection
|
Interface yang digunakan untuk membuat koneksi ke database. pernyataan
SQL dijalankan dalam konteks koneksi.
|
|
java.sql.DatabaseMetaData
|
Interface yang digunakan untuk mengembalikan informasi tentang
database.
|
|
java.sql.Driver
|
Interface yang digunakan untuk menemukan driver
untuk sistem manajemen database tertentu.
|
|
java.sql.PreparedStatement
|
Interface yang digunakan untuk
mengirim kompilasi pernyataan SQL ke server database dan memperoleh hasilnya.
|
|
java.sql.ResultSet
|
Interface yang digunakan untuk
memproses dan mengembalikan hasil
dari pernyataan SQL yang di
jalankan.
|
|
java.sql.ResultSetMetaData
|
Interface yang digunakan untuk mengembalikan kolom dalam sebuah
Object ResultSet.
|
|
java.sql.Statement
|
Interface digunakan untuk
mengirim laporan statis SQL ke server database dan memperoleh hasilnya.
|
|
javax.sql.ConnectionEventListener
|
Menerima event atau kejadian bahwa obyek PooledConnection
digeneralisasi.
|
|
javax.sql.ConnectionPoolDataSource
|
Pabrik untuk suatu PooledConnection. Sebuah objek
ConnectionPoolDataSource biasanya terdaftar dengan layanan JNDI.
|
|
javax.sql.DataSource
|
Sebuah pabrik untuk objek Connection. Sebuah objek DataSource
biasanya terdaftar dengan penyedia layanan JNDI.
|
|
javax.sql.PooledConnection
|
PooledConnection mewakili koneksi fisik ke sumber data.
|
|
Classes:
|
|
|
java.sql.Date
|
Subclass dari java.util.Date digunakan untuk tipe data SQL DATE.
|
|
java.lang.DriverManager
|
Class yang digunakan untuk
mengelola satu set JDBC drivers.
|
|
java.sql.DriverPropertyInfo
|
Class yang digunakan untuk menutupi dan memasok properti untuk
koneksi
|
|
java.sql.Time
|
Subclass dari java.util.Date digunakan untuk tipedata SQL TIME.
|
|
java.sql.TimeStamp
|
Subclass dari java.util.Date digunakan untuk tipedata SQL TIMESTAMP.
|
|
java.sql.Types
|
Class yang digunakan untuk mendefinisikan konstanta yang digunakan
untuk mengidentifikasi tipe data standart
SQL seperti CHAR, INTEGER dan DECIMAL.
|
|
java.sql.String
|
Class yang digunakan untuk mengidentifikasi jenis data teks seperti
CHAR.
|
|
Exception classes:
|
|
|
java.sql.SQLException
|
Eksepsi yang menyediakan informasi tentang Database error
|
.
Karena JDBC adalah spesifikasi standar, sebuah program Java
yang menggunakan API JDBC dapat terhubung ke sistem manajemen database (DBMS)
yang ada driver JDBC-nya.
Apakah driver JDBC?
JDBC API mendefinisikan interface Java dan kelas yang
programmer gunakan untuk menghubungkan ke database dan mengirim pertanyaan.
Driver JDBC mengimplementasikan interface ini dan kelas untuk vendor DBMS
tertentu.
Sebuah program Java yang menggunakan API JDBC driver beban
yang ditetapkan untuk sebuah DBMS tertentu sebelum benar-benar terhubung ke
database. Kelas JDBC DriverManager kemudian mengirimkan semua panggilan ke API
JDBC driver dimuat.
Empat jenis driver JDBC adalah:
• JDBC-ODBC bridge plus driver ODBC, juga disebut Tipe 1.
Menerjemahkan JDBC API panggilan menjadi Microsoft Open
Database Connectivity (ODBC) panggilan yang kemudian diteruskan ke driver ODBC.
Kode ODBC biner harus dimuat pada setiap komputer klien yang menggunakan jenis
driver.
• Native-API, sebagian Java driver, juga disebut Tipe 2.
Mengubah JDBC API API panggilan menjadi klien DBMS khusus
panggilan. Seperti driver jembatan, jenis driver mensyaratkan bahwa beberapa
kode biner akan dimuat pada setiap komputer klien.
• JDBC-Net, Java driver murni, juga disebut Tipe 3.
JDBC API Mengirim panggilan ke server tingkat menengah yang menerjemahkan panggilan
tersebut dalam protokol jaringan DBMS spesifik. Panggilan yang telah
diterjemahkan tersebut kemudian dikirim ke sebuah DBMS tertentu.
• Native-protokol, Java Driver murni, juga disebut Tipe 4.
Mengubah JDBC API melalui panggilan langsung ke protokol
jaringan DBMS-spesifik tanpa tingkat tengah. Hal ini memungkinkan aplikasi
client untuk terhubung langsung ke server database.
The Red Brick Driver JDBC adalah Java murni Tipe-4 driver
berdasarkan Versi 2.0 dari API JDBC.
SISTEM TERDISTRIBUSI
DEFINISI :
Sebelum menjelaskan tentang definisi dari sistem terdistribusi, saya akan menjelaskan lagi tentang apa itu sistem. Sistem adalah suatu kesatuan yang terdiri komponen atau elemen yang dihubungkan bersama untuk melakukan suatu kegiatan atau untuk menyelesaikan suatu tujuan tertentu.
Sedangkan definisi dari sistem terdistribusi adalah sebuah sistem dimana komponen software atau hardware-nya terletak di dalam jaringan komputer dan saling berkomunikasi menggunakan message passing (Message passing adalah sebuah teknik untuk melakukan sinkronisasi dan komunikasi antara proses-proses yang saling berinteraksi). Ada juga yang mengatakan Sistem Terdistribusi adalah sebuah sistem yang terdiri dari beberapa komponen yang terdapat di dalam sebuah jaringan komputer. Komponen-komponen tersebut saling berinteraksi dan berkomunikasi hanya dengan melalui pengiriman pesan.
Contoh Sistem Terdistribusi :
- Internet.
- Mobile Computing.
- Sistem Otomasi Bank.
- Deteksi Roaming Pada Telepon Seluler.
- GPS (Global Positioning System).
- Retail Point-of-Sale Terminals.
PENJELASAN :
Internet
- Jaringan komputer dan aplikasi yang heterogen.
- Mengimplementasikan protokol Internet.
Intranet
- Jaringan yang teradministrasi secara local.
- Terhubung ke internet melalui firewall.
- Menyediakan layanan internal dan eksternal.
Mobile Computing (Sistem Komunikasi Telepon Seluler)
- Menggunakan frekuensi radio sebagai media transmisi.
- Perangkat dapat bergerak kemanapun asal masih terjangkau dengan frekuensinya.
- Dapat menghandle/dihubungan dengan perangkat lain.
Contoh lain Sistem Terdistribusi
- Sistem Telepon : ISDN, PSTN.
- Network File System (NFS). (Arsitektur untuk mengakses sistem file melalui jaringan).
- www. (Arsitektur client server yang diterapkan dalam infrastruktur internet).
source code membuat server dan client pada program java
source code client :
package client;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author UNLA
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[]args)throws IOException{
Socket s = new Socket("localhost",5111);
ObjectInputStream in = null;
ObjectOutputStream out = null;
Scanner scanf = new Scanner(System.in);
String input="";
String balasan;
String balasan2;
out=new ObjectOutputStream(s.getOutputStream());
out.flush();
in=new ObjectInputStream(s.getInputStream());
balasan="";
balasan2="";
while(true)
{
balasan="";
balasan2="";
input = scanf.nextLine();
SendMessage(input,out);
if(input.equals("exit"))break;
else
{
balasan=ReadMessage(in);
if(balasan.equals("ini server, masukkan username"))
{
input=scanf.nextLine();
SendMessage(input,out);
balasan2=ReadMessage(in);
}
}
}
in.close();
out.close();
s.close();
}
public static void SendMessage(String word, ObjectOutputStream out)
{
try{
out.writeObject(word);
out.flush();
}catch(IOException ex){
Logger.getLogger(Main.class.getName()).log(Level.SEVERE,null,ex);
}
}
public static String ReadMessage(ObjectInputStream in)
{
String reader="";
try{
reader=(String)in.readObject();
}catch(IOException ex){
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null,ex);
}catch(ClassNotFoundException ex){
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null,ex);
}
System.out.println(reader);
return reader;
}
}
source code server :
package server;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Tugas_Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(5111);
Socket s;
String balasan;
String balasan2;
ObjectInputStream in = null;
ObjectOutputStream out = null;
s = ss.accept();
out = new ObjectOutputStream(s.getOutputStream());
out.flush();
in = new ObjectInputStream(s.getInputStream());
balasan = "";
balasan2 = "";
while (true) {
balasan = "";
balasan2 = "";
balasan = ReadMessage(in);
if (balasan.equals("exit")) break;
else {
if(balasan.equals("ini client"))
{
SendMessage("ini server, masukan username", out);
balasan2 = ReadMessage(in);
if (balasan2.equals("admin")){ SendMessage("Selamat Datang Admin", out);}
else {
if (balasan2.equals("user")){SendMessage("Selamat Datang User", out);}
else SendMessage("username tidak diketahui", out);
}
}
else
{
SendMessage("perintah tidak diketahui", out);
}
}
}
in.close();
out.close();
s.close();
ss.close();
}catch (IOException ex){
Logger.getLogger(Tugas_Server.class.getName()).log(Level.SEVERE,null,ex);
}
}
public static String ReadMessage(ObjectInputStream in)
{
String Reader="";
try {
Reader=(String)in.readObject();
}catch (IOException ex){
Logger.getLogger(Tugas_Server.class.getName()).log(Level.SEVERE,null,ex);
}catch (ClassNotFoundException ex){
Logger.getLogger(Tugas_Server.class.getName()).log(Level.SEVERE,null,ex);
}
System.out.println(Reader);
return Reader;
}
public static void SendMessage(String word, ObjectOutputStream out)
{
try{
out.writeObject(word);
out.flush();
}catch (IOException ex){
Logger.getLogger(Tugas_Server.class.getName()).log(Level.SEVERE,null,ex);
}
}
}
package client;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
/**
*
* @author UNLA
*/
public class Main {
/**
* @param args the command line arguments
*/
public static void main(String[]args)throws IOException{
Socket s = new Socket("localhost",5111);
ObjectInputStream in = null;
ObjectOutputStream out = null;
Scanner scanf = new Scanner(System.in);
String input="";
String balasan;
String balasan2;
out=new ObjectOutputStream(s.getOutputStream());
out.flush();
in=new ObjectInputStream(s.getInputStream());
balasan="";
balasan2="";
while(true)
{
balasan="";
balasan2="";
input = scanf.nextLine();
SendMessage(input,out);
if(input.equals("exit"))break;
else
{
balasan=ReadMessage(in);
if(balasan.equals("ini server, masukkan username"))
{
input=scanf.nextLine();
SendMessage(input,out);
balasan2=ReadMessage(in);
}
}
}
in.close();
out.close();
s.close();
}
public static void SendMessage(String word, ObjectOutputStream out)
{
try{
out.writeObject(word);
out.flush();
}catch(IOException ex){
Logger.getLogger(Main.class.getName()).log(Level.SEVERE,null,ex);
}
}
public static String ReadMessage(ObjectInputStream in)
{
String reader="";
try{
reader=(String)in.readObject();
}catch(IOException ex){
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null,ex);
}catch(ClassNotFoundException ex){
Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null,ex);
}
System.out.println(reader);
return reader;
}
}
source code server :
package server;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.logging.Level;
import java.util.logging.Logger;
public class Tugas_Server {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(5111);
Socket s;
String balasan;
String balasan2;
ObjectInputStream in = null;
ObjectOutputStream out = null;
s = ss.accept();
out = new ObjectOutputStream(s.getOutputStream());
out.flush();
in = new ObjectInputStream(s.getInputStream());
balasan = "";
balasan2 = "";
while (true) {
balasan = "";
balasan2 = "";
balasan = ReadMessage(in);
if (balasan.equals("exit")) break;
else {
if(balasan.equals("ini client"))
{
SendMessage("ini server, masukan username", out);
balasan2 = ReadMessage(in);
if (balasan2.equals("admin")){ SendMessage("Selamat Datang Admin", out);}
else {
if (balasan2.equals("user")){SendMessage("Selamat Datang User", out);}
else SendMessage("username tidak diketahui", out);
}
}
else
{
SendMessage("perintah tidak diketahui", out);
}
}
}
in.close();
out.close();
s.close();
ss.close();
}catch (IOException ex){
Logger.getLogger(Tugas_Server.class.getName()).log(Level.SEVERE,null,ex);
}
}
public static String ReadMessage(ObjectInputStream in)
{
String Reader="";
try {
Reader=(String)in.readObject();
}catch (IOException ex){
Logger.getLogger(Tugas_Server.class.getName()).log(Level.SEVERE,null,ex);
}catch (ClassNotFoundException ex){
Logger.getLogger(Tugas_Server.class.getName()).log(Level.SEVERE,null,ex);
}
System.out.println(Reader);
return Reader;
}
public static void SendMessage(String word, ObjectOutputStream out)
{
try{
out.writeObject(word);
out.flush();
}catch (IOException ex){
Logger.getLogger(Tugas_Server.class.getName()).log(Level.SEVERE,null,ex);
}
}
}
Socket pada sistem client server
Mengenal
Socket
Bayangkan
sebuah server game online yang berkomunikasi tanpa henti, dimainkan oleh entah
berapa banyak client yang tersebar. Ini merupakan salah satu contoh aplikasi
dari sekian banyak aplikasi yang menggunakan socket jaringan untuk saling
berkomunikasi dan bertukar data.
Komunikasi
socket jaringan memang tidak mengenal lelah, pertukaran data terjadi
terus-menerus dan memegang peranan vital. Jika oleh karena suatu hal komunikasi
berhenti karena maintenance, kerusakan, ataupun sebab lainnya, maka dapat dipastikan
para penggunanya akan kecewa.
Maka dari
itu, komunikasi jaringan selalu diusahakan tidak terhenti. Demikianlah tugas
berat yang harus dilakukan socket jaringan. Sebelum membahas lebih jauh, apakah
sebenarnya pengertian socket itu?
Pengertian
socket adalah interface pada jaringan yang menjadi titik komunikasi antarmesin
pada Internet Protocol, dan tentunya tanpa komunikasi ini, tidak akan ada
pertukaran data dan informasi jaringan.
Socket
terdiri dari elemen-elemen utama sebagai berikut:
1. Protokol.
2. Local IP.
3. Local
Port.
4. Remote
IP.
5. Remote
Port.
Dalam
komunikasi antara dua pihak, tentunya harus digunakan kesepakatan aturan dan
format yang sama agar komunikasi dapat dimengerti. Seperti halnya dua orang
yang menggunakan bahasa yang sama, maka bahasa di sini berfungsi sebagai
protokol. Protokol yang digunakan dalam socket dapat menggunakan TCP ataupun
UDP.
Contoh
komunikasi sederhana adalah komunikasi antara komputer A dan komputer B. Baik
komputer A maupun komputer B harus memiliki identitas unik, yang
direpresentasikan oleh IP masing-masing.
Komunikasi
yang terjadi melalui port, sehingga baik komputer A maupun komputer B harus
memiliki port yang dapat diakses satu sama lain.
TCP dan UDP
Pemrograman
socket adalah cara untuk menggunakan komponen/API (Application Programming
Interface) socket untuk membuat sebuah aplikasi.
Aplikasi
socket umumnya terdiri dari dua kategori berdasarkan pengiriman datanya, yaitu:
1. Datagram
socket (menggunakan UDP).
2. Stream
socket (menggunakan TCP).
Terdapat
perlakuan yang berbeda antara UDP dan TCP, walaupun sama-sama berfungsi sebagai
protokol pertukaran data.
UDP tidak
memerlukan proses koneksi terlebih dahulu untuk dapat mengirimkan data,
paket-paket data yang dikirimkan UDP bisa jadi melalui rute yang berbeda-beda,
sehingga hasil yang diterima bisa jadi tidak berurutan.
Contohnya
jika aplikasi socket pengirim mengirimkan berturut-turut pesan 1, pesan 2, dan
pesan 3, maka aplikasi socket penerima belum tentu mendapatkan pesan yang
berurutan dimulai dari pesan 1, pesan 2, dan terakhir pesan 3. Bisa saja pesan
2 terlebih dulu diterima, menyusul pesan-pesan yang lain, atau berbagai
kemungkinan lainnya. Bahkan, dapat terjadi pesan yang dikirimkan tidak sampai
ke penerima karena kegagalan pengiriman paket data.
Tidak
demikian halnya dengan stream socket yang menggunakan TCP. Jenis ini
mengharuskan terjadinya koneksi terlebih dahulu, kemudian mengirimkan
paket-paket data secara berurutan, penerima juga dijamin akan menerima data
dengan urutan yang benar, dimulai dari data pertama yang dikirimkan hingga data
terakhir. TCP dapat menangani data yang hilang, rusak, terpecah, ataupun
terduplikasi.
Dari sekilas
perbedaan ini, kita dapat menarik kesimpulan bahwa aplikasi socket yang
menggunakan TCP memerlukan pertukaran data dua arah yang valid. Sedangkan,
aplikasi socket yang menggunakan UDP lebih memprioritaskan pada pengumpulan
data.
Karena itu
aplikasi socket dengan TCP sering diterapkan untuk aplikasi chat, transfer file,
ataupun transaksi-transaksi penting. Sedangkan aplikasi socket dengan UDP cocok
diterapkan untuk aplikasi monitoring jaringan, game online, dan
aplikasi-aplikasi broadcast.
Port
Salah satu
elemen penting yang digunakan dalam aplikasi socket adalah port. Port merupakan
sebuah koneksi data virtual yang digunakan aplikasi untuk bertukar data secara
langsung.
Terdapat
banyak port di dalam sebuah sistem komputer dengan fungsinya masing-masing.
Sebagai contoh, dalam mengirim e-mail digunakan service SMTP yang umumnya
menggunakan port 25. Sementara service POP3 untuk menerima e-mail menggunakan
port 110, port 80 digunakan untuk HTTP, port 443 digunakan untuk HTTPS, dan
seterusnya.
Nomor-nomor
port dikategorikan dalam tiga jenis sebagai berikut:
1.
Well-known ports.
Merupakan
port yang telah digunakan secara internal oleh sistem Windows, misalnya port
untuk koneksi Internet, service FTP, dan seterusnya. Port yang telah digunakan
ini adalah port 0 sampai dengan port 1023.
2.
Registered ports.
Port ini
dapat digunakan dalam aplikasi Anda, range-nya adalah port 1024 hingga port
49151, cukup banyak port yang tersedia yang bebas Anda pilih sehingga Anda
tidak perlu kuatir kekurangan port untuk aplikasi Anda.
3.
Dynamic/Private ports.
Dari port 49152
sampai dengan port 65535.
Winsock
Untuk
pemrograman aplikasi socket berbasis Windows, maka komponen API yang sering
digunakan adalah Winsock (Win-dows Socket API) yang mendukung interface standar
TCP/IP, yang merupakan protokol jaringan paling popular saat ini (contoh
protokol jaringan yang lain adalah NetBIOS, IPX dari Novell, AppleTalk dari
Apple, dan seterusnya).
Pengertian
TCP/IP (TCP over IP) mungkin dapat menjadi sedikit rancu jika diartikan TCP/IP
hanya mengizinkan pengiriman TCP (dan tidak UDP), padahal seperti yang telah
kita bahas, pengiriman socket dapat melalui TCP maupun UDP.
Pengertian
TCP/IP di sini sebenarnya digunakan untuk menunjukkan teknologi
jaringan/Internet, termasuk di dalamnya adalah UDP. Jika Anda menggunakan UDP,
dapat juga disebut sebagai UDP/IP (UDP over IP), tetapi umumnya istilah ini
jarang digunakan dan istilah TCP/IP telah mencakup, baik TCP maupun UDP.
Pada bahasa
pemrograman visual seperti Visual Basic/Delphi, Anda dapat menggunakan control
Winsock yang telah disediakan untuk mengembangkan aplikasi socket.
Walaupun
kita akan mencontohkan aplikasi socket dalam environment Windows, Anda tidak
perlu khawatir jika aplikasi socket yang menggunakan Winsock tidak dapat
berkomunikasi dengan aplikasi socket berbasis Unix/Linux, karena komunikasi
tetap dapat terjadi selama aplikasi tersebut menggunakan protokol jaringan yang
sama.
Kalau
demikian, untuk mencoba aplikasi socket, apakah mutlak diperlukan setidaknya
jaringan dengan minimal dua komputer yang saling terkoneksi? Bagi Anda yang
terpaksa hanya menggunakan satu komputer, dapat memanfaatkan alamat localhost
atau 127.0.0.1 yang mengizinkan dua aplikasi berjalan pada satu mesin komputer
dan berkomunikasi satu sama lain.
Aplikasi
Server
Untuk
membuat aplikasi socket yang sederhana, tidak diperlukan langkah-langkah yang
rumit. Kita akan mencoba membuat dua buah aplikasi, yang pertama adalah
aplikasi server yang akan menerima data, sedangkan aplikasi kedua adalah
aplikasi client yang mengirimkan data pada server. Baik aplikasi server dan
aplikasi client mendefi nisikan port yang sama sebagai jalur komunikasi.
Contoh
program dibuat dengan menggunakan Visual Basic 6. Konsep pemrograman yang
serupa juga dapat Anda implementasikan pada bahasa pemrograman lain seperti
Visual Basic.NET, Delphi, dan lain sebagainya.
Kita akan
memulainya dengan aplikasi server, tugas aplikasi server cukup sederhana, yaitu
hanya siap sedia menerima data yang masuk pada sebuah port. Control yang Anda
perlukan adalah control winsock bernama Winsock1 dan sebuah textbox bernama
Text1. Pada event Form_Load, tuliskan kode program di bawah
ini:
Private Sub
Form_Load()
With
Winsock1
.LocalPort =
1025
.Listen
End With
End Sub
Kode program
tersebut melakukan inisialisasi socket, socket memilih port 1025 pada komputer
server dan menunggu data yang masuk melalui port tersebut dengan perintah
Listen.
Selanjutnya
pada event Winsock1_ConnectionRequest, ketikkan kode program berikut:
Private Sub
Winsock1_ConnectionRequest(ByVal requestID As
Long)
If
Winsock1.State <> sckClosed Then Winsock1.Close
Winsock1.Accept
requestID
End Sub
Kode program
di atas berfungsi untuk menerima request koneksi. Selanjutnya pada event
Winsock1_DataArrival, ketikkan kode program berikut:
Private Sub
Winsock1_DataArrival(ByVal bytesTotal As Long)
Dim strData
As String
Winsock1.GetData
strData
Text1.Text =
Text1.Text & strData
End Sub
Kode program
di atas berfungsi untuk mengambil data yang diterima oleh socket dan
menampilkannya pada Text1. Aplikasi server telah selesai!
Aplikasi
Client
Seperti
aplikasi server, Anda perlu menyiapkan control Winsock dan Text, ditambah
sebuah control Command Button yang dapat Anda namakan cmdKirim yang berfungsi
untuk mengirimkan data yang diketik pada Text1 ke aplikasi server.
Pada event
Form_Load, ketikkan kode program di bawah:
Private Sub
Form_Load()
With Winsock1
.RemoteHost
= “127.0.0.1”
.RemotePort
= 1025
.Connect
End With
End Sub
Kode program
di atas berfungsi untuk melakukan inisialisasi, tentukan IP
tujuan/server/remote dengan 127.0.0.1 seperti pada contoh jika Anda mencoba
aplikasi ini dengan menggunakan satu mesin komputer.
Jika Anda
mencobanya dengan menggunakan dua komputer dalam sebuah jaringan, isikan dengan
IP komputer yang berfungsi sebagai server.
Selanjutnya
pada cmdKirim, ketikkan kode program sebagai berikut:
Private Sub
cmdKirim_Click()
If
Winsock1.State = sckConnected Then
Winsock1.SendData
Text1.Text
End If
End Sub
Kode program
di atas akan mengirimkan pesan yang Anda ketik pada textbox Text1 pada aplikasi
server.
Selesailah
sudah aplikasi server dan client. Cukup mudah, bukan? Anda dapat melakukan uji
coba dengan menjalankan aplikasi server pada komputer yang berfungsi sebagai
server (ataupun komputer yang sama dengan aplikasi client jika Anda menggunakan
127.0.0.1 sebagai remote IP).
Jalankan
aplikasi client, dan ketik kata-kata yang Anda inginkan, lalu tekan Command
Button cmdKirim, maka aplikasi server akan menampilkan pesan yang Anda ketikkan
tersebut.
Dari program
sederhana ini, Anda dapat mengembangkannya menjadi aplikasi socket yang sesuai
dengan keperluan Anda, penggunaannya sangat luas dan bisa jadi sangat
bermanfaat, misalnya aplikasi instant messenger seperti Yahoo! Messenger
ataupun MSN Messenger yang merupakan aplikasi socket yang banyak digunakan.
Pengolahan
Data
Komunikasi
data antara server dan client di atas merupakan bentuk komunikasi satu arah
sederhana. Data yang dikirimkan dari client pun merupakan data mentah yang
tidak memerlukan pengolahan data lebih lanjut.
Anda dapat
membuat sendiri function dan rutin untuk mengolah data yang dikirim dan
diterima sesuai dengan kebutuhan aplikasi, karena data yang dikirimkan
antarmesin bisa jadi sangat bervariasi.
Misalnya
saja aplikasi server/client Anda memerlukan pertukaran data identitas mesin,
tanggal, jam, header pesan, isi pesan, dan lain sebagainya. Anda dapat
mengirimkannya dalam format tertentu, misalnya bentuk string dengan karakter
pemisah untuk membedakan masing-masing field.
Dalam komunikasi
data di dalam jaringan, Anda perlu mempertimbangkan besarnya data yang
lalu-lalang pada jaringan, baik dengan menggunakan TCP maupun UDP. Keduanya
harusdipersiapkan untuk mampu menangani data yang besar jika memang pengguna
aplikasi socket Anda sangat luas.
Pastinya
tidak terdapat masalah yang berarti jika Anda mencobanya dengan dua atau
beberapa komputer dalam sebuah jaringan lokal, tetapi coba bayangkan seberapa
besar total data yang harus dikirim dan diterima pada sebuah aplikasi game
online, misalnya.
Pada contoh
game online, sebuah server harus dipersiapkan untuk mampu melayani sedemikian
banyak client, dan jaringan yang digunakan bukan lagi jaringan lokal, tetapi
sudah merupakan jaringan Internet, di mana siapapun dapat menggunakan aplikasi
Anda selama ia memiliki koneksi Internet.
Mungkin Anda
bertanya, jika data yang keluar-masuk memerlukan pengolahan lebih lanjut,
mengapa tidak digunakan database, sehingga Anda tidak perlu pusing membuat
rutin atau modul untuk mengolah data yang dikirim/diterima melalui komunikasi
socket?
Pada
umumnya, aplikasi socket client/server memang menggunakan database pada sisi
server, tetapi jika aplikasi socket mengharuskan sisi client menggunakan
database tertentu, maka akan membatasi penggunaan aplikasi itu sendiri.
Selain itu,
kegunaan komunikasi socket adalah agar dapat berjalan lintas platform. Tidak
peduli operating system apa yang digunakan pengguna aplikasi, komunikasi socket
tetap berjalan selama digunakan protokol yang sama.
Subscribe to:
Posts
(
Atom
)



