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
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 Operation | Description |
|---|---|
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 |