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 i increment sehingga hasil akhirnya 9.

Methods integer atomik hanya berjalan untuk tipe data atomic_t. Fungsi atomik akan menggunakan tipe data ini dan tidak akan mengirim tipe data ini ke fungsi nonatomik. Dalam penggunaannya, compiler tidak mengakses langsung nilai dari data ini namun yang diakses adalah alamat memorinya. Integer atomik (atomic_t) memiliki 32 bits dalam representasinya. Namun yang dipakai untuk menyimpan suatu nilai hanya 24 bits karena 8 bits sisanya dipakai untuk lock yang berfungsi untuk memproteksi concurrent access ke data atomic yang bersangkutan. Hal ini diimplementasikan dalam SPARC port pada LINUX

Gambar 22.2. 32-bit atomic_t

32-bit atomic_t

Untuk menggunakan atomic integer operations perlu dideklarasikan terlebih dahulu <asm/atomic.h>. Berikut ini contoh penggunaan atomic integer :

        
atomic_t v;                 
atomic_t v = ATOMIC_INIT(0);  
               
atomic_set(&v,4);           
atomic_add(2,&v);         
atomic_inc(&v);        

printk("%d\n",atomic_read(&v));     

   

Fungsi atomic_t v akan mendefinisikan variabel v sebagai sebuah integer atomik. Kemudian variabel v akan diinisialisasi menjadi 0 oleh fungsi ATOMIC_INIT(0). Untuk mengeset nilai v misalnya menjadi 4 secara atomik dapat digunakan fungsi atomic_set(&v,4). Menambah nilai v secara atomik dengan menggunakan fungsi atomic_add(2,&v). Variabel v dapat juga dikenakan atomic increment dengan menggunakan fungsi atomic_inc(&v). Fungsi printk("%d\n",atomic_read(&v)) akan mencetak nilai v.

Berikut ini beberapa Atomic Integer Operations :

Tabel 22.1. Tabel Atomic Integer Operations

Atomic Integer OperationDescription
ATOMIC_INIT(int i) inisialisasi atomic_t menjadi i
atomic_read(atomic_t *v) membaca nilai integer dari v
void atomic_set(atomic_t *v,int i) set nilai v menjadi i
void atomic_add(int i,atomic_t *v) menambah v sebesar i
void atomic_sub(int i,atomic_t *v) mengurangi c sebesar i
void atomic_inc(atomic_t *v) menambah v dengan 1
void atomic_dec(atomic_t *v) mengurangi v dengan 1