Jenis kunci Linux: 1. mutex (mutex lock), digunakan untuk memastikan hanya satu thread boleh mengakses objek pada bila-bila masa; 2. rwlock (kunci baca-tulis), dibahagikan kepada kunci baca dan tulis kunci, yang sesuai untuk situasi di mana kekerapan membaca data adalah jauh lebih besar daripada kekerapan menulis data 3. kunci putaran (spin lock), hanya satu utas boleh mengakses objek pada bila-bila masa; Ia digunakan dalam situasi di mana membaca dan menulis boleh dibezakan, dan terdapat banyak operasi membaca dan sedikit operasi menulis Keutamaan operasi menulis adalah lebih besar daripada operasi membaca.
Persekitaran pengendalian tutorial ini: sistem linux7.3, komputer Dell G3.
Mutex: mutex
Mutex: mutex, digunakan untuk memastikan Pada bila-bila masa, hanya satu benang boleh mengakses objek. Apabila operasi pemerolehan kunci gagal, benang akan tidur dan terjaga apabila menunggu kunci dilepaskan.
Kunci baca-tulis: rwlock
Kunci baca-tulis: rwlock, yang dibahagikan kepada kunci baca dan kunci tulis. Apabila dalam operasi baca, berbilang benang boleh dibenarkan untuk mendapatkan operasi baca pada masa yang sama. Tetapi hanya satu utas boleh mendapatkan kunci tulis pada masa yang sama. Benang lain yang gagal memperoleh kunci tulis akan tertidur sehingga ia terjaga apabila kunci tulis dilepaskan.
Nota: Kunci tulis akan menyekat kunci baca dan tulis yang lain. Apabila benang memperoleh kunci tulis dan sedang menulis, kunci baca tidak boleh diperolehi oleh utas lain;
Kunci putaran: kunci putaran
Kunci putaran: kunci putaran, hanya satu utas boleh mengakses objek pada bila-bila masa. Tetapi apabila operasi pemerolehan kunci gagal, ia tidak akan tidur, tetapi akan berputar di tempatnya sehingga kunci dilepaskan. Ini menjimatkan penggunaan benang daripada keadaan tidur hingga bangun, yang akan meningkatkan kecekapan dalam persekitaran dengan masa penguncian yang singkat. Tetapi jika masa mengunci terlalu lama, ia akan membazirkan banyak sumber CPU.
RCU
RCU: Baca-salin-kemas kini Apabila mengubah suai data, anda perlu membaca data dahulu, kemudian menjana salinan dan mengubah suai salinan. Selepas pengubahsuaian selesai, kemas kini data lama kepada data baharu.
Apabila menggunakan RCU, pembaca hampir tidak memerlukan penyegerakan overhed mereka tidak perlu mendapatkan kunci atau menggunakan arahan atom, yang tidak akan menyebabkan persaingan kunci, jadi tidak perlu mempertimbangkan isu kebuntuan. Overhed penyegerakan untuk penulis adalah agak besar. Mereka perlu menyalin data yang diubah suai dan mesti menggunakan mekanisme kunci untuk menyegerakkan dan menyelaraskan operasi pengubahsuaian penulis lain. Ia sangat cekap apabila terdapat sejumlah besar operasi baca dan sebilangan kecil operasi tulis.
Semaphore: semaphore
Semaphore kernel Linux adalah sama dari segi konsep dan prinsip dengan semaphore mekanisme IPC SystemV pengguna, tetapi Ia boleh tidak pernah digunakan di luar kernel, jadi ia tiada kaitan dengan semafor mekanisme IPC SystemV.
Apabila mencipta semaphore, anda perlu menetapkan nilai awal, yang bermaksud bahawa beberapa tugasan boleh mengakses sumber kongsi yang dilindungi oleh semaphore pada masa yang sama Jika nilai awal ialah 1, ia menjadi mutex (. Mutex), iaitu, pada masa yang sama Hanya satu tugasan boleh mengakses sumber kongsi yang dilindungi oleh semaphore. Jika tugasan ingin mengakses sumber yang dikongsi, ia mesti mendapatkan semafor dahulu Operasi mendapatkan semafor akan mengurangkan nilai semafor sebanyak 1. Jika nilai semasa semafor ialah nombor negatif, ia menunjukkan bahawa semafor. tidak boleh diperolehi dan tugasan mesti digantung di sana Barisan menunggu semaphore menunggu semaphore tersedia; dilindungi oleh semaphore boleh diakses dengan segera. Selepas tugas selesai mengakses sumber kongsi yang dilindungi oleh semaphore, ia mesti melepaskan semaphore Pembebasan semaphore dicapai dengan menambah 1 pada nilai semaphore Jika nilai semaphore adalah nombor bukan positif menunjukkan bahawa terdapat tugas menunggu semaphore semasa, jadi Ia juga membangunkan semua tugasan menunggu pada semaphore.
rw_semaphore (baca dan tulis semaphore)
Baca dan tulis semaphore membahagikan pelawat, sama ada pembaca atau penulis Pembaca hanya boleh membaca dan mengakses sumber yang dikongsi dilindungi oleh membaca dan menulis semafor dalam tempoh mengekalkan membaca dan menulis semaphore tugas juga mungkin perlu menulis, jadi ia mesti diklasifikasikan sebagai penulis sebelum mengakses sumber yang dikongsi Penulis boleh menurunkan taraf kepada pembaca jika mereka mendapati bahawa mereka tidak memerlukan akses tulis. Tiada had kepada bilangan pembaca yang boleh dimiliki oleh semafor baca-tulis pada masa yang sama, yang bermaksud bahawa mana-mana bilangan pembaca boleh memiliki semaphore baca-tulis pada masa yang sama. Jika semafor baca-tulis tidak dimiliki oleh seorang penulis pada masa ini dan tiada penulis sedang menunggu pembaca untuk mengeluarkan semaphore, maka mana-mana pembaca boleh berjaya memperoleh semafor baca-tulis jika tidak, pembaca mesti digantung sehingga penulis mengeluarkannya; semafor. Jika semafor baca-tulis tidak dimiliki oleh pembaca atau penulis pada masa ini dan tiada penulis menunggu semafor, maka penulis boleh berjaya memperoleh semafor baca-tulis, jika tidak, penulis akan digantung kerja sehingga tiada lagi pengunjung. . Oleh itu, penulis adalah eksklusif dan eksklusif.
Terdapat dua pelaksanaan semafor baca dan tulis Satu bersifat universal dan tidak bergantung pada seni bina perkakasan Oleh itu, menambah seni bina baharu tidak memerlukan pelaksanaan semula mendapatkan dan mengeluarkan semaphore baca dan tulis Overhed adalah tinggi; yang lain adalah berkaitan dengan seni bina, jadi prestasinya tinggi dan overhed untuk memperoleh dan melepaskan semaphore baca dan tulis adalah kecil, tetapi menambah seni bina baharu memerlukan pelaksanaan semula. Semasa konfigurasi kernel, anda boleh menggunakan pilihan untuk mengawal pelaksanaan yang digunakan.
Baca dan tulis semaphore: rw_semaphore
Semafor membaca dan menulis pelawat, sama ada untuk pembaca atau penulis, semasa semaphore, sahaja sumber kongsi yang dilindungi oleh semaphore baca-tulis boleh dibaca dan diakses Jika tugasan perlu menulis sebagai tambahan kepada membaca, maka ia mesti diklasifikasikan sebagai penulis, dan ia mesti mengakses sumber yang dikongsi dahulu sebelum mengakses sumber yang dikongsi. Dapatkan status penulis dan penulis boleh menurunkan taraf kepada pembaca jika mereka mendapati mereka tidak lagi memerlukan akses menulis. Tiada had kepada bilangan pembaca yang boleh dimiliki oleh semafor baca-tulis pada masa yang sama, yang bermaksud bahawa mana-mana bilangan pembaca boleh memiliki semaphore baca-tulis pada masa yang sama. Jika semafor baca-tulis tidak dimiliki oleh seorang penulis pada masa ini dan tiada penulis sedang menunggu pembaca untuk mengeluarkan semaphore, maka mana-mana pembaca boleh berjaya memperoleh semafor baca-tulis jika tidak, pembaca mesti digantung sehingga penulis mengeluarkannya; semafor. Jika semafor baca-tulis tidak dimiliki oleh pembaca atau penulis pada masa ini dan tiada penulis menunggu semafor, maka penulis boleh berjaya memperoleh semafor baca-tulis, jika tidak, penulis akan digantung kerja sehingga tiada lagi pengunjung. . Oleh itu, penulis adalah eksklusif dan eksklusif.
Terdapat dua pelaksanaan semaphore baca dan tulis Satu bersifat universal dan tidak bergantung pada seni bina perkakasan Oleh itu, menambah seni bina baharu tidak memerlukan pelaksanaan semula, tetapi kelemahannya ialah prestasi rendah, pemerolehan. dan keluaran baca dan tulis Overhed semaphore adalah tinggi; yang satu lagi adalah berkaitan seni bina, jadi prestasinya tinggi, dan overhed untuk memperoleh dan mengeluarkan semaphore baca dan tulis adalah kecil, tetapi menambah seni bina baharu memerlukan pelaksanaan semula. Semasa konfigurasi kernel, anda boleh menggunakan pilihan untuk mengawal pelaksanaan yang digunakan.
seqlock**** (kunci berurutan)
digunakan dalam situasi di mana membaca dan menulis boleh dibezakan, dan terdapat banyak operasi membaca dan sedikit operasi menulis. mempunyai keutamaan berbanding operasi baca. Idea pelaksanaan seqlock adalah menggunakan integer yang semakin meningkat untuk mewakili jujukan. Apabila operasi tulis memasuki bahagian kritikal, urutannya ialah apabila keluar dari bahagian kritikal, urutannya adalah sekali lagi.
Operasi tulis juga perlu mendapatkan kunci (seperti mutex) Kunci ini hanya digunakan untuk pengecualian bersama tulis-tulis untuk memastikan terdapat paling banyak satu operasi tulis yang sedang berjalan pada masa yang sama. Apabila jujukan ialah nombor ganjil, ini bermakna operasi tulis sedang dijalankan Pada masa ini, operasi baca perlu menunggu sehingga jujukan menjadi nombor genap untuk memasuki bahagian kritikal. Apabila operasi baca memasuki bahagian kritikal, adalah perlu untuk merekodkan nilai jujukan semasa Apabila ia keluar dari bahagian kritikal, bandingkan jujukan yang direkodkan dengan jujukan semasa Jika ia tidak sama, ini bermakna operasi tulis berlaku manakala operasi baca memasuki bahagian kritikal Pada masa ini, operasi baca Operasi baca tidak sah dan perlu kembali dan cuba lagi.
Tulisan Seqlock mestilah saling eksklusif. Walau bagaimanapun, senario aplikasi seqlock itu sendiri adalah situasi di mana terdapat lebih banyak membaca dan kurang menulis, dan kebarangkalian konflik menulis adalah sangat rendah. Jadi pada asasnya tiada kehilangan prestasi dalam mutex tulis-tulis di sini. Operasi baca dan tulis tidak perlu saling eksklusif. Senario aplikasi seqlock ialah operasi tulis diutamakan daripada operasi baca Untuk operasi tulis, hampir tiada sekatan (melainkan peristiwa kebarangkalian kecil seperti konflik tulis-tulis berlaku), dan hanya tindakan urutan tambahan diperlukan. Operasi baca tidak perlu disekat, tetapi cuba semula diperlukan apabila konflik baca-tulis ditemui. Aplikasi biasa seqlock ialah kemas kini jam akan terdapat gangguan jam setiap 1 milisaat dalam sistem, dan pengendali gangguan yang sepadan akan mengemas kini jam (operasi tulis).
Atur cara pengguna boleh memanggil panggilan sistem seperti gettimeofday untuk mendapatkan masa semasa (operasi baca). Dalam kes ini, menggunakan seqlock boleh menghalang terlalu banyak panggilan sistem gettimeofday daripada menyekat pengendali gangguan (ini akan berlaku jika kunci baca-tulis digunakan dan bukannya seqlock). Pengendali gangguan sentiasa mengambil keutamaan, dan jika panggilan sistem gettimeofday bercanggah dengannya, tidak kira sama ada program pengguna menunggu.
1) Kunci baca-tulis membezakan antara pembaca dan penulis, manakala kunci mutex tidak membezakan
2) Kunci Mutex hanya boleh Satu utas dibenarkan untuk mengakses objek, tanpa mengira membaca atau menulis kunci baca-tulis hanya membenarkan satu penulis pada masa yang sama, tetapi membenarkan berbilang pembaca membaca objek pada masa yang sama.
Cadangan berkaitan: "Tutorial Video Linux"
Atas ialah kandungan terperinci Apakah jenis kunci linux yang ada?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!