PHP ビデオ チュートリアル)
一般的なプロセス通信方法 ##理論的根拠##最初の列車が線路を出発します。これは V 運転に相当します。このとき、線路リソースは 1 で、信号は青に変わります。
3 番目の列車は、渋滞を発見しました。信号が青に変わり、線路に入ると線路のリソースが使い果たされて 0 になり、信号が赤に変わります
この鉄道軌道システムでは、線路は公共資源であり、各列車は糸のようなものであり、信号機は信号機の役割を果たします。セマフォは、ロックの相互排他操作を実現でき、プロセス/スレッドの同期も実現できます。
1) バイナリ セマフォ (バイナリ セマフォとも呼ばれます)
このとき、セマフォの初期値は 0 と 1 のみです。 (バイナリ セマフォはミューテックス ロック操作を実装できます)
2) 一般/カウント セマフォ
現時点では、セマフォの初期値は負でない任意の数値にすることができます。明らかに、バイナリ セマフォが含まれています。上記の列車線路の例は、カウント セマフォを使用して実装できます。一般に、カウント セマフォとロックの違いは、複数のスレッド/プロセス (スレッドの数はカウント セマフォの初期値によって定義されます) が許可されることです。パブリックリソースを同時に操作する
通常、複数のプロセスを開発する場合にのみ、セマフォの使用が必要なシナリオに遭遇することがありますが、phper ではセマフォを使用するシナリオはほとんどありません。相互に排他的な操作
<?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);
シェル スクリプトの作成を支援します
#!/bin/bash for a in {1..1000} do (php demo1.php) b=`cat num.txt` if [ $b != 2000 ] then echo -e "错误$b" fi done
論理的につまり、変数 #$x
は最後に書き込まれます。入力ファイルの値は 2000 であるはずですが、残念ながらそうではありません。上記のスクリプトを実行してみましょう:
# 1000 回実行した後、変数 $x が出現したことがわかりました。値の結果は 8 回 1000 でした。エラーの可能性は比較的小さいですが、コンピューターでは許容できません。 なぜこのようなことが起こるのでしょうか? シングルコア CPU システムで複数のプログラムが同時に実行されているような錯覚を実現するために、オペレーティング システムは通常、タイム スライス スケジューリングを使用することがわかっています。実行すると、高級言語ではコードのすべての行がアトミックになるわけではありません。たとえば、
x = (int)file_get_contents($file
) このコード行は私たちには不可能です セグメンテーションはアトミックですが、コンパイラがそれをアセンブリ コード [機械語] にコンパイルした後、複数の命令によって実装される可能性があります。命令の半分だけがセグメンテーションされると問題が発生します。プロセスによって割り当てられたタイム スライスが使い果たされるか、他のプロセスによって中断されるまで実行されます。データ損傷が発生し、最終的な計算結果にエラーが発生する可能性があります。
<?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 操作 释放信号量
PHP ビデオ チュートリアル)
以上がPHPプロセス通信のセマフォを簡単に理解するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。