Pengenalan RCU
- Sistem operasi adalah salah satu program yang paling sensitif terhadap performa dalam penggunaan sehari-hari.
- Sistem operasi selalu bisa dibuat lebih cepat, dan para pengembang kernel serta driver terus berupaya mengoptimalkan kode.
- Sistem operasi memerlukan konkurensi skala besar, menjadwalkan proses dan thread di ruang pengguna, serta memiliki thread internal dan interrupt handler yang berinteraksi dengan perangkat keras.
Cara Kerja RCU
- Ketika data yang sering dibaca tetapi jarang ditulis (misalnya perangkat USB yang saat ini terhubung) perlu diubah secara atomik, digunakan strategi RCU (Read, Copy, Update).
- Data dibaca, disalin lalu diubah, kemudian pointer diperbarui secara atomik ke versi baru.
- Metode ini mudah digunakan dan tidak memiliki latensi tunggu, tetapi dapat menyebabkan kebocoran memori.
Mengatasi Masalah Kebocoran Memori
- Untuk mencegah kebocoran memori, alih-alih menghapus data lama di dalam fungsi pembaruan, penghapusan dapat ditunda hingga tidak ada lagi reader yang sedang membacanya.
- Memori dikelola dengan aman dengan membuat writer menunggu penghapusan data sampai tidak ada reader yang sedang membaca data tersebut.
Penggunaan Nyata RCU
- RCU digunakan puluhan ribu kali di Linux, dan juga dipakai di library C++ Folly milik Facebook serta
crossbeam-epoch di Rust.
- RCU diselaraskan oleh tuntutan performa dan latensi, serta menyediakan pendekatan manajemen memori yang mirip dengan garbage collection.
Kesalahpahaman tentang Garbage Collection
- Anggapan umum bahwa garbage collection lebih lambat daripada manajemen memori manual cepat runtuh ketika detailnya diperiksa.
- Fungsi
free() tidaklah gratis, dan allocator memori harus mempertahankan banyak state secara internal.
- Garbage collector modern menyediakan optimisasi moving dan generational untuk menghadirkan throughput tinggi serta performa cache yang baik.
Ilusi Kendali
- Pengembang kadang ingin membangun sistem real-time, tetapi pada praktiknya mereka tidak memiliki kendali penuh atas manajemen memori.
- Sistem operasi hanya menebak maksud pengembang terkait alokasi memori, dan kadang akses pointer yang sederhana pun bisa berubah menjadi disk I/O.
Kesimpulan
- Tidak semua perangkat lunak mendapat manfaat dari garbage collection, tetapi garbage collection adalah alat yang berguna dan tidak lagi perlu ditakuti bahkan di kalangan programmer sistem.
Opini GN⁺
- RCU adalah teknik yang efektif untuk meningkatkan konkurensi sambil menjaga konsistensi data di lingkungan multithreading. Ini adalah elemen yang sangat penting dalam komputasi berkinerja tinggi maupun sistem real-time.
- Contoh RCU yang mematahkan anggapan umum tentang garbage collection memberi pengembang sudut pandang baru terhadap manajemen memori. Hal ini особенно berlaku dalam bidang pemrograman sistem, tempat manajemen memori sangat penting.
- Proyek lain yang menyediakan fungsi serupa dengan RCU antara lain Java ConcurrentLinkedQueue dan .NET ConcurrentBag, yang juga menyediakan struktur data lock-free.
- Saat mengadopsi teknologi RCU, kebutuhan sistem dan target performa harus dipertimbangkan, serta penting untuk memahami manfaat yang diperoleh dan potensi biaya penggunaannya.
- Artikel ini dapat membantu pengembang memahami manajemen memori dan konkurensi secara lebih mendalam, meninjau kembali asumsi yang ada, dan mengeksplorasi solusi baru.
1 komentar
Komentar Hacker News
Saran untuk melihat teknik garbage collection (GC) paralel yang inovatif untuk MPL dan MaPLe
Menggunakan RCU sebagai motivasi untuk garbage collection itu menarik
Kesalahpahaman umum tentang manajemen memori
Kasus penggunaan RCU meyakinkan, tetapi pengalaman dengan garbage collection dalam situasi lain kurang baik
free()mengembalikan memori ke OSSaat menggunakan garbage collection, alokasi baru dilakukan dari RAM, bukan cache
Garbage collection pelacakan yang baik sudah lama melampaui manajemen memori manual dalam hal throughput
Salah satu hal yang cocok dengan garbage collection adalah async/await
Agak mengejutkan beralih dari motivasi tentang RCU ke pembahasan tentang garbage collection umum
Saat mengembangkan perangkat lunak, ada dua kasus yang dipertimbangkan
Peralihan dari RCU ke garbage collection pelacakan umum tampak seperti strategi yang licik
Sulit bagi programmer sistem untuk mengidentifikasi kapan sesuatu bisa digarbage-collect
Alat manajemen lifetime di Rust dan C++ membantu mengotomatiskan pembebasan memori, tetapi tidak menyederhanakan kompleksitasnya