CherieLi Student

共享内存

2022-11-17
CherieLi

共享内存首先为一块实际物理内存,该块物理内存地址被映射到对应的不同进程地址空间中。

使用方法

cat /proc/sys/kernel/shmmax 共享内存总体大小限制(以字节为单位)

cat /proc/sys/kernel/shmmni SHMMNI参数,这个内核参数用于设置系统范围内共享内存段的最大数量。该参数的默认值是 4096 。这一数值已经足够,通常不需要更改

cat /proc/sys/kernel/shmall SHMALL共享内存内核参数。该参数控制着系统一次可以使用的共享内存总量(以页为单位)。简言之,该参数的值始终应该至少为:ceil(SHMMAX/PAGE_SIZE)

接口函数

shmget方法创建共享内存,或者访问一个已存在的共享内存区。

int shmget(key_t key, size_t size, int flag);

shmat方法映射共享内存与进程地址空间。

void *shmat(int shmid, const void *shmaddr, int shmflg);

shmdt方法来释放映射关系

int shmdt(const void shmaddr);

shmctl ( ):共享内存控制

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

shmdt和shmctl的区别:

shmdt是将共享内存从进程空间detach出来,使进程中的shmid无效化,不可以使用。但是保留空间。而shmctl(sid, IPC_RMID, 0)则是删除共享内存,彻底不可用,释放空间。

ipcs命令

ipcs -a 查看当前使用的共享内存、消息队列及信号量所有信息。
ipcs -p 命令可以得到与共享内存、消息队列相关进程之间的消息。
ipcs -u 命令可以查看各个资源的使用总结信息,其中可以看到使用的信号量集的个数、信号量的个数,以及消息队列中当前使用的消息个数总数、占用的空间字节数。
ipcs -l 命令可以查看各个资源的系统限制信息,可以看到系统允许的最大信号量集及信号量个数限制、最大的消息队列中消息个数等信息。

释放所有已分配的共享内存:

ipcs -m | awk '$2 ~ /[0-9]+/ {print $2}' | while read s; do sudo ipcrm -m $s; done

上一篇 zk 学习

下一篇 三平面网络

Comments

Content