PHP内存共享与信号控制

ftok

系统建立IPC通讯(消息队列、信号量和共享内存)时必须指定一个ID值。通常情况下,该id值通过ftok函数得到。

# ftok的第一个参数接收一个文件或者路径,参数2为一个字符串,准确的说是一个0-255的数字,输入的当个
# 字符会被转成ASSIC对应的数字,输入长度大于1的字符会报错。
ftok('.', 'a');

ftok在C语言中的实现

key_t ftok(const char *pathname, int proj_id);

其中参数fname是指定的文件名,这个文件必须是存在的而且可以访问的。 id是子序号,它是一个8bit的整数。即范围是0~255。当函数执行成功,则会返回key_t键值,否则返回-1。 在一般的UNIX中,通常是将文件的索引节点取出,然后在前面加上子序号就得到key_t的值。

shmop

shmop 系列函数使用

/**
 * shmop_open(int $key , string $flags , int $mode , int $size)
 * $key 共享内存的key
 * $flags 的值有以下几种
 * a :  创建一个只读的共享内存区。
 * c :  如果共享内存区已存在,则打开该共享内存区,并尝试读写。否则新建共享内存区
 * w : 创建一个读写共享内存区
 * n :  创建一个共享内存区,如果已存在,则返回失败
 *
 * $mode 读写权限。如0755 0644 等
 * $size 申请共享内存区的大小
 */

/**
 * shmop_read( resource $shmid , int $start , int $count)
 * 将从共享内存块中读取数据
 * $shmid 共享内存id,资源类型
 * $start 从共享内存的那个字节开始读起
 * $count 一次读取多少个字节。
 * 如果count值小于发送的信息长度,则信息会被截断。
 */

/**
 * shmop_write(resource $shmid , string $data , int $offset)
 * 将数据写入共享内存块
 * $data 将要写入的数据
 * $offset 从共享内存块的那个位置开始写入。
 * 该函数的返回值是写入数据的长度。
 */

/**
 * shmop_size(resource $shmid);
 * 返回当前共享内存块,已经使用的大小
 */


/**
 * shmop_delete ( resource $shmid )
 * 删除一个共享内存块的,删除引用关系
 */

/**
 * shmop_close ( resource $shmid )
 * 关闭共享内存块
 * 要先使用shmop_delete 之后才能继续使用shmop_close
 */

ipcs

查看当前系统所有分配的分享内存列表 ipcs -a 查看当前使用的共享内存、消息队列及信号量信息

 $ipcs -a
 ------ Message Queues[消息队列] --------
 # messages 消息个数
 # used-bytes 消息占用的字节数
 key        msqid      owner      perms      used-bytes   messages

 ------ Shared Memory Segments[部分共享内存] --------
 # perms 共享内存的权限
 # nsems 连接到共享内存的进程数
 key        shmid      owner      perms      bytes      nattch     status
 0x0052e2c1 0          postgres   600        56         5
 0x00000000 32769      root       644        80         2
 0x00000000 65538      root       644        16384      2
 0x00000000 98307      root       644        280        2

 ------ Semaphore Arrays[信号量数组]--------
 # 每一行代表一个信号量集
 # perms 信号量集的权限
 # nsems 信号量集中的信号量个数
 key        semid      owner      perms      nsems
 0x0052e2c1 65536      postgres   600        17
 0x0052e2c2 98305      postgres   600        17
 0x000000a7 327688     root       600        1

ipcs -p 查看与共享内存、消息队列相关进程之间的消息

 $ipcs -p
 ------ Message Queues PIDs --------
 # lspid 最近一次向消息队列中发送消息的“进程号”
 # lrpid 最近一次从消息队列中读取消息的“进程号”
 msqid      owner      lspid      lrpid

 ------ Shared Memory Creator/Last-op PIDs --------
 # cpid 创建者进度
 # lpid 最后操作者进度
 shmid      owner      cpid       lpid
 0          postgres   1142       2833
 32769      root       1442       1470
 65538      root       1442       1470
 98307      root       1442       1470

ipcs -u 查看各个资源的使用总结信息,其中可以看到使用的信号量集的个数、信号量的个数,以及消息队列中当前使用的消息个数总数、占用的空间字节数。

------ Messages Status --------
allocated queues[已分配队列] = 0
used headers = 0
used space[已使用空间] = 0 bytes

------ Shared Memory Status --------
segments allocated 4
pages allocated 7
pages resident  7
pages swapped   0
Swap performance: 0 attempts     0 successes

------ Semaphore Status --------
used arrays = 9
allocated semaphores = 137

ipcs -l命令可以查看各个资源的系统限制信息,可以看到系统允许的最大信号量集及信号量个数限制、最大的消息队列中消息个数等信息。

------ Messages Limits --------
max queues system wide = 32000
max size of message (bytes) = 8192
default max size of queue (bytes) = 16384

------ Shared Memory Limits --------
max number of segments = 4096
max seg size (kbytes) = 18014398509465599
max total shared memory (kbytes) = 18014398442373116
min seg size (bytes) = 1

------ Semaphore Limits --------
max number of arrays = 32000
max semaphores per array = 32000
max semaphores system wide = 1024000000
max ops per semop call = 500
semaphore max value = 32767

posix_kill pcntl_fork 参考地址:
shmop[http://www.cnblogs.com/roverliang/p/6228123.html]
ipcs[http://blog.csdn.net/dalongyes/article/details/50616162]
ftok[]