Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Proses penyegerakan dalam C/C++

Proses penyegerakan dalam C/C++

王林
王林ke hadapan
2023-09-16 11:09:071568semak imbas

Penyegerakan proses ialah teknologi yang menyelesaikan masalah akses serentak kepada data yang dikongsi, yang mungkin membawa kepada ketidakkonsistenan data. Proses kolaborasi merujuk kepada proses yang boleh menjejaskan proses lain atau terjejas oleh proses lain, mengakibatkan data proses tidak konsisten Oleh itu, penyegerakan proses diperlukan untuk memastikan ketekalan data.

Masalah bahagian kritikal

Setiap proses mempunyai bahagian kod terpelihara yang dipanggil bahagian kritikal. Dalam bahagian ini, proses boleh menukar pembolehubah awam, mengemas kini jadual, menulis ke fail, dsb. Perkara utama yang perlu diperhatikan tentang bahagian kritikal ialah semasa satu proses dilaksanakan dalam bahagian kritikalnya, proses lain tidak boleh dilaksanakan dalam bahagian kritikalnya. Setiap proses mesti meminta kebenaran sebelum memasuki bahagian kritikalnya, bahagian kod yang melaksanakan permintaan ini ialah bahagian entri, penghujung kod ialah bahagian keluar, dan kod yang tinggal ialah bahagian yang tinggal.

Diberikan di bawah adalah struktur keratan kritikal bagi proses tertentu P1

Proses penyegerakan dalam C/C++

mempunyai tiga keperluan berikut: Bahagian kritikal mesti dipenuhi

  • secara Eksklusif jika proses secara eksklusif
  • bahawa P1 berada dalam anggapan bahawa P2 tidak boleh melaksanakan dalam bahagian kritikalnya dan bukannya sebarang proses lain yang dilaksanakan dalam bahagian kritikal.
  • Progress
  • - Jika tiada proses yang dilaksanakan dalam bahagian kritikalnya, dan terdapat proses yang ingin memasuki bahagian kritikal bahagian kritikal mereka, maka hanya proses yang tidak dilaksanakan di bahagian yang selebihnya boleh meminta untuk memasuki bahagian kritikal bahagian, dan pilihan boleh ditangguhkan selama-lamanya.
  • Penantian Terbatas
  • - Dalam penantian terhad, terdapat had kepada bilangan kali proses boleh memasuki bahagian kritikalnya selepas ia mengeluarkan permintaan untuk memasuki bahagian kritikalnya dan sebelum permintaan itu diberikan.

Terdapat dua kaedah yang biasa digunakan dalam sistem pengendalian untuk menangani bahagian kritikal.

Inti boleh didahulukan

- Kernel boleh didahulukan membenarkan proses didahulukan semasa proses didahulukan. Berjalan dalam mod kernel.

Non-preemptive kernel

- Kernel bukan preemptive tidak membenarkan proses yang berjalan dalam mod kernel dipreempted.

Penyelesaian Peterson

Penyelesaian Peterson ialah penyelesaian perisian berasaskan klasik kepada masalah bahagian kritikal. Ia terhad kepada dua proses yang silih berganti antara bahagian kritikal dan bakinya. Bahagian Peterson memerlukan perkongsian dua item data antara dua proses, iaitu
  • Intturn
  • Boolean flag[2]

Di sini, giliran pembolehubah menunjukkan giliran siapa yang masuk ke bahagian kritikal, dan tatasusunan bendera menunjukkan; sama ada proses Bersedia untuk memasuki zon kritikal.

Jika pusing == i, ia bermakna proses Pi dibenarkan memasuki bahagian kritikalnya.

Jika flag[j] adalah BENAR, ini bermakna proses j sedia untuk memasuki bahagian kritikalnya

Berikut ialah struktur proses P dalam penyelesaian Peterson

Proses penyegerakan dalam C/C++

Penyelesaian Peterson mengekalkan ketiga-tiga syarat -

  • Saling eksklusif
  • − Hanya satu proses boleh mengakses bahagian kritikal pada satu masa.
  • Progress
  • − Proses di luar bahagian kritikal tidak akan menghalang proses lain daripada memasuki bahagian kritikal. Penantian Terbatas - Setiap proses mempunyai peluang untuk memasuki bahagian kritikalnya tanpa menunggu selama-lamanya.

Perkakasan penyegerakan

telah dilaksanakan menggunakan dua jenis arahan -
  • Uji dan Set()
  • swap()

Ujian dan Set () adalah penyelesaian perkakasan kepada masalah penyegerakan. Antaranya, terdapat pembolehubah yang dikongsi bersama oleh pelbagai proses yang dipanggil Kunci, yang boleh mempunyai nilai 0 dan 1, di mana 1 bermakna memperoleh kunci dan 0 bermakna melepaskan kunci.

Setiap kali proses cuba memasuki bahagian kritikal, mereka perlu menanyakan nilai kunci. Jika nilai kunci ialah 1, maka mereka mesti menunggu sehingga nilai kunci tidak berubah kepada 0.

Diberikan di bawah ialah pelaksanaan TestAndSet() yang saling eksklusif

Proses penyegerakan dalam C/C++

Semaphore

Semaphore ialah alat penyegerakan yang digunakan untuk mengatasi masalah yang disebabkan oleh arahan TestAndSet() dan Swap(). Semaphore S ialah pembolehubah integer yang boleh diakses melalui dua operasi atom standard wait() dan signal()

wait() fungsi:

wait(S) {
   While S <= 0
   ; // no operation
   S--;
}
Signal() fungsi fungsi:

signal(S) {
   S++;
}

Apabila a proses mengubah suai nilai semaphore, proses lain tidak boleh beroperasi pada nilai semaphore yang sama pada masa yang sama.

Diberikan di bawah adalah pelaksanaan pengecualian bersama menggunakan semaphore

Proses penyegerakan dalam C/C++

Sistem pengendalian menggunakan dua jenis semaphore, ia adalah:

berbeza-bezaMengira semaphore tak bernilai -

Tipe semaphore tak terbatas ini

Binary Semaphore

- Nilai semaphore jenis ini boleh berbeza antara 0 dan 1. Mereka juga dipanggil kunci mutex. Ia digunakan oleh sistem pengendalian untuk menyelesaikan masalah bahagian kritikal dalam pelbagai proses. 🎜

Atas ialah kandungan terperinci Proses penyegerakan dalam C/C++. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:tutorialspoint.com. Jika ada pelanggaran, sila hubungi admin@php.cn Padam
Artikel sebelumnya:Permainan padanan nombor?Artikel seterusnya:Permainan padanan nombor?