Sebuah runtime concurrent dapat menjalankan ribuan operasi fast path untuk setiap transisi state langka yang membutuhkan koordinasi global. Menempatkan full memory barrier pada setiap fast path membuat seluruh operasi membayar biaya transisi yang jarang terjadi itu. Linux membarrier() mendukung susunan sebaliknya: thread koordinator masuk ke kernel dan memaksakan titik ordering yang terdefinisi pada sekumpulan thread target, sehingga biaya yang lebih besar berpindah ke sisi protokol yang jarang dijalankan.

Mekanisme ini bukan pengganti umum untuk atomic, mutex, atau memory model bahasa pemrograman. Ini adalah antarmuka kernel Linux dengan jaminan yang berlaku pada akses memory dan thread target berdasarkan command tertentu. Penggunaan yang benar memerlukan protokol yang sudah menentukan akses mana yang terjadi sebelum dan sesudah titik koordinasi.

Barrier dimulai oleh satu thread dan diselesaikan lintas thread lain

CPU fence lokal mengurutkan akses yang dilakukan thread yang mengeksekusi fence tersebut. membarrier() memiliki bentuk berbeda. Pemanggil meminta barrier pada sekumpulan thread, dan return yang sukses menetapkan bahwa thread target telah melewati state dengan jaminan ordering yang ditentukan command terpilih.

Untuk MEMBARRIER_CMD_PRIVATE_EXPEDITED, targetnya adalah thread sibling yang sedang berjalan dalam proses milik pemanggil. Sibling yang tidak sedang berjalan diperlakukan sudah berada pada state yang sesuai bagi jaminan tersebut. Pemanggil karena itu tidak perlu membuat setiap peer mengeksekusi callback tingkat aplikasi atau melakukan polling pada flag bersama hanya untuk mencapai titik barrier milik kernel.

Perbedaan ini berguna pada skema sinkronisasi asimetris. Runtime yang didominasi operasi baca dapat mempertahankan fast path kecil sementara writer, collector, atau koordinator reclamation yang jarang aktif membayar biaya sinkronisasi lintas thread.

Mode private expedited memerlukan registration

Command private expedited tidak tersedia untuk digunakan hanya karena kernel melaporkan bit command tersebut. Proses lebih dulu mendaftarkan intensinya melalui MEMBARRIER_CMD_REGISTER_PRIVATE_EXPEDITED. Pemanggilan MEMBARRIER_CMD_PRIVATE_EXPEDITED berikutnya tanpa registration yang diwajibkan gagal dengan EPERM.

Registration merupakan state proses, sehingga kode inisialisasi dapat memeriksa dukungan, melakukan registration sekali, lalu mengekspos capability itu ke lapisan runtime yang memerlukannya. MEMBARRIER_CMD_QUERY mengembalikan bit mask command yang didukung. Software perlu menguji bit command dan registration spesifik yang menjadi dependensinya, bukan menganggap keberadaan system call sebagai bukti bahwa seluruh mode tersedia.

Arsitektur juga berpengaruh. Beberapa command memiliki ketersediaan yang bergantung pada arsitektur. Runtime dengan jalur sinkronisasi fallback dapat memilih jalur tersebut saat command yang diperlukan tidak tersedia, alih-alih mengubah capability kernel menjadi asumsi deployment tanpa syarat.

Compiler ordering tetap menjadi bagian protokol user space

Kernel tidak dapat memperbaiki transformasi compiler yang melanggar asumsi pada source code user space. Kontrak membarrier() dijelaskan dalam akses memory berurutan menurut program order pada thread target, tetapi operasi tingkat source tetap melewati compiler dan, pada banyak bahasa, memory model formal.

Compiler barrier dapat mencegah compiler reordering tertentu tanpa menghasilkan hardware fence. Hardware memory barrier membatasi ordering yang terlihat CPU. membarrier() mengoordinasikan ordering lintas thread target melalui kernel. Ketiganya merupakan lapisan yang berkaitan, bukan tiga ejaan untuk operasi yang sama.

Kode di sekitar protokol membarrier() karena itu memerlukan constraint yang terlihat compiler dan sesuai dengan bahasa serta implementasinya. Dalam C atau C++, data race pada objek non-atomic tetap tunduk pada aturan bahasa; system call Linux tidak membuat akses concurrent yang undefined menjadi valid. Implementasi runtime yang bekerja di bawah abstraksi portable biasa perlu mendokumentasikan asumsi tingkat bahasa sekaligus jaminan tingkat kernel yang dipakainya.

Expedited memindahkan latency, bukan menghapus pekerjaan sinkronisasi

Command expedited dirancang agar selesai tanpa blocking, tetapi menimbulkan overhead tambahan pada sistem untuk menyediakan properti tersebut. Memanggilnya pada setiap operasi akan menghilangkan asimetri yang membuat antarmuka ini menarik.

Desain tipikal memiliki jalur yang sangat sering berjalan dengan sinkronisasi biasa atau relatif murah, serta jalur langka yang mengubah global state. Jalur langka memublikasikan state dengan ordering yang diperlukan, memanggil membarrier(), lalu melakukan aksi yang keamanannya bergantung pada peer yang telah melewati titik barrier.

Memory reclamation menggambarkan bentuk tersebut tanpa menetapkan satu implementasi. Koordinator dapat memerlukan kepastian bahwa peer thread sudah melintasi sebuah titik setelah publikasi sebelumnya sebelum mereklamasi state yang dapat direferensikan reader lama. membarrier() dapat menyediakan satu komponen ordering, tetapi lifetime objek tetap bergantung pada algoritma reclamation di sekelilingnya. Pemanggilan ini sendiri tidak membuktikan bahwa tidak ada thread yang masih menyimpan pointer.

Command global dan private memiliki batas interferensi berbeda

MEMBARRIER_CMD_GLOBAL menargetkan thread lintas proses pada sistem, sedangkan private expedited membatasi target relevan pada proses milik pemanggil. Perbedaan scope ini bersifat arsitektural: library yang hanya mengoordinasikan thread miliknya sendiri biasanya tidak memiliki kebutuhan semantik untuk memaksakan barrier ke seluruh sistem.

Operasi global expedited memiliki model registration bagi proses yang berniat menerima barrier tersebut. Jaminannya berlaku pada participant terdaftar sesuai kontrak antarmuka. Registration dengan demikian merupakan bagian dari kontrak koordinasi, bukan sekadar performance hint yang dapat diabaikan.

Memilih command dengan scope tersempit yang sesuai batas ownership mengurangi coupling yang tidak disengaja. Garbage collector, JIT runtime, atau subsistem reclamation lokal proses biasanya bernalar tentang thread yang berbagi satu address space. Protokol shared memory lintas proses memiliki model participant berbeda dan memerlukan definisi eksplisit mengenai proses mana yang tercakup.

Mode sync-core menambahkan jaminan instruction stream

MEMBARRIER_CMD_PRIVATE_EXPEDITED_SYNC_CORE memperluas perilaku memory ordering private expedited dengan memastikan thread sibling yang sedang berjalan mengeksekusi core-serializing instruction sebelum pemanggil kembali. Mode ini juga memerlukan command registration tersendiri.

Properti tambahan tersebut relevan bagi mekanisme yang memodifikasi executable code dan membutuhkan instruction execution melintasi titik serialisasi. Properti itu tidak boleh diasumsikan berasal dari private expedited biasa. Memory ordering untuk data dan sinkronisasi instruction execution adalah jaminan berbeda walaupun keduanya diekspos melalui keluarga system call yang sama.

Dukungan mode sync-core bergantung pada arsitektur. Sistem code generation karena itu tetap memerlukan penalaran spesifik arsitektur mengenai instruction cache dan aturan modifikasi kode; command ini adalah primitive kernel di dalam penalaran tersebut, bukan kontrak JIT portable dengan sendirinya.

Pemanggilan sukses tidak menciptakan critical section

membarrier() tidak menghentikan peer thread lalu menahannya dalam kondisi berhenti. Peer melanjutkan eksekusi setelah melewati titik terkait. Shared state dapat berubah lagi seketika, sehingga pemanggil tidak dapat memperlakukan return sukses sebagai ownership atas seluruh memory proses.

Mekanisme ini juga tidak mengidentifikasi objek mana yang dilindungi sebuah protokol. Kernel mengurutkan aktivitas memory sesuai semantik command, sedangkan identitas objek, epoch, generation, hazard state, atau publication flag tetap merupakan konsep user space. Jika peer dapat memperoleh kembali objek lama setelah barrier karena protokol mengizinkannya, barrier tidak dapat membuat reclamation menjadi aman.

Batas ini memisahkan mekanisme sinkronisasi dari bukti sinkronisasi. System call dapat menetapkan event ordering lintas thread yang mahal. Aplikasi harus menghubungkan event tersebut dengan transisi state yang membuat invariant yang dituju benar.

Abstraksi yang tepat adalah primitive koordinasi asimetris

membarrier() paling presisi diperlakukan sebagai primitive bagi protokol yang memiliki satu sisi sangat sering dan sisi koordinasi yang jauh lebih jarang. Nilainya berasal dari pemindahan pekerjaan sinkronisasi, bukan penghapusannya.

Integrasi yang kuat mencatat command yang tepat, persyaratan registration, scope target, constraint compiler, dan transisi state yang dilindungi pemanggilan tersebut. Dengan batas itu dibuat eksplisit, kernel dapat membawa event ordering yang mahal sementara fast path tidak perlu membayar barrier pada setiap operasi.