PHP进程通信-信号量和共享内存

作者: 会长__ | 来源:发表于2019-01-17 15:01 被阅读1次

信号量与共享内存。共享内存是最快是进程间通信方式,因为n个进程之间并不需要数据复制,而是直接操控同一份数据。实际上信号量和共享内存是分不开的,要用也是搭配着用。*NIX的一些书籍中甚至不建议新手轻易使用这种进程间通信的方式,因为这是一种极易产生死锁的解决方案。共享内存顾名思义,就是一坨内存中的区域,可以让多个进程进行读写。这里最大的问题就在于数据同步的问题,比如一个在更改数据的时候,另一个进程不可以读,不然就会产生问题。所以为了解决这个问题才引入了信号量,信号量是一个计数器,是配合共享内存使用的.

<?php
//ftok将一个路径名pathname和一个项目名(必须为一个字符), 转化成一个整形的用来使用系统V IPC的key
$sem_key = ftok( __FILE__, 'b' );
// 获取信号id
$sem_id = sem_get( $sem_key );
//ftok将一个路径名pathname和一个项目名(必须为一个字符), 转化成一个整形的用来使用系统V IPC的key
$shm_key = ftok( __FILE__, 'm' );
// 创建一个共享内存
$shm_id = shm_attach( $shm_key, 1024, 0666 );
const SHM_VAR = 1;
$child_pid = [];
for( $i = 1; $i <= 2; $i++ ){
    $pid = pcntl_fork();
    if( $pid < 0 ){
        exit();
    } else if( 0 == $pid ) {
        // 获取信号量(获取锁)
        sem_acquire( $sem_id );
        // 判断此信号量中是否有值
        if( shm_has_var( $shm_id, SHM_VAR ) ){
            $counter = shm_get_var( $shm_id, SHM_VAR );
            $counter += 1;
            shm_put_var( $shm_id, SHM_VAR, $counter );
        } else {
            $counter = 1;
            shm_put_var( $shm_id, SHM_VAR, $counter );
        }
        // 释放信号量(释放锁)
        sem_release( $sem_id );
        exit;
    } else if( $pid > 0 ) {
        $child_pid[] = $pid;
    }
}
while( !empty( $child_pid ) ){
    foreach( $child_pid as $pid_key => $pid_item ){
        pcntl_waitpid( $pid_item, $status, WNOHANG );
        unset( $child_pid[ $pid_key ] );
    }
}
sleep( 2 );
echo '最终结果'.shm_get_var( $shm_id, SHM_VAR ).PHP_EOL;
// 删除共享内存数据,删除共享内存是有顺序的,先remove后detach
shm_remove( $shm_id );
shm_detach( $shm_id );

相关文章

  • PHP进程通信-信号量和共享内存

    信号量与共享内存。共享内存是最快是进程间通信方式,因为n个进程之间并不需要数据复制,而是直接操控同一份数据。实际上...

  • Linux

    操作系统 Linux进程间通信方式:Socket、共享内存、消息队列、信号量 epoll、select、poll ...

  • Linux知识

    Linux进程间通信方式有:消息队列,命名管道,信号量,共享内存,Berkeley套接字 等 临界区...

  • linux内核编程-IPC进程间通信

    进程间通信方式 方式管道(使用简单),信号量,信号(开销比较小),共享映射区(共享内存),消息队列,套接字(sok...

  • Unix进程间通信比较

    通信方式共享内存 (速度最快、需要进程处理同步)命名管道消息队列SOCKETRPC 同步方式:文件锁信号量MONI...

  • Linux内核编程--字符设备文件,进行进程间通信,弄清open

    前言:进程间通信有: socket , 共享内存, 消息队列,信号量,信号,环境变量等 一、字符设备驱动框架流程:...

  • Android

    ContentProvider 作用 进程间数据共享 即跨进程通信 原理 Binder进程间通信结合匿名共享内存(...

  • PHP进程间通信--信号量与共享内存

    PHP提供了两种实现共享内存的扩展。下面我们来一一讲解。 一、shmop 系类函数 注意两点:1、shmop_re...

  • Binder的介绍与原理分析

    介绍 1,首先进程间的通信方式:管道、消息队列、共享内存、信号量、信号、socket套接字、信号等2, binde...

  • 共享内存

    Linux进程间通信 - 共享内存

网友评论

    本文标题:PHP进程通信-信号量和共享内存

    本文链接:https://www.haomeiwen.com/subject/imjidqtx.html