(Tutorial disyorkan: Tutorial video PHP)
Bahagian kritikal yang dipanggil (juga dipanggil bahagian kritikal) ialah kod yang mengakses dan mengendalikan bahagian data yang dikongsi.
Proses pengecualian bersama: Dua atau lebih proses tidak boleh memasuki kawasan kritikal pada set pembolehubah kongsi yang sama pada masa yang sama, iaitu satu proses mengakses sumber kritikal dan proses lain mesti menunggu sebelum mengakses.
Penyegerakan proses: Ia terutamanya mengkaji cara menentukan tertib pelaksanaan antara beberapa proses dan mengelakkan isu persaingan data, iaitu, cara menjadikan berbilang proses berjalan dengan baik bersama
Apa yang dipanggil penyegerakan, Iaitu, proses/benang serentak mungkin perlu menunggu antara satu sama lain dan bertukar-tukar mesej di beberapa titik penting menunggu dan pertukaran maklumat yang saling terhad ini dipanggil penyegerakan proses/benang.
Untuk memberi contoh penyegerakan dalam hidup, anda lapar dan ingin makan anda meminta ibu anda memasak awal. Selepas mendengar ini, ibu anda mula memasak, tetapi sebelum ibu anda selesai memasak, anda mesti menghalang dan tunggu, selepas ibu selesai memasak, dia secara semula jadi akan memberitahu anda, dan kemudian anda boleh mula makan.
Perhatikan bahawa penyegerakan dan pengecualian bersama ialah dua konsep yang berbeza:
Penyegerakan adalah seperti: "Operasi A harus dilaksanakan sebelum operasi B", "Operasi C mesti dilaksanakan sebelum operasi A dan operasi B "Ia hanya boleh dilaksanakan selepas segala-galanya selesai" dan seterusnya;
Tujuan Semaphore: Digunakan terutamanya untuk kawalan capaian berbilang proses atau berbilang benang kepada objek sumber awam. Digunakan untuk menyelesaikan masalah berbilang proses (penyegerakan berbilang benang), serupa dengan kunci, memperoleh kunci sebelum mengakses (tunggu jika tidak diperoleh), dan melepaskan kunci selepas mengakses.
Semaphore sebenarnya adalah pembilang integer, terutamanya digunakan untuk Melaksanakan bersama. pengecualian dan penyegerakan antara proses dan bukannya cache data untuk komunikasi antara proses.
Semaphore mewakili bilangan sumber Terdapat dua operasi atom untuk mengawal semaphore:
Satu ialah operasi P ini akan menolak -1 daripada semaphore Jika semaphore = 0 selepas penolakan, ia menunjukkan bahawa masih terdapat sumber dan proses boleh terus dilaksanakan seperti biasa.
Yang lain ialah operasi V Operasi ini akan menambah 1 pada semaphore Selepas penambahan, jika semaphore 0, ia menunjukkan bahawa pada masa ini tiada proses yang disekat; . Kedua-dua operasi ini Mesti muncul secara berpasangan.
Sebagai contoh, semafor 2 sumber adalah bersamaan dengan 2 landasan kereta api Proses operasi PV adalah seperti berikut:
Sebuah kereta api memasuki trek , bersamaan dengan operasi P semafor, sumber -1, jadi hanya tinggal satu trek Kemudian kereta api lain menduduki trek lain, iaitu operasi P, sumber -1 Pada ketika ini lampu isyarat bertukar merah kerana tiada landasan tersedia dan tren ketiga perlu menunggu Kereta api pertama meninggalkan trek, yang bersamaan dengan operasi V Pada masa ini, sumber trek ialah 1 dan lampu isyarat bertukar hijau Kereta api ketiga mendapati bahawa. lampu isyarat bertukar hijau, Jadi memasuki landasan kereta api, sumber trek habis kepada 0, jadi lampu isyarat bertukar merahDalam sistem trek kereta api ini, trek adalah sumber awam, setiap kereta api adalah seperti benang, dan lampu isyarat memainkan peranan semafor. Semaphore boleh merealisasikan operasi pengecualian bersama kunci dan juga boleh merealisasikan penyegerakan proses/benang
1) Semaphore binari (juga dipanggil semafor binari)
Pada masa ini, nilai awal semaphore hanya boleh 0 dan 1. (Semaphore binari boleh melaksanakan operasi kunci mutex)
2) Semaphore umum/mengira
Pada masa ini, nilai awal semaphore boleh menjadi sebarang nombor bukan negatif. Jelas sekali, ia mengandungi semafor binari. Contoh landasan kereta api yang diberikan di atas boleh dilaksanakan menggunakan semaphore mengira Perbezaan umum antara semaphore mengira dan kunci ialah ia boleh membenarkan berbilang benang/proses (bilangan utas ditentukan oleh nilai awal semaphore mengira) kepada. mengendalikan sumber awam pada masa yang sama
Secara amnya, anda mungkin menghadapi senario di mana anda perlu menggunakan semaphore hanya apabila membangunkan berbilang proses Hampir tiada senario di mana semaphore digunakan dalam phper pada sumber awam, kunci fail kumpulan kebanyakannya digunakan
<?php $file = "num.txt";//定一个空文件 $count =0; file_put_contents($file,$count); $pid = pcntl_fork();//fork 一个进程 if($pid == 0){//子进程执行逻辑 $x = (int)file_get_contents($file);//读取文件内容 //i 循环累加 for($i=0; $i<1000; $i++){ $x = $x + 1; } //写入文件 file_put_contents($file,$x); //子进程退出 exit(0); } //父进程执行逻辑 $x = (int)file_get_contents($file); for($i=0; $i<1000; $i++){ $x = $x+1; } //累加写入 file_put_contents($file,$x);
Pembantu dalam menulis skrip shell
#!/bin/bash for a in {1..1000} do (php demo1.php) b=`cat num.txt` if [ $b != 2000 ] then echo -e "错误$b" fi done
Secara logiknya, pembolehubah$x
ditulis terakhir Nilai fail input sepatutnya 2000, tetapi malangnya, ini tidak berlaku Mari kita laksanakan skrip di atas:
<🎜. >
Selepas menjalankannya 1000 kali, kami mendapati bahawa pembolehubah $x muncul. Mengapa ini berlaku? Kami tahu bahawa untuk mencapai ilusi berbilang program yang berjalan pada masa yang sama dalam sistem CPU teras tunggal, sistem pengendalian biasanya menggunakan penjadualan hirisan masa apabila proses habis potongan masanya, ia beralih ke proses seterusnya Jalankan, dan dalam bahasa peringkat tinggi kami, bukan setiap baris kod adalah atom. , tetapi ia disusun ke dalam kod pemasangan oleh pengkompil [Arahan mesin] boleh dilaksanakan oleh berbilang arahan, yang akan menyebabkan masalah jika arahan hanya dilaksanakan sehingga separuh daripada hirisan masa yang diperuntukkan oleh proses itu digunakan atau diganggu oleh. proses lain, data mungkin rosak, mengakibatkan ralat dalam hasil pengiraan akhirx = (int)file_get_contents(
Gunakan PHP untuk merangkum fungsi set semaphore sistem )
<?php $file = "num.txt";//定一个空文件 $count =0; $key = ftok("demo1.php","x"); $sem_id = sem_get($key,1);// 第二个参数是个整数,表示设置信号量集,设置为1 把它当做二值信号量来用,用于互斥 file_put_contents($file,$count); $pid = pcntl_fork();//fork 一个进程 if($pid == 0){//子进程执行逻辑 sem_acquire($sem_id); // P -1 操作 获取一个信号量 , 如果为0表示资源被占用进程挂起等待信号量释放 $x = (int)file_get_contents($file);//读取文件内容 //i 循环累加 for($i=0; $i<1000; $i++){ $x = $x + 1; } //写入文件 file_put_contents($file,$x); sem_release($sem_id); //V +1 操作 释放信号量 //子进程退出 exit(0); } //父进程执行逻辑 sem_acquire($sem_id); // P -1 操作 获取信号量, 如果为0表示资源被占用进程挂起等待信号量释放 $x = (int)file_get_contents($file); for($i=0; $i<1000; $i++){ $x = $x+1; } //累加写入 file_put_contents($file,$x); sem_release($sem_id); //V +1 操作 释放信号量
Tutorial video PHP
)Atas ialah kandungan terperinci Fahami secara ringkas semafor komunikasi proses PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!