为什么需要进程间通信当进程访问临界资源时,进程间不确定谁先执行(这个要看内核的进程调度算法,比较复杂)有可能多个进程同时访问临界资源,导致不可预知的错误。临界资源临界资源指的是一些共享资源,即使是共享资源,也不能被多个进程同时访问。当一个进程正在使用临界资源时,其他进程必须等待占用进程根据操作系统的同步机制释放共享资源,然后才能重新竞争使用共享资源。共享内存共享内存是系统在内存中开辟的一块公共内存区域,任何进程都可以访问。同时,多个进程可以访问这个区域。为了保证数据的一致性,需要加锁或者信号量。semaphore信号量这个名字莫名其妙,但是看它的英文原意就很好理解了。信号量英文[?sem?f?:(r)]vt.发送一个信号,播放一个信号量;类似于指挥官的角色。比如让我们很容易理解这个信号量在生活中的用法。理解之后,就可以应用到我们的编程领域了。每个公司只有一个厕所。那么当有人上厕所时,必须取得一面旗帜(信号量),将旗帜插在厕所门口的菊花盆中,表示厕所正在使用中。然后员工上完厕所后,需要拉出flag释放(信号量),表示现在可以让其他人使用了。通过简单的插拔flag的动作,我们就可以知道当前的马桶(共享内存)是否可以使用。经典问题——哲学家吃饭有5个哲学家坐在一张桌子吃饭,每个哲学家面前有两双筷子,哲学家只有左右两双筷子才能吃饭。在这个案例中,出现了一个极端的场景,五个哲学家同时拿起了左手的筷子,当他们继续握住右手的筷子时,却发现自己已经被左手握住了他们旁边的哲学家。这就导致了一个尴尬的局面。五哲左手执筷,右手空空。他们陷入了等待右手筷子的死循环。最后,五位哲学家饿死了。.....解法:很简单,只要五个哲学家相互通信,信号量就是我要用筷子吃饭。你先把我需要的筷子放好,别动。等待我的旗帜被降下。我吃完了,你等我吃完放下筷子再去拿筷子。演示代码没有使用信号量,多进程操作共享内存0){取消设置($childList[$pid]);}}echo"It'sover\n";shm_remove($shm_id);//从Unix系统中删除共享内存shm_detach($shm_id);//断开共享内存段fork10个进程后,每个进程都会休眠(rand(1,10)),然后开始从共享内存中取出值,累加1,然后保存到共享内存中。在不使用信号量的情况下,实际结果是Messy,进程间抢占共享内存,然后进行操作。使用信号量,多进程操作共享内存0){取消设置($childList[$pid]);}}echo"结束\n";sem_remove($signal);shm_remove($shm_id);shm_detach($shm_id);当一个进程有信号量时,其他进程会等待该进程释放信号量,然后其他进程就会抢占信号量。多进程操作共享内存就会变得有序。代码运行结果如下
