Lompat ke isi

Semafor (pemrograman)

Dari Wikipedia bahasa Indonesia, ensiklopedia bebas

Semaforadalah sebuahstruktur datakomputer yang digunakan untuksinkronisasiproses, yaitu untuk memecahkan masalah di mana lebih dari satu proses atauthreaddijalankan secara bersamaan dan harus diatur urutan kerjanya. Semafor dicetuskan olehEdsger Dijkstradan pertama digunakan dalamsistem operasiTHE.

Nilai semafor diinisialisasi dengan jumlah resource yang dikendalikannya. Dalam kasus khusus di mana ada satu shared resource, semafornya disebut "semafor biner". Semafor adalah solusi klasik daridining philosophers problem,walaupun tidak mencegahdeadlock.

Penjelasan[sunting|sunting sumber]

Semafor hanya dapat diakses dengan menggunakan operasi berikut:

P(Semaphore s)
{
wait until s > 0, then s:= s-1;
/* must beatomiconce s > 0 is detected */
}

V(Semaphore s)
{
s:= s+1; /* must be atomic */
}

Init(Semaphore s, Integer v)
{
s:= v;
}

Perhatikan bahwa menginkrementasi variabelstidak boleh diinterupsi, dan operasiPtidak boleh diinterupsi bila s ditemukan sebagai nonzero. Hal ini dapat dilakukan dengan perintah sepertitest-and-set(bilainstruction setarsitektur komputer mendukungnya), atau (dalam sistem prosesor mikro) mengabaikaninterruptuntuk mencegah proses lain menjadi aktif.

Nama-namaPdanVberasal daribahasa Belanda.Vartinyaverhoog,atau "inkrementasi". Beberapa penjelasan telah diusulkan untukP,termasukpasseer"pass",probeer"coba", danpakken"ambil" ), tapi Dijkstra sebenarnya menulis bahwa ia memaksudkanPsebagailakuranrekaannya sendiriprolaag,singkatan dariprobeer te verlagen,atau "coba untuk dekrementasi". Hal ini berasal dari kenyataan bahwa dalam bahasa Belanda, kata untuk dekrementasi dan inkrementasi sama-sama diawali hurufV,dan bila kata tersebut dituliskan secara lengkap dapat membingungkan pembaca yang tidak dapat berbahasa Belanda.

Nilai semafor adalah jumlah resource yang bebas. Bila hanya ada satu resource, sebuah semafor biner dengan nilai 0 atau 1 digunakan. OperasiPbusy-waitsampai sebuah resource tersedia, kemudian mengklaimnya.Vadalah kebalikannya; ia membuat sebuah resource tersedia kembali setelah proses selesai menggunakannya.Inithanya digunakan di awal untuk menginisialisasi nilai semafor. OperasiPdanVharusatomic,artinya operasi ini tidak boleh diselingi oleh proses lain dalam semafor yang sama.

Dalambahasa pemrogramanALGOL 68,dalamkernel Linux,dan dalam beberapa bukubahasa Inggris,operasiPdanVdisebut masing-masingdowndanup.Dalam teknik perangkat lunak, mereka biasanya disebutwaitdansignal,atautakedanrelease,ataupenddanpost.

Untuk menghindari busy-waiting, sebuah semafor dapat memiliki sebuahqueueatau antrian proses (biasanyaFIFOatau pertama-masuk-pertama-keluar). Bila sebuah proses melakukanPpada sebuah semafor yang memiliki nilai 0, proses ini ditambahkan ke antrian. Ketika proses lain menginkrementasi nilai semafor denganV,dan ada proses dalam antrian, salah satunya diambil dari antrian dan mulai dijalankan.

Semafor masih digunakan dalam bahasa pemrograman yang tidak mendukung bentuk sinkronisasi lain. Kecenderungan perkembangan bahasa pemrograman saat ini bergerak ke arah sinkronisasi yang lebih terstruktur, misalnya denganmonitordanchannel.Selain ketidakmampuannya mencegah deadlock, semafor tidak melindungi pemrogram dari kesalahan mengambil semafor yang sudah dipegang proses lain, dan lupa melepaskan semafor yang sudah diambil. Dengan kata lain, pemrograman semafor termasuk rumit danerror-prone.

Contoh[sunting|sunting sumber]

Karena semafor dapat memiliki variabel penghitung, ia dapat digunakan ketika beberapa threads ingin mencapai suatu tujuan secara bekerja sama. Misalnya:

Ada threadAyang ingin informasi dari 2 basis data sebelum ia dapat maju. Akses ke kedua basis data tersebut dikendalikan oleh dua threadBdanC.Keduanya memiliki message-processing loop; semua yang ingin menggunakannya menulis pesan dalam antrian pesan. ThreadAmenginisialisasi semaforSdenganinit(S,-1).Akemudian menulis permohonan data, termasuk pointer ke semaforS,kepada baikBmaupunC.KemudianAmemanggilP(S),yang memblokir. Kedua thread lain mengambil informasi; setelah mereka selesai, mereka memanggilV(S)dalam semafor. Hanya setelah keduanya selesai mengambil data, threadAdapat maju. Semafor seperti ini disebut "counting semaphore".

Selain counting semaphore, terdapat juga "blocking semaphore", yaitu semafor yang diinisialisasi dengan nilai 0. Artinya setiap thread yang melakukanP(S)akan diblokir sampai thread lain memanggilV(S).Jenis ini sangat berguna ketika urutan eksekusi thread harus diperhatikan.

Bentuk semafor paling sederhana adalah "semafor biner", digunakan untuk mengendalikan akses kepada satu resource, atau disebut jugamutual exclusion.Sebuah semafor biner selalu diinisialisasi dengan nilai 1. Ketika resource sedang digunakan, thread yang menggunakan memanggilP(S)untuk mengurangi nilai ini menjadi 0, dan setelah selesai menginkrementasi kembali nilainya menjadi 1 untuk menandakan resource yang sekarang bebas.

Pranala luar[sunting|sunting sumber]