Read-Copy Update, yang umum disebut RCU, adalah keluarga mekanisme sinkronisasi yang banyak dipakai kernel Linux untuk data yang sering dibaca dan lebih jarang diubah. Langkah utamanya adalah memisahkan dua kejadian yang pada locking biasa kerap dianggap satu: menghapus objek dari struktur bersama dan mereklamasi memori yang menyimpannya.
Writer dapat memublikasikan state baru atau melepas objek lama sementara reader tetap berjalan di dalam read-side critical section. Storage lama dipertahankan sampai kernel memastikan bahwa setiap reader yang mungkin sempat melihat referensi lama telah melewati quiescent state. Interval tersebut adalah RCU grace period.
Penghapusan tidak langsung membuat storage boleh dibebaskan
Bayangkan sebuah pointer bersama menuju suatu objek. Reader dapat mengambil pointer itu dan mulai memakai objek ketika writer secara bersamaan mengganti pointer bersama.
reader writer
ambil pointer -> objek A
publikasikan objek B
pakai objek A
objek A tetap dipertahankan
keluar dari RCU read section
grace period selesai
reklamasi objek ASetelah objek B dipublikasikan, reader baru dapat mengikuti pointer baru. Reader yang sebelumnya sudah memperoleh objek A mungkin masih aktif, sehingga membebaskan A pada saat publikasi dapat mengubah pembacaan yang sah menjadi use-after-free.
Karena itu RCU memperlakukan penghapusan logis dan reklamasi fisik sebagai operasi berbeda. Struktur bersama dapat beralih ke state baru sebelum storage yang sudah tidak terhubung dikembalikan ke allocator.
Read-side section menetapkan batas lifetime
Kode kernel menandai RCU read-side critical section dengan API yang sesuai dengan varian RCU yang digunakan. Di dalam aturan yang berlaku, reader dapat melakukan dereference terhadap pointer yang dilindungi RCU dan mengandalkan objek tersebut tetap hidup selama interval yang disyaratkan.
Hal ini tidak membuat setiap field menjadi immutable. Writer tetap memerlukan protokol publikasi yang benar, dan reader memerlukan primitive akses yang cocok ketika update konkuren mungkin terjadi. RCU melindungi pola lifetime dan visibility; mekanisme ini bukan pengganti universal untuk seluruh sinkronisasi.
Manfaat praktisnya adalah jalur pembacaan yang umum sering tidak perlu mengambil lock milik writer yang sedang mengalami contention. Karakteristik ini berguna untuk routing table, struktur lookup, credential, state networking, serta data kernel lain yang diakses banyak CPU.
Grace period memperhitungkan reader yang sudah aktif
Grace period bukan sekadar jeda tetap berdasarkan timer. Penyelesaiannya mewakili kondisi ordering: reader yang mungkin menyimpan referensi dari sebelum update tidak lagi berada dalam read-side critical section yang dapat memakai referensi tersebut.
Mekanisme detailnya bergantung pada implementasi RCU dan konfigurasi kernel. Linux melacak quiescent state dan mengoordinasikan CPU agar progres grace period dapat ditetapkan tanpa mewajibkan setiap reader menaikkan dan menurunkan satu reference counter global.
Perbedaan ini penting. Tidur selama durasi arbitrer tidak dapat membuktikan bahwa reader yang tertahan atau terkena preemption sudah berhenti memakai objek. Deteksi grace period terkait dengan execution state, bukan sekadar waktu yang berlalu.
Publikasi memerlukan ordering selain penggantian pointer
Reader konkuren tidak boleh melihat pointer yang baru dipublikasikan sambil memperoleh state di belakangnya yang belum selesai diinisialisasi. Linux menyediakan primitive publikasi dan dereference RCU yang membawa semantik ordering untuk pola yang didukung.
Writer biasanya menyiapkan objek sebelum membuat pointernya dapat dijangkau. Reader yang sesuai memperoleh pointer tersebut melalui jalur akses RCU. Barrier dan compiler constraint yang relevan mencegah urutan publikasi berubah menjadi konvensi plain pointer yang tidak aman.
Detailnya sensitif terhadap arsitektur, sehingga kode kernel mengandalkan API RCU alih-alih menanam asumsi mengenai model memori CPU tertentu.
Reklamasi dapat ditunda dengan beberapa bentuk
Writer yang harus menunggu secara sinkron dapat memakai operasi sinkronisasi RCU yang sesuai dengan konteksnya. Jalur lain dapat mengantrekan pekerjaan tertunda agar reklamasi berlangsung setelah grace period tanpa menahan task updater selama seluruh interval.
Pilihan ini memengaruhi latency dan tekanan resource. Penantian sinkron membuat alur kontrol sederhana tetapi dapat menunda writer. Reklamasi berbasis callback membuat writer dapat melanjutkan eksekusi, sementara objek yang sudah dipensiunkan tetap memakai memori sampai callback-nya memenuhi syarat untuk dijalankan.
Laju update yang tinggi karena itu dapat membentuk backlog reklamasi tertunda meski eksekusi sisi reader efisien. RCU memindahkan sebagian biaya sinkronisasi dari jalur baca; biaya tersebut tidak hilang.
RCU tidak otomatis menserialisasi writer yang bersaing
Dua writer yang mengubah struktur sama tetap dapat memerlukan lock, operasi atomic, atau protokol update lain. RCU terutama menyediakan pola publikasi aman dan reklamasi tertunda bagi reader yang berjalan bersamaan dengan update.
Sebagai contoh, struktur linked dapat memakai lock untuk menserialisasi insertion dan removal sementara reader menelusurinya di bawah proteksi RCU. Writer lock mencegah edit struktur yang saling bertabrakan; grace period menjaga storage agar tidak menghilang ketika traversal lama masih memakainya.
Pemisahan tugas tersebut membuat desain lebih jelas: serialisasi update menangani race writer-versus-writer, sedangkan aturan lifetime RCU menangani race reader-versus-reclamation.
Reader yang panjang menunda pemakaian ulang memori
Reader yang terlalu lama berada di dalam RCU read-side critical section dapat menunda saat objek yang sudah dipensiunkan boleh direklamasi. Dampaknya berbeda menurut varian RCU dan konfigurasi kernel, tetapi tekanannya sama: progres reklamasi bergantung pada reader lama yang relevan berhenti memenuhi syarat sebagai pengguna aktif state yang sudah dipensiunkan.
Pada sistem dengan update yang sering, durasi reader dapat menjadi persoalan pengelolaan memori. Read-side section yang singkat menjaga batas lifetime tetap rapat dan membuat callback tertunda bergerak lebih terprediksi.
Karena itu diagnosis masalah RCU tidak hanya berkaitan dengan siklus lock konvensional. Stall, backlog callback, akses pointer yang keliru, dan pembebasan terlalu dini dapat menandakan pelanggaran terhadap protokol lifetime yang dimaksud.
Grace period membuat referensi lama aman melewati publikasi
RCU memungkinkan struktur bersama mengekspos state baru tanpa memaksa setiap reader aktif berhenti tepat pada batas update. Writer lebih dulu menghapus atau mengganti reachability, lalu reklamasi menunggu sampai reader yang sudah ada tidak lagi dapat bergantung pada objek yang dipensiunkan.
Pemisahan tersebut adalah trade-off rekayasa utamanya. Jalur baca dapat tetap ringan, sedangkan jalur update membawa ordering publikasi, koordinasi grace period, dan reklamasi memori tertunda. Dengan API kernel yang sesuai, hasilnya adalah model concurrency yang dibangun di atas overlap aman, bukan exclusion langsung.