GNU/Linux >> Belajar Linux >  >> Linux

Mengunci mekanisme untuk konsistensi memori bersama

Jadi, dengan melakukan beberapa penelitian, saya menemukan bahwa semafor Sistem V memiliki bendera yang disebut SEM_UNDO yang dapat mengembalikan status kunci saat program gagal, tetapi itu tidak dijamin berhasil.

SEM_UNDO akan membuka kunci semafor jika proses macet. Jika proses macet karena kerusakan pada memori bersama, tidak ada yang bisa dilakukan semaphore untuk Anda. OS tidak dapat mengurungkan status memori bersama.

Jika Anda harus dapat mengembalikan status memori bersama, maka Anda harus mengimplementasikan sesuatu sendiri. Saya telah melihat setidaknya dua model yang menangani hal itu.

Model pertama sebelum memodifikasi apa pun di memori bersama mengambil snapshot dari struktur, menyimpan dalam daftar di memori bersama. Jika ada proses lain yang bisa mendapatkan kunci dan daftarnya tidak kosong, itu akan membatalkan apa pun yang mungkin telah diubah oleh proses mogok.

Model kedua adalah membuat salinan dari struktur shm di memori lokal dan mengunci kunci untuk seluruh transaksi. Saat transaksi sedang dilakukan, sebelum melepaskan kunci, cukup salin struktur dari memori lokal ke memori bersama. Kemungkinan aplikasi mogok saat penyalinan lebih rendah dan intervensi oleh sinyal eksternal dapat diblokir dengan menggunakan sigprocmask() . (Mengunci kasing sebaiknya dipartisi dengan baik pada data. Misalnya, saya telah melihat pengujian dengan set 1000 kunci untuk catatan 10Mln di shm yang diakses oleh 4 proses bersamaan.)


Hanya ada beberapa hal yang dijamin akan dibersihkan saat program gagal. Satu-satunya hal yang terlintas di benak saya di sini adalah jumlah tautan. Deskriptor file terbuka meningkatkan jumlah tautan dari inode yang mendasarinya dan penutupan terkait menguranginya, termasuk penutupan paksa saat program gagal.

Jadi semua proses Anda dapat membuka file umum (tidak ingat apakah itu berfungsi untuk segmen memori bersama) dan Anda dapat memicu semacam alarm jika jumlahnya berkurang, padahal seharusnya tidak. Misalnya, alih-alih menunggu biasa, proses Anda dapat melakukan tunggu waktu (sebentar, misalnya) dalam satu putaran dan jajak pendapat untuk jumlah tautan agar diberi tahu ketika terjadi kesalahan.


Linux
  1. Linux – Masalah Izin Untuk Direktori Bersama Di Server?

  2. Daftar Permintaan Server Untuk Memori/cpu Dialokasikan?

  3. Setara dengan “yang mana” untuk Pustaka Bersama?

  1. 2 Skrip Perl Regresi Memori untuk Linux

  2. Rekomendasi Komunikasi Antar Proses

  3. Hapus memori bersama posix saat tidak digunakan?

  1. Menggunakan file untuk IPC untuk memori bersama

  2. Apakah saya menggunakan virtio untuk tamu KVM saya?

  3. Mengapa Memori Bersama Kernel adalah 0 di Ubuntu 12.04?