Apa yang dimaksud dengan menggunakan pagar memori eksplisit?
sumber
Apa yang dimaksud dengan menggunakan pagar memori eksplisit?
Untuk peningkatan kinerja, CPU modern sering mengeksekusi instruksi agar dapat menggunakan silikon yang tersedia secara maksimal (termasuk membaca / menulis memori). Karena perangkat keras memberlakukan integritas instruksi, Anda tidak pernah memperhatikan ini dalam satu rangkaian eksekusi. Namun untuk beberapa utas atau lingkungan dengan memori volatil (memori yang dipetakan I / O misalnya) ini dapat menyebabkan perilaku yang tidak dapat diprediksi.
Pagar / penghalang memori adalah kelas instruksi yang berarti pembacaan / penulisan memori terjadi dalam urutan yang Anda harapkan. Misalnya 'pagar penuh' berarti semua baca / tulis sebelum pagar dipasang sebelum pagar setelahnya.
Perhatikan pagar memori adalah konsep perangkat keras. Dalam bahasa tingkat yang lebih tinggi kita terbiasa berurusan dengan mutex dan semaphore - ini mungkin diterapkan dengan menggunakan pagar memori pada tingkat rendah dan penggunaan batasan memori secara eksplisit tidak diperlukan. Penggunaan hambatan memori memerlukan studi yang cermat tentang arsitektur perangkat keras dan lebih sering ditemukan di driver perangkat daripada kode aplikasi.
Pengurutan ulang CPU berbeda dengan pengoptimalan kompiler - meskipun artefaknya bisa serupa. Anda perlu mengambil tindakan terpisah untuk menghentikan compiler menyusun ulang instruksi Anda jika hal itu dapat menyebabkan perilaku yang tidak diinginkan (misalnya penggunaan kata kunci volatile di C).
Menyalin jawaban saya ke pertanyaan lain, Apa saja trik yang dilakukan prosesor untuk mengoptimalkan kode? :
sumber
Alpha is known for being the weakest
, mengapaweakest
? Bukankah lebih baik, lebih dipesan ulang, sehingga eksekusi akan jauh lebih cepat? (Saya bukan pengguna alfa, tetapi menanyakan tentang efekvery reordering
vsrestricted reordering
). Jadi apa kerugian dari penataan ulang lot (kecuali risiko perilaku yang tidak ditentukan, tetapi saya kira, sebagian besar CPU modern seharusnya menyelesaikan pengubahan urutan yang baik dan hanya menerapkan penataan ulang yang ditentukan, jika tidak, itu tidak akan masuk akal dalam keputusan yang mereka buat).Dalam pengalaman saya, ini mengacu pada penghalang memori , yang merupakan instruksi (eksplisit atau implisit) untuk menyinkronkan akses memori antara beberapa utas.
Masalahnya terjadi pada kombinasi kompiler agresif modern (mereka memiliki kebebasan luar biasa untuk menyusun ulang instruksi, tetapi biasanya tidak tahu apa-apa tentang utas Anda) dan CPU multicore modern.
Pengenalan yang baik untuk masalah ini adalah "Deklarasi 'Penguncian dengan Cek Ganda Rusak' ". Bagi banyak orang, itu adalah peringatan bahwa ada naga.
Hambatan memori penuh implisit biasanya disertakan dalam rutinitas sinkronisasi utas platform, yang menutupi intinya. Namun, untuk pemrograman bebas-kunci dan menerapkan pola sinkronisasi ringan dan kustom, Anda seringkali hanya membutuhkan penghalang, atau bahkan penghalang satu arah saja.
sumber
Wikipedia tahu semua ...
sumber