0

0

简单了解php进程通信之信号量

WBOY

WBOY

发布时间:2022-09-02 16:57:22

|

2348人浏览过

|

来源于脚本之家

转载

(推荐教程:php视频教程

常见进程通信方式

一些理论基础

  • 临界资源:每次仅允许一个进程访问的资源。
  • 临界区:每个进程中访问临界资源的那段代码叫临界区

所谓临界区(也称为临界段)就是访问和操作共享数据的代码段。

进程互斥:两个或以上的进程不能同时进入关于同一组共享变量的临界区域,即一个进程正在访问临界资源,另一个进程要想访问必须等待。

进程同步:主要研究如何确定数个进程之间的执行顺序和避免数据竞争的问题 即,如何让多个进程能一块很好的协作运行

所谓同步,就是并发进程/线程在一些关键点上可能需要互相等待与互通消息,这种相互制约的等待与互通信息称为进程/线程同步。

立即学习PHP免费学习笔记(深入)”;

举个生活的同步例子,你肚子饿了想要吃饭,你叫妈妈早点做菜,妈妈听到后就开始做菜,但是在妈妈没有做完饭之前,你必须阻塞等待,等妈妈做完饭后,自然会通知你,接着你吃饭的事情就可以进行了。

注意,同步与互斥是两种不同的概念:

同步就好比:「操作 A 应在操作 B 之前执行」,「操作 C 必须在操作 A 和操作 B 都完成之后才能执行」等;

互斥就好比:「操作 A 和操作 B 不能在同一时刻执行」;

system V 信号量

信号量用途:主要用于多进程或多线程对公共资源对象的访问控制。 用来解决多进程(多线程同步的问题),类似于一把锁,访问前获取锁(获取不到则等待),访问后释放锁。

多进程/多线程一般是并发执行,如果对公共资源访问没有做同步处理,很容易造成数据破坏

信号量其实是一个整型的计数器,主要用于实现进程间的互斥与同步,而不是用于缓存进程间通信的数据。

信号量表示资源的数量,控制信号量的方式有两种原子操作:

一个是 P 操作,这个操作会把信号量减去 -1,相减后如果信号量 = 0,则表明还有资源可使用,进程可正常继续执行。

另一个是 V 操作,这个操作会把信号量加上 1,相加后如果信号量 0,则表明当前没有阻塞中的进程;

P 操作是用在进入共享资源之前,V 操作是用在离开共享资源之后,这两个操作是必须成对出现的。

举个类比,2 个资源的信号量,相当于 2 条火车轨道,PV 操作如下图过程:

一辆火车进入轨道,相当于信号量的P操作,资源-1,这样就剩下一条轨道

CRMEB 多语言开源商城系统
CRMEB 多语言开源商城系统

CRMEB打通版是一款全开源支持免费商用的PHP 多语言商城系统;CRMEB技术团队历经6年时间匠心之作!系统采用前后端分离技术,基于TP6+Uni-app框架开发;客户移动端采用uni-app开发,管理后台前端使用iviewUI开发。系统支持微信公众号端、微信小程序端、H5端、PC端多端账号同步,可快速打包生成APP;赋能开发者,减少重复造轮子;系统支持自动检查安装环境一键安装部署,使用简单方便

下载

接着又一辆火车占用另一条轨道,也就是P操作,资源-1

此时交通信号灯变为红色,因为没有轨道可用,第三辆火车必须等待

第一辆火车离开轨道,相当于V操作,此时轨道资源为1,交通灯变为绿灯

第三辆火车发现交通信号灯变绿,于是进入火车轨道,轨道资源耗尽为0,于是交通信号灯变为红灯

在这个火车轨道系统中,轨道是公共资源,每辆火车好比一个线程,交通信号灯起的就是信号量的作用。信号量可以实现锁的互斥操作,也可以实现进程/线程同步

信号量类型

1)二进制信号量(也叫二值信号量)

此时信号量的初值只能是0和1。(二进制信号量可以实现互斥锁操作)

2)一般/计数信号量

此时信号量的初值可以是任意非负数。显然,其包含二进制信号量。上面举的火车轨道例子就可以使用计数信号量来实现,一般计数信号量与锁的区别是它可以允许多个线程/进程(线程的数量由计数信号量初值定义) 同时操作公共资源

一般只有在开发多进程的时候才可能遇到需要使用信号量的场景,phper 几乎很少有使用信号量的场景,就算有多进程对公共资源操作,大多也是使用 flock 文件锁做互斥操作

php模拟多进程操作公共资源

在编写一个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

按理来说,变量 $x 最后写入文件的值应该是2000,但很不幸,并不是如此,我们对上面的脚本执行一下:

运行了1000次,发现出现了变量$x值结果是 1000 的有8次,虽然发生错误的概率比较小,但是在计算机里是不能容忍的。

为什么会出现这种情况,我们知道单核cpu系统里为了实现多个程序同时运行的假象,操作系统通常都采用时间片调度,一个进程时间片用完就切换下一个进程运行,加上我们的高级语言不是每一行代码都是原子性的,比如x = (int)file_get_contents($file) 这行代码对于我们来说是不可分割是原子性的,但是经过编译器编译成汇编码【机器指令】可能是多条指令实现,这样就会出现问题,如果指令只执行到一半进程分配的时间片用完或者被其他进程打断,都有可能造成数据损坏,导致最后计算结果出现误差

使用php封装system v 信号量集函数

加入信号量后,那就一定保证100%是2000,绝对不会出现其他数值。

(推荐教程:php视频教程

相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

php

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

68

2026.01.16

全民K歌得高分教程大全
全民K歌得高分教程大全

本专题整合了全民K歌得高分技巧汇总,阅读专题下面的文章了解更多详细内容。

127

2026.01.16

C++ 单元测试与代码质量保障
C++ 单元测试与代码质量保障

本专题系统讲解 C++ 在单元测试与代码质量保障方面的实战方法,包括测试驱动开发理念、Google Test/Google Mock 的使用、测试用例设计、边界条件验证、持续集成中的自动化测试流程,以及常见代码质量问题的发现与修复。通过工程化示例,帮助开发者建立 可测试、可维护、高质量的 C++ 项目体系。

54

2026.01.16

java数据库连接教程大全
java数据库连接教程大全

本专题整合了java数据库连接相关教程,阅读专题下面的文章了解更多详细内容。

39

2026.01.15

Java音频处理教程汇总
Java音频处理教程汇总

本专题整合了java音频处理教程大全,阅读专题下面的文章了解更多详细内容。

19

2026.01.15

windows查看wifi密码教程大全
windows查看wifi密码教程大全

本专题整合了windows查看wifi密码教程大全,阅读专题下面的文章了解更多详细内容。

85

2026.01.15

浏览器缓存清理方法汇总
浏览器缓存清理方法汇总

本专题整合了浏览器缓存清理教程汇总,阅读专题下面的文章了解更多详细内容。

40

2026.01.15

ps图片相关教程汇总
ps图片相关教程汇总

本专题整合了ps图片设置相关教程合集,阅读专题下面的文章了解更多详细内容。

11

2026.01.15

ppt一键生成相关合集
ppt一键生成相关合集

本专题整合了ppt一键生成相关教程汇总,阅读专题下面的的文章了解更多详细内容。

47

2026.01.15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP课程
PHP课程

共137课时 | 8.8万人学习

JavaScript ES5基础线上课程教学
JavaScript ES5基础线上课程教学

共6课时 | 7.8万人学习

PHP新手语法线上课程教学
PHP新手语法线上课程教学

共13课时 | 0.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号