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[]