Kamis, 04 November 2010

Tentang DEADLOCK pada Sistem Operasi

Deadlock adalah keadaan dimana dua program memegang kontrol terhadap sumber daya yang dibutuhkan oleh program yang lain. Tidak ada yang dapat melanjutkan proses masing-masing sampai program yang lain memberikan sumber dayanya, tetapi tidak ada yang mengalah.
Deadlock yang mungkin dapat terjadi pada suatu proses disebabkan proses itu menunggu suatu kejadian tertentu yang tidak akan pernah terjadi. Dua atau lebih proses dikatakan berada dalam kondisi deadlock, bila setiap proses yang ada menunggu suatu kejadian yang hanya dapat dilakukan oleh proses lain dalam himpunan tersebut.

ilustrasi
Misalkan pada suatu komputer terdapat dua buah program, sebuah tape driveprinter. Program A mengontrol tape drive, sementara program B mengontrol printer. Setelah beberapa saat, program A meminta printer, tapi printer masih digunakan. Berikutnya, B meminta tape drive, sedangkan A masih mengontrol tape drive. Dua program tersebut memegang kontrol terhadap sumber daya yang dibutuhkan oleh program yang lain. Tidak ada yang dapat melanjutkan proses masing-masing sampai program yang lain memberikan sumber dayanya, tetapi tidak ada yang mengalah. Kondisi inilah yang disebut Deadlock atau pada beberapa buku disebut Deadly Embrace dan sebuah
Deadlock yang mungkin dapat terjadi pada suatu proses disebabkan proses itu menunggu suatu kejadian tertentu yang tidak akan pernah terjadi. Dua atau lebih proses dikatakan berada dalam kondisi deadlock, bila setiap proses yang ada menunggu suatu kejadian yang hanya dapat dilakukan oleh proses lain dalam himpunan tersebut.
Terdapat kaitan antara overhead dari mekanisme koreksi dan manfaat dari koreksi deadlock itu sendiri. Pada beberapa kasus, overhead atau ongkos yang harus dibayar untuk membuat sistem bebas deadlock menjadi hal yang terlalu mahal dibandingkan jika mengabaikannya. Sementara pada kasus lain, seperti pada real-time process control, mengizinkan deadlock akan membuat sistem menjadi kacau dan membuat sistem tersebut tidak berguna.
Contoh berikut ini terjadi pada sebuah persimpangan jalan. Beberapa hal yang dapat membuat deadlock pada suatu persimpangan, yaitu:

    * Terdapat satu jalur pada jalan.
    * Mobil digambarkan sebagai proses yang sedang menuju sumber daya.
    * Untuk mengatasinya beberapa mobil harus preempt (mundur).
    * Sangat memungkinkan untuk terjadinya starvation (kondisi proses tak akan mendapatkan sumber daya).



                                  Resources-Allocation Graph
          o Sebuah cara visual (matematika) untuk menentukan apakah ada deadlock, atau kemungkinan terjadinya.
          o G = (V, E) Graf berisi node and edge. Node V terdiri dari proses-proses = {P1, P2, P3, ...} dan jenis resource. {R1, R2, ...} Edge E adalah (Pi, Rj) atau (Ri, Pj)
Sebuah panah dari process ke resource menandakan proses meminta resource. Sebuah panah dari resource ke process menunjukkan sebuah instance dari resource telah dtempatkan ke proses. Process adalah lingkaran, resource adalah kotak; titik-titik merepresentasikan jumlah instance dari resource Dalam tipe. Meminta poin-poin ke kotak, perintah datang dari titik

      Jika graf tidak berisi lingkaran, maka tidak ada proses yang deadlock.
      Jika membentuk lingkaran, maka:
         1. jika tipe resource memiliki banyak instance, maka deadlock DAPAT ada.
            Gambar 3-15. Non Deadlock.
   
      Model Sistem
      Menurut Coffman dalam bukunya "Operating System" menyebutkan empat syarat bagi terjadinya deadlock, yaitu:
         1. Mutual Exclusion
      Suatu kondisi dimana setiap sumber daya diberikan tepat pada satu proses pada suatu waktu.
         2. Hold and Wait
      Kondisi yang menyatakan proses-proses yang sedang memakai suatu sumber daya dapat meminta sumber daya yang lain.
         3. Non-pre-emptive
      Kondisi dimana suatu sumber daya yang sedang berada pada suatu proses tidak dapat diambil secara paksa dari proses tersebut,sampai proses itu melepaskannya.
         4. Circular Wait
      Kondisi yang menyatakan bahwa adanya rantai saling meminta sumber daya yang dimiliki oleh suatu proses oleh proses lainnya.
      Strategi menghadapi Deadlock
      Strategi untuk menghadapi deadlock dapat dibagi menjadi tiga pendekatan, yaitu:
         1. Mengabaikan adanya deadlock.
         2. Memastikan bahwa deadlock tidak akan pernah ada, baik dengan metode Pencegahan, dengan mencegah empat kondisi deadlock agar tidak akan pernah terjadi. Metode Menghindari deadlock, yaitu mengizinkan empat kondisi deadlock, tetapi menghentikan setiap proses yang kemungkinan mencapai deadlock.
         3. Membiarkan deadlock untuk terjadi, pendekatan ini membutuhkan dua metode yang saling mendukung, yaitu:
                o Pendeteksian deadlock, untuk mengidentifikasi ketika deadlock terjadi.
                o Pemulihan deadlock, mengembalikan kembali sumber daya yang dibutuhkan pada proses yang memintanya.
      Dari penjabaran pendekatan diatas, terdapat empat metode untuk mengatasi deadlock yang akan terjadi, yaitu:
      Strategi Ostrich
      Pendekatan yang paling sederhana adalah dengan menggunakan strategi burung unta: masukkan kepala dalam pasir dan seolah-olah tidak pernah ada masalah sama sekali. Beragam pendapat muncul berkaitan dengan strategi ini. Menurut para ahli Matematika, cara ini sama sekali tidak dapat diterima dan semua keadaan deadlock harus ditangani. Sementara menurut para ahli Teknik, jika komputer lebih sering mengalami kerusakkan disebabkan oleh kegagalan hardware, error pada kompilator atau bugsdeadlock sangatlah besar dan lebih baik mengabaikan keadaan deadlock tersebut. Metode ini diterapkan pada sistem operasi UNIX dan MINIX. pada sistem operasi. Maka ongkos yang dibayar untuk melakukan penanganan
      Mencegah Deadlock
      Metode ini merupakan metode yang paling sering digunakan. Metode Pencegahan dianggap sebagai solusi yang bersih dipandang dari sudut tercegahnya deadlock. Tetapi pencgahan akan mengakibatkan kinerja utilisasi sumber daya yang buruk.
      Metode pencegahan menggunakan pendekatan dengan cara meniadakan empat syarat yang dapat menyebabkan deadlock terjadi pada saat eksekusi Coffman (1971).
      Syarat pertama yang akan dapat ditiadakan adalah Mutual Exclusion, jika tidak ada sumber daya yang secara khusus diperuntukkan bagi suatu proses maka tidak akan pernah terjadi deadlock. Namun jika membiarkan ada dua atau lebih proses mengakses sebuah sumber daya yang sama akan menyebabkan chaos. Langkah yang digunakan adalah dengan spoolingjob-job pada antrian dan akan dilayani satu-satu. sumber daya, yaitu dengan mengantrikan
      Beberapa masalah yang mungkin terjadi adalah:
         1. Tidak semua dapat di-spool, tabel proses sendiri tidak mungkin untuk di-spool
         2. Kompetisi pada ruang disk untuk spooling sendiri dapat mengarah pada deadlock
      Hal inilah yang menyebabkan mengapa syarat pertama tidak dapat ditiadakan, jadi mutual exclusion benar-benar tidak dapat dihilangkan.
      Cara kedua dengan meniadakan kondisi hold and wait terlihat lebih menjanjikan. Jika suatu proses yang sedang menggunakan sumber daya dapat dicegah agar tidak dapat menunggu sumber daya yang lain, maka deadlock dapat dicegah. Langkah yang digunakan adalah dengan membuat proses agar meminta sumber daya yang mereka butuhkan pada awal proses sehingga dapat dialokasikan sumber daya yang dibutuhkan. Namun jika terdapat sumber daya yang sedang terpakai maka proses tersebut tidak dapat memulai prosesnya.
      Masalah yang mungkin terjadi:
         1. Sulitnya mengetahui berapa sumber daya yang dibutuhkan pada awal proses
         2. Tidak optimalnya pengunaan sumber daya jika ada sumber daya yang digunakan hanya beberapa waktu dan tidak digunakan tapi tetap dimiliki oleh suatu proses yang telah memintanya dari awal.
      Meniadakan syarat ketiga non preemptive ternyata tidak lebih menjanjikan dari meniadakan syarat kedua, karena dengan meniadakan syarat ketiga maka suatu proses dapat dihentikan ditengah jalan. Hal ini tidak dimungkinkan karena hasil dari suatu proses yang dihentikan menjadi tidak baik.
      Cara terakhir adalah dengan meniadakan syarat keempat circular wait. Terdapat dua pendekatan, yaitu:
         1. Mengatur agar setiap proses hanya dapat menggunakan sebuah sumber daya pada suatu waktu, jika menginginkan sumber daya lain maka sumber daya yang dimiliki harus dilepas.
         2. Membuat penomoran pada proses-proses yang mengakses sumber daya. Suatu proses dimungkinkan untuk dapat meminta sumber daya kapan pun, tetapi permintaannya harus dibuat terurut.
      Masalah yang mungkin terjadi dengan mengatur bahwa setiap proses hanya dapat memiliki satu proses adalah bahwa tidak semua proses hanya membutuhkan satu sumber daya, untuk suatu proses yang kompleks dibutuhkan banyak sumber daya pada saat yang bersamaan. Sedangkan dengan penomoran masalah yang dihadapi adalah tidak terdapatnya suatu penomoran yang dapat memuaskan semua pihak.
      Secara ringkas pendekatan yang digunakan pada metode pencegahan deadlock dan masalah-masalah yang menghambatnya, terangkum dalam tabel dibawah ini.

Tabel 3-1. Tabel Deadlock
Syarat
Langkah
Kelemahan
Mutual Exclusion
Spooling sumber daya
Dapat menyebabkan chaos
Hold and Wait
Meminta sumber daya di awal
Sulit memperkirakan di awal dan tidak optimal
No Pre-emptive
Mengambil sumber daya di tengah proses
Hasil proses tidak akan baik
Circular Wait
Penomoran permintaan sumber daya
Tidak ada penomoran yang memuaskan semua pihak

   
Empat kondisi tersebut adalah:

      1.Mutual Exclusion . Kondisi yang pertama adalah mutual exclusion yaitu proses memiliki hak milik pribadi terhadap sumber daya yang sedang digunakannya. Jadi, hanya ada satu proses yang menggunakan suatu sumber daya. Proses lain yang juga ingin menggunakannya harus menunggu hingga sumber daya tersebut dilepaskan oleh proses yang telah selesai menggunakannya. Suatu proses hanya dapat menggunakan secara langsung sumber daya yang tersedia secara bebas.


      2.Hold and Wait . Kondisi yang kedua adalah hold and wait yaitu beberapa proses saling menunggu sambil menahan sumber daya yang dimilikinya. Suatu proses yang memiliki minimal satu buah sumber daya melakukan request lagi terhadap sumber daya. Akan tetapi, sumber daya yang dimintanya sedang dimiliki oleh proses yang lain. Pada saat yang sama, kemungkinan adanya proses lain yang juga mengalami hal serupa dengan proses pertama cukup besar terjadi. Akibatnya, proses-proses tersebut hanya bisa saling menunggu sampai sumber daya yang dimintanya dilepaskan. Sambil menunggu, sumber daya yang telah dimilikinya pun tidak akan dilepas. Semua proses itu pada akhirnya saling menunggu dan menahan sumber daya miliknya.


      3.No Preemption . Kondisi yang selanjutnya adalah no preemption yaitu sebuah sumber daya hanya dapat dilepaskan oleh proses yang memilikinya secara sukarela setelah ia selesai menggunakannya. Proses yang menginginkan sumber daya tersebut harus menunggu sampai sumber daya tersedia, tanpa bisa merebutnya dari proses yang memilikinya.


      4.Circular Wait . Kondisi yang terakhir adalah circular wait yaitu kondisi membentuk siklus yang berisi proses-proses yang saling membutuhkan. Proses pertama membutuhkan sumber daya yang dimiliki proses kedua, proses kedua membutuhkan sumber daya milik proses ketiga, dan seterusnya sampai proses ke n-1 yang membutuhkan sumber daya milik proses ke n. Terakhir, proses ke n membutuhkan sumber daya milik proses yang pertama. Yang terjadi adalah proses-proses tersebut akan selamanya menunggu.

      Menghindari Deadlock



      Pendekatan metode ini adalah dengan hanya memberi kesempatan ke permintaan sumber daya yang tidak mungkin akan menyebabkan deadlock. Metode ini memeriksa dampak pemberian akses pada suatu proses, jika pemberian akses tidak mungkin menuju kepada deadlock, maka sumber daya akan diberikan pada proses yang meminta. Jika tidak aman, proses yang meminta akan di-suspend sampai suatu waktu permintaannya aman untuk diberikan. Kondisi ini terjadi ketika setelah sumber daya yang sebelumnya dipegang oleh proses lain telah dilepaskan.
      Kondisi aman yang dimaksudkan selanjutnya disebut sebagai safe-state, sedangkan keadaan yang tidak memungkinkan untuk diberikan sumber daya yang diminta disebut unsafe-state.
      Kondisi Aman (Safe state)
      Suatu keadaan dapat dinyatakan sebagai safe state jika tidak terjadi deadlock dan terdapat cara untuk memenuhi semua permintaan sumber daya yang ditunda tanpa menghasilkan deadlock. Dengan cara mengikuti urutan tertentu.
      Kondisi Tak Aman (Unsafe state)
      Suatu state dinyatakan sebagai state tak selamat (unsafe state) jika tidak terdapat cara untuk memenuhi semua permintaaan yang saat ini ditunda dengan menjalankan proses-proses dengan suatu urutan.

      Algoritma Bankir
      Algoritma penjadualan ini diungkapkan oleh Dijkstra (1965) lebih dikenal dengan nama Algoritma Bankir. Model ini menggunakan suatu kota kecil sebagai percontohan dengan suatu bank sebagai sistem operasi, pinjaman sebagai sumber daya dan peminjam sebagai proses yang membutuhkan sumber daya. Deadlock akan terjadi apabila terdapat seorang peminjam yang belum mengembalikan uangnya dan ingin meminjam kembali, padahal uang yang belum dikembalikan tadi dibutuhkan oleh peminjam lain yang juga belum mengembalikan uang pinjamannya.
      Beberapa kelemahan algoritma Bankir Tanenbaum (1992), Stallings (1995) dan Deitel (1990) adalah sebagai berikut:
         1. Sulit untuk mengetahui seluruh sumber daya yang dibutuhkan proses pada awal eksekusi.
         2. Jumlah proses yang tidak tetap dan berubah-ubah.
         3. Sumber daya yang tadinya tersedia dapat saja menjadi tidak tersedia kembali.
         4. Proses-proses yang dieksekusi haruslah tidak dibatasi oleh kebutuhan sinkronisasi antar proses.
         5. Algoritma ini menghendaki memberikan semua permintaan selama waktu yang berhingga.




      Menghindari terjadinya deadlock. Tujuan metode ini adalah menghindarkan kondisi-kondisi yang paling mungkin menimbulkan deadlock agar memperoleh utilisasi sumber daya lebih baik. Penghindaran ini bukan berarti menghilangkan semua kemungkinan terjadinya deadlock. Secara teoritis, deadlock memungkinkan. Sistem operasi memeriksa semua permintaan sumber daya secara hari-hati. Jika sistem operasi mengetahui bahwa alokasi sumber daya menimbulkan resiko deadlock, sistem menolak pengaksesan itu. Dengan menghindari terjadinya deadlock.


      Banker's Algorithm for Deadlock Avoidance
      When a request is made, check to see if after the request is satisfied, there is a (atleast one!) sequence of moves that can satisfy all the requests. ie. the new state is safe. If so, satisfy the request, else make the request wait.
      How do you find if a state is safe

          n process and m resources
          Max[n * m]
          Allocated[n * m]
          Still_Needs[n * m]
          Available[m]
          Temp[m]
          Done[n]

      while () {
         Temp[j]=Available[j] for all j
         Find an i such that
             a) Done[i] = False
             b) Still_Needs[i,j] <= Temp[j]
         if so {
             Temp[j] += Allocated[i,j] for all j
             Done[i] = TRUE}
         }
         else if Done[i] = TRUE for all i then state is safe
         else state is unsafe
      }





      Mendeteksi Deadlock dan Memulihkan Deadlock
      Metode ini mengunakan pendekatan dengan teknik untuk menentukan apakah deadlock sedang terjadi serta proses-proses dan sumber daya yang terlibat dalam deadlock tersebut. Setelah kondisi deadlock dapat dideteksi, maka langkah pemulihan dari kondisi deadlock dapat segera dilakukan. Langkah pemulihan tersebut adalah dengan memperoleh sumber daya yang diperlukan oleh proses-proses yang membutuhkannya. Beberapa cara digunakan untuk mendapatkan sumber daya yang diperlukan, yaitu dengan terminasi proses dan pre-emption (mundur) suatu proses. Metode ini banyak digunakan pada komputer mainframe berukuran besar.
      Terminasi Proses
      Metode ini akan menghapus proses-proses yang terlibat pada kondisi deadlock dengan mengacu pada beberapa syarat. Beberapa syarat yang termasuk dalam metode ini adalah, sebagai berikut:
          o Menghapus semua proses yang terlibat dalam kondisi deadlock (solusi ini terlalu mahal).
          o Menghapus satu persatu proses yang terlibat, sampai kondisi deadlock dapat diatasi (memakan banyak waktu).
          o Menghapus proses berdasarkan prioritas, waktu eksekusi, waktu untuk selesai, dan kedalaman dari rollback.
      Resources Preemption
      Metode ini lebih menekankan kepada bagaimana menghambat suatu proses dan sumber daya, agar tidak terjebak pada unsafe condition.
      Beberapa langkahnya, yaitu:
          o Pilih salah satu - proses dan sumber daya yang akan di-preempt.
          o Rollback ke safe state yang sebelumnya telah terjadi.
          o Mencegah suatu proses agar tidak terjebak pada starvation karena metode ini.

      Kesimpulan

      Kondisi deadlock akan dapat terjadi jika terdapat dua atau lebih proses yang akan mengakses sumber daya yang sedang dipakai oleh proses yang lainnya. Pendekatan untuk mengatasi deadlock dipakai tiga buah pendekatan, yaitu:
    * Memastikan bahwa tidak pernah dicapai kondisi deadlock
    * Membiarkan deadlock untuk terjadi dan memulihkannya
    * Mengabaikan apa pun deadlock yang terjadi

Dari ketiga pendekatan diatas, dapat diturunkan menjadi empat buah metode untuk mengatasi deadlock, yaitu:

    * Pencegahan deadlock
    * Menghindari deadlock
    * Mendeteksi deadlock
    * Pemulihan deadlock

Namun pada sebagian besar Sistem Operasi dewasa ini mereka lebih condong menggunakan pendekatan untuk mengabaikan semua deadlock yang terjadi
Silberschatz (1994) merumuskan sebuah strategi penanggulangan deadlock terpadu yang dapat disesuaikan dengan kondisi dan situasi yang berbeda, strateginya sendiri berbunyi:

   1. Kelompokkan sumber daya kedalam kelas yang berbeda
   2. Gunakan strategi pengurutan linear untuk mencegah kondisi circular waityang nantinya akan mencegah deadlock diantara kelas sumber daya
   3. Gunakan algoritma yang paling cocok untuk suatu kelas sumber daya yang berbeda satu dengan yang lain.

Tugas Praktikum Sistem Operasi Linux

1. Instruksi pada linux dan Maksudnya :

$ cd         : menuju ke direktori home
$ pwd      : untuk melihat direktori yang aktif atau sedang di gunakan
$ ls -al      : melihat isi direktori
$ cd .       : melihat direktori aktual dan parent directory
$ pwd      : melihat direktori yang aktif
$ ls -al     : melihat isi direktori
$ cd ..      : menuju direktori satu level ke atas
$ pwd      : melihat direktori yang akif
$ ls -al     : melihat isi direktori
$ cd /etc  : masuk ke direktori etc
$ls -al | more : untuk melihat isi direktori tetapi hanya sebagian yang di tampilkan sehingga harus  menekan tombol untuk melihat semuanya.
$ cat passwd : untuk melihat isii file text
$ cd -       : masuk ke direktori sebelumnya
$ pwd       : melihat direktori yang aktif

2. Ukuran File dan Direktori terbesar dari hasil perintah $ ls :

ukuran file dan direktoi terbesar adalah : -2.
ukuran file dan direktoi terbesar adalah : -rw------- 1 nursohib
nursohib 1196032 2010- 10-28 18:09 .xsession-errors.old

3. File yg terbentuk dari perintah :
$ touch {report,graph}_{jan,feb,mar} adalah :
file yang terbentuk adalah :
graph_jan, graph_feb, graph_mar, report_jan, report_feb, report_mar

4. Gunakan Perintah mkdir dan perintah ls untuk melihat hasilnya.
Perhatikan pohon direktorinya :

















5. Perintah memindahkan file :
mv {graph_jan,graph_feb,graph_mar} SO/graphs

6. Perintah memindahkan file :
mv {report_jan,report_feb} SO/graphs

7. Perintah menghapus file :
cd SO/report, kemudian rm report_jan

Tugas Teori Sistem Operasi Linux

Gambar Struktur Direktori Pohon pada Linux :




5 Direktori Standard pada Linux :

  1. / etc : Berisi file administrative ( konfigurasi dll ) dan file executable atau script yang berguna untuk administrative system
  2. /  dev : Berisi file khusus yang merepresentasikan peralatan hardware seperti memori, disk, printer, tape, floopy, jaringan.
  3. / bin : Berisi program standar linux ( binary )
  4. / usr/sbin : berisi utilitas linux
  5. / usr/lib : berisi program library yang di perlukan untuk kompilasi program ( misalnya C). berisi intruksi (command) misalnya untuk print, Spooler (lpadmin).
Aturan Penamaan File dan Direktori pada Linux :

1)     Nama file terdiri dari max. 256 karakter.
2)     Dapat menggunakan huruf besar dan kecil.
3)     Linux membedakan huruf besar dan kecil.
4)     Dapat menggunakan tanda titik (.), dash (-), underscore (_). 
Maksud Nama Path Absolut dan Relatif :

Ada dua jenis nama path, yaitu nama path absolut dan nama path relatif. 
Nama path absolut memiliki informasi lengkap dari akar direktorinya, misalnya "C:\workspace\balikfile\data.dat".
Sedangkan Nama path relatif adalah nama file yang dihitung mulai dari direktori aktifnya

Perintah - Perintah pada LINUX :

Perintah cd      :
Change Directory atau untuk berpindah direktori dan saya kira Anda tidak akan menemui kesulitan menggunakan perintah ini karena cara penggunaanya mirip dengan perintah cd di DOS.

Perintah ls     :
Menampilkan isi dari sebuah direktori seperti perintah dir di DOS. Anda dapat menggunakan beberapa option yang disediakan untuk mengatur tampilannya di layar. Bila Anda menjalankan perintah ini tanpa option maka akan ditampilkan seluruh file nonhidden(file tanpa awalan tanda titik) secara alfabet dan secara melebar mengisi kolom layar. Option -la artinya menampilkan seluruh file/all termasuk file hidden(file dengan awalan tanda titik) dengan format panjang.

Perintah cp     :

Untuk menyalin file atau copy. Misalnya untuk menyalin file1 menjadi file2:
 $ cp

Perintah mv     :
Untuk memindahkan file dari satu lokasi ke lokasi yang lain. Bila argumen yang kedua berupa sebuah direktori maka mv akan memindahkan file ke direktori tersebut. Bila kedua argumen berupa file maka nama file pertama akan menimpa file kedua. Akan terjadi kesalahan bila Anda memasukkan lebih dari dua argumen kecuali argumen terakhir berupa sebuah direktori.



Perintah rm     :
Untuk menghapus file dan secara default rm tidak menghapus direktori. Gunakan secara hati-hati perintah ini terutama dengan option -r yang secara rekursif dapat mengapus seluruh file.

Perintha touch :
perintah tersebut di gunakan untuk membuat file kosong atau mengubah file

Perintah mkdir     :
Membuat direktori baru, sama dengan perintah md di DOS.

Perintah rmdir     :
Untuk menghapus direktori kosong.

Perintah file :
perintah tersebut adalah perintah untuk meihat tipe file

Perintah cat     :

Menampilkan isi dari sebuah file di layar.
$ cat namafile

Perintah less :
perintah untuk melihat halaman teks halaman per halaman

Senin, 05 Juli 2010

Modul 7. Bubble Sort dengan penggunaan List

<html>
<head>
<title>Bubble sort dengan penggunaan list - Nursohib</title>
<script language="javascript">
<!--
var queue = new Array();

function masukkan_data(data)
{
queue.unshift(parseInt(data)); //pake parseInt supaya jd angka, kalo ga

pake ngaco karena dianggap string
}

function isi_dari_data(list)
{
list.options.length = 0;
for (var i = 0; i < queue.length; i++)
{
var data = new Option(queue[i]);
list.options[list.options.length] = data;
}
}

function urutkan_asc(list)
{
for (var a=queue.length-1; a>=0; a--)
{
for (var j=0; j<=a; j++)
{
if (queue[j+1] < queue [j] )
{
var DataTemporer = queue [j];
queue [j] = queue [j+1];
queue[j+1] = DataTemporer;
}
}
}
}

function urutkan_desc(list)
{
for (var a=queue.length-1; a>=0; a--)
{
for (var j=0; j<=a; j++)
{
if (queue[j+1] > queue [j] )
{
var DataTemporer = queue [j];
queue [j] = queue [j+1];
queue[j+1] = DataTemporer;
}
}
}
}
//-->
</script>
</head>

<body>
<font color=#992811>Praktikum Bubble Sort</font>
<form>
<input type=text name=textSimpan size=5>
<input type=button value="Masukkan data" onClick =

'masukkan_data(textSimpan.value);
textSimpan.value = "";
isi_dari_data(antrian);'>
<select name="antrian" size=12>
<option>Data masukan....
</select>

<input type=button value="Urutkan menaik"

onClick='urutkan_asc(pengurutan);


isi_dari_data(pengurutan);'>
<input type=button value="Urutkan menurun"

onClick='urutkan_desc(pengurutan);


isi_dari_data(pengurutan);'>
<select name="pengurutan" size=12>
<option>Hasil pengurutan...
</select>
</form>
</body>
</html>


Minggu, 27 Juni 2010

Modul 7. Bubble Sort : Algoritma pengurutan/sorting dengan menggunakan teknik bubble sort.

<html>
<head>
<title>Modul 7. Bubble Sort</title>
<script language = "Javascript">

function Urutkan(form)
{
DataKosong= false;
DataInputan = form.Data.value;
inputData = DataInputan.split (",");
for (var i = 0; i<inputData.length; i++)
{
inputData [i] = parseInt (inputData[i], 10);
if (isNaN (inputData [i]) )
{
DataKosong = true;
break;
}
}

inputData = bubbleSort (inputData, 0, inputData.length-1);
if (DataKosong)
{
alert ("Silakan Entri Dulu Data, Pisahkan dengan tanda Koma");
form.Data.focus(); // jika data kosong, kursor akan berada di form data

(focus)
}
else
{
form.Hasil.value = DataString (inputData,0);
}
}

function DataString (ArrayData, Angka)
{
if ( (ArrayData.length - 1) >= Angka)
return (ArrayData[Angka] + "," + DataString (ArrayData, (Angka + 1) ) );
else
return "";
}

function bubbleSort (ArrayData, Mulai, MulaiBaru)
{
for (var i=MulaiBaru-1; i>=Mulai; i--)
{
for (var j=Mulai; j<=i; j++)
{
if (ArrayData[j+1] > ArrayData [j] )
{
var DataTemporer = ArrayData [j];
ArrayData [j] = ArrayData [j+1];
ArrayData[j+1] = DataTemporer;
}
}
}
return ArrayData;
}

</script>
</head>

<body>
<center>
<form>
Masukan Deretan Angka, Pisahkan dengan Koma :
<hr>
<input type = text name=Data size=30 Value="">
<br>
<input type = button value="Urutkan" onClick="Urutkan (this.form)">
<br>
<br>
Hasil Pengurutan :
<hr>
<input type=text name=Hasil size=30>

</form>
</center>
</body>
</html>

Kamis, 20 Mei 2010

Modul 7. Algoritma Dijkstra : Contoh Program Algoritma Dijkstra

<html>
<head><title>Algoritma Dijkstra</title>
</head>

<body>
<script language = "javascript">
<!--
var nilaiacuan = 10000;
var takterdefinisi = -1;
var namaverteks = new Array('A', 'B', 'C', 'D', 'E', 'F');
var matriks = new Array(6);

function bobot(a,b)
{
return matriks[a][b];
}

function dijkstra(jumlahverteks,awal,d) //panjang matriks, dari, ke
{
var posisi = new Array(jumlahverteks);
var i;
var kunjungan = new Array(jumlahverteks);
var sebelum = new Array(jumlahverteks);

for (i=0; i<jumlahverteks; i++)
{
posisi[i] = nilaiacuan;
sebelum[i] = takterdefinisi;
kunjungan[i] = false;
}

posisi[awal] = 0;

var verteks;
for (verteks=0; verteks<jumlahverteks; verteks++)
{
var jarakterpendek = nilaiacuan;
var berhenti = -1;
for (i=0; i<jumlahverteks; i++)
{
if (!kunjungan[i])
{
if (posisi[i] <= jarakterpendek)
{
jarakterpendek = posisi[i];
berhenti = i;
}
}
}
kunjungan[berhenti] = true;
for (i=0; i<jumlahverteks; i++)
{
if (!kunjungan[i])
{
var w = bobot(berhenti, i);
if (posisi[berhenti]+w < posisi[i])
{
posisi[i] = posisi[berhenti] + w;
sebelum[i] = berhenti;
}
}
}
}

i = d;
if (posisi[i] < nilaiacuan)
{
var lintasan = namaverteks[i];
var verteks = i;
while (verteks>0)
{
verteks = sebelum[verteks];
if (verteks >= 0)
lintasan = namaverteks[verteks] + "->" + lintasan;
}
alert ("Jarak terpendek dari " +namaverteks[dari]+ " ke " +namaverteks[d]+ " : " + posisi[i] + " (" + lintasan + ")");
}
else
{
alert ("Tidak ada jalur");
}
}

function init()
{
var x = '~';

document.write('<pre>');
document.write(" A B C D E F" + '<br>');

document.write('A ' + (matriks[0]=new Array(0,2,3,x,x,x)) + '<br>');

document.write('B ' + (matriks[1]=new Array(2,0,3,6,x,x)) + '<br>');

document.write('C ' + (matriks[2]=new Array(3,3,0,3,5,x)) + '<br>');

document.write('D ' + (matriks[3]=new Array(x,6,3,0,1,3)) + '<br>');

document.write('E ' + (matriks[4]=new Array(x,x,5,1,0,1)) + '<br>');

document.write('F ' + (matriks[5]=new Array(x,x,x,3,1,0)) + '<br>');

document.write('</pre>');

document.write('<pre>A-2-B-6--D--3-F <br>');

document.write('\\ | /| / <br>');

document.write(' 3 3 3 1 1 <br>');

document.write(' \\ | / | / <br>');

document.write(' \\|/ |/ <br>');

document.write(' C--5-E <br> </pre>');

}

init();
var dari = 0; // A
var ke = 5; // F

dijkstra(matriks.length,dari,ke);

//-->
</script>
</body>
</html>

Modul 6. Linked List : Program penggunaan Linked List.

<html>
<head>
<title>Contoh Penggunaan Linked List - Nursohib</title>
</head>
<body>
<font color=33CC00><b><i>Contoh Penggunaan Struktur Data Linked List</i></b></font><br><hr>
<script language="javascript">
<!--
function linkedlist() {
this.panjang = 0;
this.kepala = null;
}

linkedlist.prototype =
{
constructor : linkedlist,

//Metode untuk menambah data
tambah: function (data) {
var node = {data:data,next:null};
var NodeTanda;

if (this.kepala === null)
{
this.kepala = node;
}
else
{
NodeTanda = this.kepala;
while (NodeTanda.next)
{
NodeTanda = NodeTanda.next;
}
NodeTanda.next = node;
}
this.panjang++;
},

//Metode untuk menampilkan data
item: function(index) {
if (index > -1 && index < this.panjang)
{
var NodeTanda = this.kepala,i = 0;
while(i++ < index)
{
NodeTanda = NodeTanda.next;
}
return NodeTanda.data;
}
else
{
return null;
}
},

//Metode untuk membuang data
buang: function(index) {
if (index > -1 && index < this.panjang)
{
var NodeTanda = this.kepala, previous, i = 0;

// Membuang kepala
if (index === 0)
{
this.kepala = NodeTanda.next;
}
else
{
//Mencari index yang tepat
while(i++ < index)
{
previous = NodeTanda;
NodeTanda = NodeTanda.next;
}
previous.next = NodeTanda.next;
}
//decrement panjang
this.panjang--;
//return data
return NodeTanda.data;
}
else
{
return null;
}
},

//Metode untuk menyisipkan data
sisip: function(index,data) {
var node = {data:data,next:null};
var NodeTanda = this.kepala, i = 1;

if (index === 0)
{
node.next = this.kepala;
this.kepala = node;
}
else
{
while (i++ < index)
{
NodeTanda = NodeTanda.next;
}
node.next = NodeTanda.next;
NodeTanda.next = node;
}
this.panjang++;
},

//Metode untuk melihat ukuran panjang linked list
ukuran: function() {
return this.panjang;
},

//Metode untuk merubah ke Array
toArray: function() {
var result = [];
var NodeTanda = this.kepala;

while(NodeTanda) {
result.push(NodeTanda.data);
NodeTanda = NodeTanda.next;
}
return result;
},

//Metode untuk merubah ke String
toString: function() {
return this.toArray().toString();
}

};

//Fungsi untuk menampilkan isi variabel list
function tampil()
{
for (i=0; i<5; i++)
{
document.write(list.item(i) + "<br>");
}
document.write("<hr>");
}

var list = new linkedlist();

//Menambah data ke variabel list
list.tambah("00000");
list.tambah("11111");
list.tambah("22222");
list.tambah("33333");
list.tambah("44444");

document.write("Isi LinkedList : <br>");
tampil();

//Membuang salahsatu isi variabel list
list.buang(1);

document.write("Isi LinkedList : (Setelah data pada index ke-1 dibuang) <br>");
tampil();

//Menyisipkan data ke variabel list
list.sisip(2,"DATA SISIP");

document.write("Isi LinkedList : (Setelah menyisipkan data di index ke-2) <br>");
tampil();

document.write("Panjang variabel list adalah = ");
document.write(list.ukuran());
//-->
</script>
</body>
</html>

Senin, 10 Mei 2010

Modul 5 Latihan 2. Queue (Antrian) : Program penggunaan Queue/antrian

<html>
<head>
<title>Penggunaan Queue</title>
<script language="javascript">
<!--
var queue = new Array();

function masuk_antrian(data)
{
queue.unshift(data);
}

function keluar_antrian()
{
var yang_keluar_antrian = queue.pop();
if (queue.length == 0)
return (yang_keluar_antrian + " -> Queue sudah kosong");
else
return yang_keluar_antrian;
}

function dalam_antrian(list)
{
list.options.length = 0;
for (var i = 0; i < queue.length; i++)
{
var data = new Option(queue[i]);
list.options[list.options.length] = data;
}
}

//-->
</script>
</head>

<body>
<font color=#992811>Visualisasi Queue (Antrian)</font>
<form>
<input type=text name=textSimpan>
<input type=button value="Masuk Antrian" onClick =

'masuk_antrian(textSimpan.value);
textSimpan.value = "";
dalam_antrian(visualisasi);'>
<select name="visualisasi" size=12>
<option>Isi antrian....
</select>
<br>
<input type=text name=textAmbil size=20>
<input type=button value="Keluar Antrian" onClick='textAmbil.value =

keluar_antrian();
dalam_antrian(visualisasi);'>
</form>
</body>
</html>