GNU/Linux >> Belajar Linux >  >> Linux

Apa itu spinlock di Linux?

Kunci putar adalah cara untuk melindungi sumber daya bersama agar tidak dimodifikasi oleh dua atau lebih proses secara bersamaan. Proses pertama yang mencoba memodifikasi sumber daya "memperoleh" kunci dan melanjutkan perjalanannya, melakukan apa yang diperlukan dengan sumber daya. Proses lain apa pun yang kemudian mencoba mendapatkan kunci akan dihentikan; mereka dikatakan "berputar di tempat" menunggu kunci dilepaskan oleh proses pertama, demikian namanya kunci putar.

Kernel Linux menggunakan spin lock untuk banyak hal, seperti saat mengirim data ke periferal tertentu. Sebagian besar periferal perangkat keras tidak dirancang untuk menangani beberapa pembaruan status secara bersamaan. Jika dua modifikasi berbeda harus dilakukan, yang satu harus mengikuti yang lain dengan ketat, keduanya tidak boleh tumpang tindih. Spin lock memberikan perlindungan yang diperlukan, memastikan bahwa modifikasi terjadi satu per satu.

Kunci putar adalah masalah karena memutar memblokir inti CPU utas itu dari melakukan pekerjaan lain. Meskipun kernel Linux menyediakan layanan multitugas untuk program ruang pengguna yang berjalan di bawahnya, fasilitas multitugas tujuan umum tersebut tidak mencakup kode kernel.

Situasi ini sedang berubah, dan telah terjadi pada sebagian besar keberadaan Linux. Hingga Linux 2.0, kernel hampir murni merupakan program tugas tunggal:setiap kali CPU menjalankan kode kernel, hanya satu inti CPU yang digunakan, karena ada kunci putar tunggal yang melindungi semua sumber daya bersama, yang disebut Kunci Kernel Besar (BKL). ). Dimulai dengan Linux 2.2, BKL perlahan-lahan dipecah menjadi banyak kunci independen yang masing-masing melindungi kelas sumber daya yang lebih terfokus. Saat ini, dengan kernel 2.6, BKL masih ada, tetapi hanya digunakan oleh kode lama yang tidak dapat dengan mudah dipindahkan ke kunci yang lebih terperinci. Sekarang sangat mungkin bagi kotak multicore untuk membuat setiap CPU menjalankan kode kernel yang berguna.

Ada batasan utilitas memecah BKL karena kernel Linux tidak memiliki multitasking umum. Jika inti CPU diblokir berputar pada kunci putaran kernel, itu tidak dapat ditugaskan kembali, untuk melakukan sesuatu yang lain sampai kunci dilepaskan. Itu hanya duduk dan berputar sampai kunci dilepaskan.

Kunci putar dapat secara efektif mengubah kotak monster 16-inti menjadi kotak inti tunggal, jika beban kerjanya sedemikian rupa sehingga setiap inti selalu menunggu kunci putaran tunggal. Ini adalah batas utama untuk skalabilitas kernel Linux:menggandakan inti CPU dari 2 menjadi 4 mungkin akan hampir menggandakan kecepatan kotak Linux, tetapi menggandakannya dari 16 menjadi 32 mungkin tidak akan berhasil, dengan sebagian besar beban kerja.


Spin lock adalah ketika suatu proses terus-menerus memilih kunci yang akan dihapus. Dianggap buruk karena prosesnya memakan siklus (biasanya) sia-sia. Ini bukan khusus Linux, tetapi pola pemrograman umum. Dan meskipun secara umum dianggap sebagai praktik yang buruk, sebenarnya ini adalah solusi yang tepat; ada kasus di mana biaya penggunaan penjadwal lebih tinggi (dalam hal siklus CPU) daripada biaya beberapa siklus yang diperkirakan akan berlangsung selama spinlock.

Contoh spinlock:

#!/bin/sh
#wait for some program to clear a lock before doing stuff
while [ -f /var/run/example.lock ]; do
  sleep 1
done
#do stuff

Sering ada cara untuk menghindari spin lock. Untuk contoh khusus ini, ada alat Linux yang disebut inotifywait (biasanya tidak diinstal secara default). Jika ditulis dalam C, Anda cukup menggunakan API inotify yang disediakan Linux.

Contoh yang sama, menggunakan inotifywait menunjukkan bagaimana melakukan hal yang sama tanpa spin lock:

#/bin/sh
inotifywait -e delete_self /var/run/example.lock
#do stuff

Ketika sebuah utas mencoba untuk mendapatkan kunci, tiga hal dapat terjadi jika gagal - utas dapat mencoba dan memblokir, dapat mencoba dan melanjutkan, dapat mencoba kemudian tidur memberi tahu OS untuk membangunkannya ketika beberapa peristiwa terjadi.

Sekarang coba dan lanjutkan menggunakan lebih sedikit waktu daripada coba dan blokir. Katakanlah untuk saat ini bahwa "coba dan lanjutkan" akan memakan waktu satu unit dan "coba dan blokir" akan memakan waktu seratus.

Sekarang mari kita asumsikan bahwa rata-rata sebuah utas akan membutuhkan 4 unit waktu untuk menahan kunci. Sia-sia menunggu 100 unit. Jadi sebagai gantinya, Anda menulis satu putaran "coba dan lanjutkan". Pada upaya keempat, Anda biasanya akan mendapatkan kuncinya. Ini adalah spin lock. Disebut demikian karena utas terus berputar di tempatnya hingga mendapatkan kunci.

Tindakan keamanan tambahan adalah membatasi berapa kali loop berjalan. Jadi misalnya, Anda menjalankan for-loop, katakanlah, enam kali, jika gagal maka Anda "mencoba dan memblokir".

Jika Anda tahu bahwa utas akan selalu menahan kunci, katakanlah, 200 unit, maka Anda membuang-buang waktu komputer untuk setiap percobaan dan melanjutkan.

Sehingga pada akhirnya spin lock bisa menjadi sangat efisien atau boros. Sia-sia ketika waktu "biasa" untuk menahan kunci lebih tinggi daripada waktu yang dibutuhkan untuk "mencoba dan memblokir". Efisien bila waktu normal untuk menahan kunci jauh lebih rendah daripada waktu untuk 'mencoba dan memblokir".

Ps:Buku untuk dibaca di utas adalah "A Thread Primer", jika Anda masih dapat menemukannya.


Linux
  1. Linux vs. Unix:Apa bedanya?

  2. Apa itu Umask di Linux?

  3. Migrasi Unix ke Linux

  1. Apa nomor inode di Linux?

  2. Apa itu Red Hat Linux?

  3. Apa itu JingOS Linux?

  1. Apa yang baru dengan rdiff-backup?

  2. Apa itu pengguna Linux?

  3. Linux – Ubah Izin Folder?