代码改变世界

PHP处理共享内存和信号量

2014-11-25 20:51  鸵鸟当爸  阅读(826)  评论(0)    收藏  举报

1,linux:ipcs
查看系统共享内存,信号量,队列
[root@iZ286nxqlncZ workerman]# ipcs

------ Shared Memory Segments --------
key        shmid      owner      perms      bytes      nattch     status      

------ Semaphore Arrays --------
key        semid      owner      perms      nsems     
0x00000000 0          root       600        1         
0x00000000 32769      root       600        1         
0x000c1152 65538      root       666        3         

------ Message Queues --------
key        msqid      owner      perms      used-bytes   messages


2,PHP处理共享内存和信号量
两模块--enable-shmop --enable-sysvsem

$shm_id = shmop_open(0xff3, "c", 0644, 100);
shmop_delete($id);
int shmop_write (int shmid, string data, int offset)
string shmop_read (int shmid, int start, int count)
多线程操作的互斥机制
实现互斥机制的最简单办法就是使用信号灯。一旦你成功的拥有了一个信号量,你对它所能做的只有2种:请求、释放。当你执行释放操作时, 系统将把该信号值减一。如果小于0那就还设为0。而当你执行请求操作时,系统将把该信号值加一,如果该值大于设定的最大值那么系统将挂起你的处理进程直到其他进程释放到小于最大值为止。一般情况下最大值设为1,这样一来当一个进程获得请求时其他后面的进程只能等待它退出互斥区后释放信号量才能进入该互斥区并同时设为独占方式。这样的信号量常称为双态信号量。当然,如果初值是任意一个正数就表明有多少个共享资源单位可供共享应用。
int sem_get (int key [, int max_acquire [, int perm]])
int sem_acquire (int sem_identifier)获取
int sem_release (int sem_identifier)释放

下面是一段很简单的互斥操作规程。
$semid=sem_get(0xee3,1,0666);
$shm_id = shmop_open(0xff3, "c", 0644, 100);
sem_acquire($semid);      //申请
/* 进入临界区*/
  这里,对共享内存进行处理
sem_release($semid);      //释放