• 技术文章 >PHP >PHP教程

    php信号量和共享内存分别是什么

    小妮浅浅小妮浅浅2021-08-19 09:59:23原创4179

    说明

    1、信号量:是系统提供的一种原子操作,一个信号数量,同时只有一个进程能操作。

    一个过程获得一个信号,必须被过程释放。

    2、共享内存:是系统在存储器中打开的一个公共存储器区域,任何一个过程都可以访问。

    在同一时刻,可以有多个过程访问该区域,为了保证数据的一致性,需要对该存储器区域进行锁定或信号。

    实例

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    32

    33

    34

    35

    36

    37

    38

    39

    40

    41

    42

    43

    44

    45

    46

    47

    48

    49

    50

    51

    52

    53

    54

    55

    56

    57

    58

    59

    60

    61

    62

    63

    64

    65

    66

    67

    68

    69

    echo "parent progress pid:{$parentPid}\n";

    $childList = array();

      

    // 创建共享内存,创建信号量,定义共享key

    $shm_id = ftok(__FILE__,'m');

    $sem_id = ftok(__FILE__,'s');

    $shareMemory = shm_attach($shm_id);

    $signal = sem_get($sem_id);

    const SHARE_KEY = 1;

    // 生产者

    function producer(){

        global $shareMemory;

        global $signal;

        $pid = posix_getpid();

        $repeatNum = 5;

        for ( $i = 1; $i <= $repeatNum; $i++) {

            // 获得信号量

            sem_acquire($signal);

             

            if (shm_has_var($shareMemory,SHARE_KEY)){

                // 有值,加一

                $count = shm_get_var($shareMemory,SHARE_KEY);

                $count ++;

                shm_put_var($shareMemory,SHARE_KEY,$count);

                echo "({$pid}) count: {$count}\n";

            }else{

                // 无值,初始化

                shm_put_var($shareMemory,SHARE_KEY,0);

                echo "({$pid}) count: 0\n";

            }

            // 用完释放

            sem_release($signal);

             

            $rand = rand(1,3);

            sleep($rand);

        }

    }

    function createProgress($callback){

        $pid = pcntl_fork();

        if ( $pid == -1) {

            // 创建失败

            exit("fork progress error!\n");

        } else if ($pid == 0) {

            // 子进程执行程序

            $pid = posix_getpid();

            $callback();

            exit("({$pid})child progress end!\n");

        }else{

            // 父进程执行程序

            return $pid;

        }

    }

    // 3个写进程

    for ($i = 0; $i < 3; $i ++ ) {

        $pid = createProgress('producer');

        $childList[$pid] = 1;

        echo "create producer child progress: {$pid} \n";

    }

    // 等待所有子进程结束

    while(!empty($childList)){

        $childPid = pcntl_wait($status);

        if ($childPid > 0){

            unset($childList[$childPid]);

        }

    }

    // 释放共享内存与信号量

    shm_remove($shareMemory);

    sem_remove($signal);

    echo "({$parentPid})main progress end!\n";

    以上就是php信号量和共享内存的介绍,希望对大家有所帮助。更多php学习指路:php教程

    推荐操作系统:windows7系统、PHP5.6、DELL G3电脑

    专题推荐:php信号量 共享内存
    上一篇:php消息队列的介绍 下一篇:php多进程通信之管道的介绍

    相关文章推荐

    • php双引号和单引号的区别• php中get和post有哪些不同• php中require和include如何区分• php PSR-4是什么意思• php7.3中Heredoc和Nowdoc语法的使用• php尾部逗号的使用• php中PCRE2的使用• php中实现数组去重的函数• php数组中如何重置索引• php中array_filter清除空值• php数组中array_product函数的使用• php数组中array_count_values的使用• php消息队列的介绍

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网