Exclusive. Jika sebuah transaksi Ti melakukan exclusive-mode lock pada data Q, maka transaksi

Bab 22. Sinkronisasi Linux

22.1. Pendahuluan

Pada suatu saat dalam sebuah kernel, tidak terkecuali kernel Linux, dapat terjadi concurrent access. Yang dimaksud dengan concurrent access adalah beberapa thread yang sedang berjalan mengakses resources yang sama dalam waktu yang sama. Jika hal ini terjadi, thread-thread tersebut akan saling meng-overwrite perubahan yang dilakukan thread sesamanya sebelum perubahan tersebut mencapai state yang konsisten. Sehingga hasil dari proses tidak seperti yang diharapkan. Dalam hal ini diperlukan proteksi dalam kernel yang bersangkutan. Proteksi dapat dilakukan dengan sinkronisasi. Proteksi resources dari concurrent access bukanlah merupakan hal yang mudah. Beberapa tahun yang lalu sebelum Linux mendukung adanya symmetrical multiprocessing, proteksi masih mudah dilakukan. Karena hanya ada satu processor yang didukung, satu-satunya cara bagi resources dapat diakses secara concurrent bersama-sama oleh thread adalah ketika ada interrupt atau memang ada jadwal dari kernel bahwa thread lain diperbolehkan untuk mengakses resources tersebut. Namun dengan berkembangnya zaman, Linux akhirnya mendukung adanya symmetrical multiprocessing dalam versi 2.0 kernelnya. Multiprocessing artinya kernel code dapat dijalankan dalam dua atau lebih processor. Jika tanpa proteksi, code yang dijalankan dalam dua processor yang berbeda dapat mengakses resources yang sama dalam waktu yang sama. Dengan adanya Linux 2.6 kernel yang mendukung adanya konsep preemptive, scheduler dalam kernel dapat meng interrupt kernel code yang sedang berjalan untuk memberi kesempatan bagi kernel code lain untuk dijalankan. Dengan demikian pengaksesan resources yang sama dalam waktu yang sama dapat dihindari. Dalam bab ini akan dijelaskan bagaimana implementasi sinkronisasi dalam Linux. Metode-metode sinkronisasi yang dibahas meliputi integer atomik yang merupakan salah satu jenis dari operasi atomik, locking yang terdiri dari spin lock dan semafor, dan dijelaskan hal-hal lain yang terkait dengan pembahasan ini.

22.2. Critical Section

Sebuah proses memiliki bagian dimana bagian ini akan melakukan akses dan manipulasi data. Bagian ini disebut dengan critical section. Ketika sebuah proses sedang dijalankan dalam critical sectionnya, tidak ada proses lain yang boleh dijalankan dalam critical sectionnya. Karena hal ini dapat memungkinkan terjadinya akses ke resources yang sama dalam waktu yang sama. Keadaan seperti ini disebut proses tersebut mutually exclusive. Oleh karena itu, diperlukan suatu mekanisme atau aturan agar proses sifat mutually exclusive dapat terpenuhi. Dengan mengontrol variabel mana yang diubah baik didalam maupun diluar critical section, concurrent access dapat dicegah. Critical section biasanya digunakan saat program multithreading, dimana program tersebut terdiri dari banyak thread, akan mengubah nilai dari variabel. Dalam hal ini critical section diperlukan untuk melindungi variabel dari concurrent access yang dapat membuat nilai dari variabel tersebut menjadi tidak konsisten. Lalu bagaimana critical section tersebut diimplementasikan didalam sistem operasi. Metode yang paling sederhana adalah dengan mencegah adanya thread lain yang mengubah variabel yang sedang digunakan dalam critical section. Selain itu, system call yang dapat menyebabkan context switch juga dihindari. Jika scheduler meng-interrupt proses yang sedang mengakses critical sectionnya, maka scheduler akan membiarkan proses tersebut menyelesaikan critical sectionnya atau menghentikannya sementara untuk memberi kesempatan bagi proses lain untuk menjalankan critical sectionnya. Proses yang sedang berada dalam critical sectionnya dijalankan secara mutually exclusive. 153 Contoh 22.1. Critical section do{ critical section }while1

22.3. Penyebab Konkurensi Kernel

Perlunya sinkronisasi disebabkan karena adanya program yang dijadwalkan secara preemptive. Karena proses dapat di interrupt maka proses yang lain dapat masuk ke processor menggantikannya untuk dijalankan. Hal ini memungkinkan proses awal di interrupt di critical regionnya. Jika ada proses baru yang dijadwalkan untuk dijalankan selanjutnya masuk ke critical region yang sama, maka race condition akan terjadi. Ada dua jenis concurrency yaitu pseudo-concurrency dan true-concurrency. Pseudo-concurrency terjadi ketika dua proses tidak benar-benar berjalan dalam waktu yang tepat sama namun ada waktu jeda diantara keduanya. Sedangkan true-concurrency terjadi ketika dua proses berjalan secara bersama-sama yang waktu yang sama. True-concurrency biasanya terjadi pada komputer yang berbasis symmetrical multiprocessing. Ada beberapa penyebab konkurensi kernel, diantaranya: • Interrupt. Interrupt dapat terjadi sewaktu-waktu, menghentikan sementara proses yang sedang berjalan. • Softirqs dan Tasklets. Kernel dapat menjadwalkan Softirqs dan Tasklets sewaktu-waktu untuk menghentikan sementara proses yang sedang berjalan. Softirqs dan Tasklets adalah pengatur interrupt untuk interrupt-interrupt yang tidak dapat dilakukan interrupt-handler yang biasa. Softirqs dapat berjalan secara bersama-sama dalam beberapa processor bahkan dua Softirqs yang sama dapat berjalan bersama-sama. Sifat tasklets hampir sama dengan Softirqs, hanya saja dua tasklets yang sama tidak dapat berjalan secara bersama-sama. • Kernel Preemption. Karena kernel bersifat preemptive, sebuah proses yang sedang berjalan dapat dihentikan sementara oleh proses yang lain. • Sleeping dan Syncronization with user-space. Sebuah proses dalam kernel dapat sleep dan meminta kernel untuk menjalankan proses yang lain. • Symmetrical Multiprocessing. Dua atau lebih processor dapat menjalankan kernel code dalam waktu yang sama.

22.4. Integer Atomik

Salah satu metode dalam kernel LINUX untuk sinkronisasi adalah atomic operations. Integer atomik adalah salah satu jenis dari atomic operations. Atomic operations menyediakan instruksi yang dijalankan secara atomik tanpa interrupt . Contohnya sebuah atomic increment dapat membaca dan meng-increment sebuah variabel dalam sebuah step yang tidak dapat dibagi-bagi. Misalnya i diinisialisasi sama dengan 7 Gambar 22.1. Atomic Operation Thread 1 Thread 2 ------------------------------------------------------------------ Atomic increment i 7 - 8 - - Atomic increment i 8-9 Atomic increment pada thread 1 akan dijalankan sampai selesai tanpa interrupt sehingga hasil dari thread pertama adalah 8. Setelah itu barulah thread 2 dijalankan. Mula-mula nilai i yang dibaca adalah 8 kemudian di iincrement sehingga hasil akhirnya 9. 154