GNU/Linux >> Belajar Linux >  >> Linux

Mengapa spin lock pilihan yang baik di Linux Kernel Design daripada sesuatu yang lebih umum di kode userland, seperti semaphore atau mutex?

Seperti yang tersirat dari pertanyaan yang mengatakan bahwa spinlock adalah "pemborosan", spinlock hanya boleh dipegang sebentar.

Spinlock bukan satu-satunya cara untuk menyinkronkan banyak utas. Mutex/semafor juga digunakan di kernel Linux, seperti primitif sinkronisasi lainnya (mis. antrian tunggu, peristiwa).

Namun kernel harus berurusan dengan kasus-kasus yang tidak pernah dilihat oleh userspace, yang umum adalah penangan interupsi. Penangan interupsi tidak dapat dijadwal ulang di Linux, tetapi seringkali harus menggunakan beberapa primitif sinkronisasi (misalnya untuk menambahkan item kerja ke daftar tertaut yang akan diproses lebih lanjut oleh beberapa utas lainnya). Karena penangan interupsi tidak dapat tidur, mereka tidak dapat menggunakan mutex, antrian tunggu, dll. Itu cukup banyak menyisakan spinlock. Jika utas perlu menyinkronkan akses dengan penangan interupsi, utas juga harus menggunakan spinlock yang sama.

Spinlock belum tentu sia-sia. Mereka dioptimalkan untuk kasus non-perselisihan/non-tunggu dan dapat diambil dan dirilis dengan sangat cepat. Dalam hal ini mereka lebih cepat dan melibatkan lebih sedikit overhead daripada primitif sinkronisasi lainnya.


Pilihan antara spinlock dan konstruk lain yang menyebabkan pemanggil memblokir dan melepaskan kendali cpu sebagian besar diatur oleh waktu yang diperlukan untuk melakukan pengalihan konteks (simpan register/status di utas pengunci dan pulihkan register/status di utas lain). Waktu yang dibutuhkan dan juga biaya cache untuk melakukan ini bisa sangat signifikan.

Jika spinlock digunakan untuk melindungi akses ke register perangkat keras atau serupa di mana utas lain yang mengakses hanya akan memakan waktu beberapa milidetik atau kurang sebelum melepaskan kunci maka itu adalah penggunaan waktu cpu yang jauh lebih baik untuk berputar menunggu alih-alih beralih konteks dan melanjutkan.


Yang lain telah menjawab. Saya akan meringkas kasus di mana Anda akan menggunakan spinlock dan aturan untuk menggunakan spinlock.

1. Kapan spinlock digunakan ?

Jawab:Dalam situasi berikut.

  1. Utas yang menahan kunci tidak diizinkan untuk tidur.
  2. Utas yang menunggu kunci tidak tidur, tetapi berputar dalam putaran yang ketat.

Ketika digunakan dengan benar, spinlock dapat memberikan kinerja yang lebih tinggi daripada semaphore.Ex:Intrrrupt handler.

2. Apa aturan untuk menggunakan spinlocks?

Jawab:

Aturan - 1:Kode apa pun yang menahan spinlock, tidak dapat melepaskan prosesor untuk alasan apa pun kecuali untuk interupsi layanan (terkadang bahkan tidak). Jadi kode holding spinlock tidak bisa tidur.

Alasan:misalkan pengemudi Anda yang memegang spinlock tertidur. Contoh:memanggil fungsi copy_from_user() atau copy_to_user() , atau kernel preemption dimulai sehingga proses dengan prioritas lebih tinggi mendorong kode Anda ke samping. Secara efektif proses melepaskan spinlock penahan CPU.

Sekarang kita tidak tahu kapan kode akan membuka kuncinya. Jika beberapa utas lain mencoba mendapatkan kunci yang sama, itu akan berputar untuk waktu yang sangat lama. Dalam kasus terburuk itu akan mengakibatkan deedlock.

Kasus preemption kernel ditangani oleh kode spinlock itu sendiri. Setiap kali kode kernel menahan spinlock, preemption dinonaktifkan pada prosesor yang relevan. Bahkan sistem uniprosesor harus menonaktifkan preemption dengan cara ini.

Aturan - 2:Nonaktifkan interupsi pada CPU lokal, saat spinlock ditahan.

Alasan:Mendukung driver Anda mengambil spinlock yang mengontrol akses ke perangkat dan kemudian mengeluarkan interupsi. Ini menyebabkan penangan interupsi untuk dijalankan. Sekarang penangan interupsi juga memerlukan kunci untuk mengakses perangkat. Jika penangan interupsi berjalan pada prosesor yang sama, ia akan mulai berputar. Kode driver juga tidak bisa dijalankan untuk membuka kunci. JADI prosesor akan berputar selamanya.

Aturan - 3:Spinlock harus ditahan selama mungkin seminimal mungkin.

Alasan:Waktu penahanan kunci yang lama juga mencegah penjadwalan prosesor saat ini, yang berarti proses dengan prioritas lebih tinggi mungkin harus menunggu untuk mendapatkan CPU.

Jadi hal ini memengaruhi latensi kernel (waktu proses mungkin harus menunggu untuk dijadwalkan). Biasanya spinlock harus ditahan selama durasi waktu, kurang dari waktu yang diperlukan CPU untuk melakukan peralihan konteks di antara utas.

Aturan -4:jika Anda memiliki semafor dan spinlock, keduanya harus diambil. Kemudian ambil semaphore terlebih dahulu lalu spinlock.


Linux
  1. Linux – Mengapa Linux Menampilkan Memori Lebih Banyak Dan Lebih Sedikit Daripada Yang Saya Instal Secara Fisik?

  2. Apa Perbedaan Utama Antara Bsd Dan Gnu/linux Userland?

  3. Linux – Bagian Kernel yang Dimiliki Atau Tertutup?

  1. Linux – Apakah Kernel Linux/unix yang Berbeda Dapat Dipertukarkan?

  2. Apa itu Kode Keluar Bash di Linux

  3. Bagaimana cara membuat kode modul kernel Linux?

  1. Variabel global seluruh sistem/semaphore/mutex di C++/Linux?

  2. Apa itu spinlock di Linux?

  3. Mengapa sebagian besar program Linux ditulis dalam C?