Rumah  >  Artikel  >  Tutorial sistem  >  Sebagai jurutera pembangunan terbenam, anda perlu mengetahui tentang mekanisme penyegerakan kernel Linux.

Sebagai jurutera pembangunan terbenam, anda perlu mengetahui tentang mekanisme penyegerakan kernel Linux.

王林
王林ke hadapan
2024-02-12 14:50:071228semak imbas

作为嵌入式开发工程师,关于Linux kernel同步机制你不得不知道

Kata Pengantar

Penyegerakan ialah interaksi antara proses dan antara proses dan sumber sistem. Memandangkan kernel Linux menggunakan multitasking, mesti ada mekanisme penyegerakan antara pelbagai proses untuk memastikan penyelarasan.

Terdapat banyak mekanisme penyegerakan dalam kernel Linux. Hari ini kita akan menumpukan pada mekanisme tak segerak dan segerak dalam kernel, memfokuskan pada mekanisme tak segerak dalam kernel. Mekanisme asynchronous dalam kernel dibahagikan kepada dua jenis: satu ialah mekanisme penyegerakan lapisan aplikasi, iaitu, komunikasi antara benang lapisan aplikasi yang lain ialah mekanisme penyegerakan kernel.

Apabila benang memasuki keadaan kernel, ia boleh berkomunikasi secara langsung dengan kernel. Terdapat dua utas dalam kernel: satu adalah thread A. Selepas ia memasuki keadaan kernel, ia akan berkomunikasi secara langsung dengan kernel dan memberitahu apa yang perlu dilakukan Apabila ia selesai, ia akan memberitahu kernel. (Kami memanggil operasi ini separuh) Apabila benang memasuki keadaan kernel, ia akan berkomunikasi dengan kernel sekali, dan kemudian ia boleh dilaksanakan secara langsung.

Mekanisme penyegerakan dalam kernel pada dasarnya adalah mekanisme komunikasi antara benang, dan komunikasi antara mereka dicapai melalui mekanisme penyegerakan.

1. Komunikasi antara proses

Untuk memastikan ketepatan dan ketekalan sistem, kernel Linux akan menggunakan baris gilir menyekat untuk mengendalikan komunikasi antara proses semasa komunikasi antara proses. Baris gilir menyekat bermakna elemen dalam baris gilir mesej dibuat apabila mesej dihantar, tetapi tidak semua mesej akan dihantar Hanya apabila baris gilir menunggu untuk mesej tertentu penuh akan ia dihantar. Jika tiada mesej dalam barisan menunggu penerima, pemberitahuan akan diterima Jika terdapat mesej dalam barisan menunggu penerima, tiada pemberitahuan akan diterima.

Dalam kernel, baris gilir menyekat diabstrakkan, iaitu, apabila proses menghantar mesej, ia disekat. Oleh itu, menyekat baris gilir sebenarnya adalah mekanisme penyegerakan. Barisan gilir menyekat mencipta objek baharu melalui fungsi tertentu, yang mengandungi penunjuk baris gilir menunggu (Tolak/Pop). Apabila baris gilir menunggu penuh, sistem akan menggunakan objek yang ditunjuk oleh penunjuk baris gilir menunggu sebagai urutan proses pertama untuk mengeluarkan pemberitahuan. Iaitu, proses itu akan dimaklumkan sebelum ia boleh terus melaksanakan tugasnya.

2. Semaphore

Semaphore boleh digunakan untuk menghantar atau menerima mesej. Apabila proses memiliki semaphore, ini bermakna ia sudah memiliki semaphore sendiri, yang merupakan pembolehubah persendirian sendiri. Pembolehubah persendirian ini tidak boleh diperolehi oleh proses lain. Semaphore digunakan untuk mewakili bilangan semaphore yang dimiliki oleh proses Apabila proses ini memiliki semaphore, ia boleh menghantar mesej kepada proses lain. Pembolehubah persendirian ini hanya dibenarkan untuk digunakan oleh proses ini sendiri, dan tidak boleh dibawa ke proses proses lain.

Apabila benang mempunyai semafornya sendiri, ia boleh berkomunikasi dengan utas lain melalui pembolehubah yang dikongsi. Pembolehubah yang dikongsi juga digunakan dalam urutan lain, dan utas lain menggunakan pembolehubah yang dikongsi untuk berkomunikasi dengan diri mereka sendiri.

3. Mutex

Mutex terutamanya untuk sumber sistem. Mutex dalam kernel Linux boleh dibahagikan kepada dua jenis: sumber kongsi dan sumber mutex global.

Sumber dikongsi dikongsi antara proses Contohnya, jika proses mempunyai berbilang utas, setiap utas boleh mengakses ruang memori kongsi ini. Sumber global yang saling eksklusif bermakna bahawa proses dan utas hanya boleh mengakses ruang memori global di mana ia berada. Dalam sistem, mutex boleh digunakan untuk membenarkan berbilang proses untuk dilaksanakan dalam ingatan pada masa yang sama. Tetapi jika anda ingin melaksanakan berbilang proses yang dilaksanakan pada masa yang sama, anda perlu menggunakan mekanisme penyegerakan untuk memastikan semua proses boleh berjalan dalam memori yang sama. Menggunakan mutex, proses hanya boleh mengakses ruang memori global di mana ia berada, tetapi tidak boleh mengakses ruang memori lain. Tetapi mutex mempunyai kelebihan yang besar, iaitu, tidak akan ada penyekatan proses.

4. Barisan Mesej

Kemunculan baris gilir mesej telah meluaskan komunikasi antara proses. Dalam kernel, sebagai tambahan kepada mekanisme penyegerakan, terdapat satu lagi mekanisme tak segerak, iaitu baris gilir mesej. Kita semua tahu bahawa kernel Linux menyokong baris gilir mesej. Walaupun terdapat maklumat terperinci tentang baris gilir mesej dalam kernel, memandangkan kernel tidak menyokong baris gilir mesej mod pengguna, kita masih perlu bermula dengan lapisan aplikasi untuk memahami baris gilir mesej.

Pertama sekali, mari kita fahami apakah itu baris gilir mesej?

Baris gilir mesej ialah baris gilir khas yang boleh memenuhi keperluan penyegerakan antara berbilang rangkaian aplikasi. Baris gilir mesej digunakan untuk menyediakan komunikasi tak segerak antara aplikasi dan proses atau utas lain. Jika kita perlu berkomunikasi secara tidak segerak, kita boleh melakukannya menggunakan baris gilir mesej. Sebagai contoh, apabila kita memanggil fungsi clear(), kita boleh terus menggunakan baris gilir mesej berdaftar.

Jadi bagaimana untuk membuat baris gilir mesej? Apabila kita menggunakan ext2.json, kita boleh mencipta baris gilir mesej menggunakan arahan semaphore dalam JAR.json.clear().

5. Memori bersama

Dalam memori kongsi, kami menggunakan kunci kongsi, tetapi kerana kunci kongsi berkongsi memori dengan proses tertentu, apabila anda ingin memperoleh kunci kongsi, anda perlu memintanya daripada proses lain.

Seperti contoh di atas, kami mengakses memori yang dikongsi melalui kata kunci yang tidak menentu. Pada masa ini, anda tidak meminta daripada proses lain, jadi apabila anda ingin memperoleh kunci kongsi ini, anda hanya perlu meminta daripada proses lain. Ini mengelakkan persaingan antara kedua-dua proses dan mencapai penyegerakan data.

Memandangkan kunci kongsi berkongsi memori dengan proses, anda mesti meminta proses itu untuk mengakses alamatnya. Penyelesaian paling mudah untuk situasi ini ialah menggunakan kolam benang.

Terdapat objek yang dipanggil "bait" dalam kumpulan benang, yang juga merupakan kunci kongsi. Apabila anda ingin memperoleh kunci ini, anda hanya perlu menghantar permintaan kepada objek bait. Pada masa ini, objek bait akan menghantar permintaan anda ke baris gilir utas Apabila utas menerima permintaan, ia akan mengembalikan mesej respons kepada anda.

6. Kolam benang

Kumpulan benang ialah alat pengurusan benang yang sangat baik Ia membenarkan berbilang benang berjalan pada masa yang sama dan juga boleh mengurangkan kebuntuan dan konflik antara benang. Salah satu ciri yang paling penting ialah ia boleh menggunakan memori sistem dengan berkesan untuk meningkatkan kecekapan.

Penggunaan kumpulan benang adalah sangat mudah, hanya peruntukkan tugasan untuk dilaksanakan kepada kumpulan benang yang sepadan. Apabila tugasan yang akan dilaksanakan diberikan kepada kumpulan benang yang sepadan, ia boleh dilaksanakan. Menggunakan kolam benang akan membawa kita banyak faedah:

  1. Tugasan dapat diselesaikan dengan lebih cepat. Apabila tugasan diberikan kepada kumpulan benang, ia akan dilaksanakan dalam gelung sehingga pelaksanaan selesai atau benang dibuat semula.
  2. Meningkatkan kecekapan penggunaan sumber. Apabila tugas memerlukan banyak sumber, seperti CPU, memori, dsb., kita boleh menggunakan kumpulan benang untuk mengurus sumber ini supaya setiap utas mempunyai CPU dan memori yang mencukupi untuk melaksanakan tugas.

7. Mekanisme penyegerakan keadaan kernel

Dua mekanisme penyegerakan diperkenalkan di atas, jadi mari kita lihat mekanisme penyegerakan dalam keadaan kernel Terdapat empat kaedah penyegerakan dalam keadaan kernel:

  1. Semaphore: Ia digunakan untuk mengendalikan kunci Apabila benang menduduki kunci, ia akan menghantar semaphore ke sistem.
  2. Pemindahan semaphore: Mekanisme ini disediakan oleh sistem pengendalian Selepas memanggil fungsi sys_thread, ia akan memasuki keadaan gangguan Pada masa ini, apabila fungsi sys_thread dipanggil, semaphore akan dihantar ke sistem.
  3. Kunci Mutex: Kaedah ini terutamanya mengawal akses kepada sumber melalui keutamaan.
  4. Mutexes dan semaphore digunakan untuk menyelesaikan masalah penyegerakan antara proses.
  5. Cara lain untuk menyegerakkan ialah melalui kumpulan benang. Dalam proses ini, kumpulan utas akan mencipta utas untuk berinteraksi dengan utas lain melalui utas ini untuk mencapai kesan penyegerakan.

8 Melalui analisis di atas, kami memahami bahawa penyegerakan adalah isu yang kompleks. Bagaimanakah penyegerakan diselesaikan dalam keadaan kernel?

Pertama sekali, terdapat tiga proses dalam keadaan kernel: ketiga-tiga proses ini boleh mengakses sumber satu sama lain, dan juga boleh menyegerakkan apabila sumber diminta oleh proses lain.

Apabila proses disekat, semua proses anak akan mengeluarkan proses anak (atau proses anak lain) daripada baris gilir menunggu dan menambahkannya pada baris gilir menyekat. Apabila semua proses anak disekat, tiada proses anak dalam baris gilir menyekat. Pada masa ini, proses anak lain dalam baris gilir menunggu akan menambah utas semasa pada baris gilir menunggu. Ketiga-tiga proses ini tidak akan menjejaskan satu sama lain semasa proses menunggu Ketiga-tiga utas boleh menyegerakkan dengan utas lain dengan menetapkan keutamaan mereka sendiri.

Atas ialah kandungan terperinci Sebagai jurutera pembangunan terbenam, anda perlu mengetahui tentang mekanisme penyegerakan kernel Linux.. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:lxlinux.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam