专栏首页linux百科小宇宙详解Linux共享内存的管理

详解Linux共享内存的管理

在进程通信应用中会用到共享内存,这就涉及到了IPC,与IPC相关的命令包括:ipcs、ipcrm(释放IPC)。IPCS命令是Linux下显示进程间通信设施状态的工具。我们知道,系统进行进程间通信(IPC)的时候,可用的方式包括信号量、共享内存、消息队列、管道、信号(signal)、套接字等形式[2]。使用IPCS可以查看共享内存、信号量、消息队列的状态。

当下系统是Ubuntu Linux 18.04,执行ipcs命令查看

linuxidc@linuxidc:~/linuxidc.com$ ipcs

--------- 消息队列 -----------

键        msqid      拥有者  权限    已用字节数 消息     

------------ 共享内存段 --------------

键        shmid      拥有者  权限    字节    连接数  状态     

0x00000000 393217    linuxidc  600        524288    2          目标     

0x00000000 425986    linuxidc  600        524288    2          目标     

0x00000000 458755    linuxidc  600        524288    2          目标     

0x00000000 1867780    linuxidc  600        16777216  2          目标     

0x00000000 4456453    linuxidc  600        16777216  2          目标     

0x00000000 557062    linuxidc  600        524288    2          目标     

0x00000000 4554759    linuxidc  600        4194304    2          目标     

0x00000000 1048591    linuxidc  600        67108864  2          目标     

--------- 信号量数组 -----------

键        semid      拥有者  权限    nsems 

 

说明:

第一列就是共享内存的key;

第二列是共享内存的编号shmid;

第三列就是创建的用户owner;

第四列就是权限perms;

第五列为创建的大小bytes;

第六列为连接到共享内存的进程数nattach;

第七列是共享内存的状态status。其中显示“dest”表示共享内存段已经被删除,但是还有用户在使用它,当该段内存的mode字段设置为 SHM_DEST时就会显示“dest”。当用户调用shmctl的IPC_RMID时,内存先查看多少个进程与这个内存关联着,如果关联数为0,就会销 毁这段共享内存,否者设置这段内存的mod的mode位为SHM_DEST,如果所有进程都不用则删除这段共享内存。

具体的用法总结如下:

1、显示所有的IPC设施

linuxidc@linuxidc:~/linuxidc.com$ ipcs -a

--------- 消息队列 -----------

键        msqid      拥有者  权限    已用字节数 消息     

------------ 共享内存段 --------------

键        shmid      拥有者  权限    字节    连接数  状态     

0x00000000 4784128    linuxidc  600        524288    2          目标     

0x00000000 393217    linuxidc  600        524288    2          目标     

0x00000000 425986    linuxidc  600        524288    2          目标     

0x00000000 458755    linuxidc  600        524288    2          目标     

0x00000000 1867780    linuxidc  600        16777216  2          目标     

0x00000000 4816901    linuxidc  600        16777216  2          目标     

0x00000000 557062    linuxidc  600        524288    2          目标     

0x00000000 4554759    linuxidc  600        4194304    2          目标     

0x00000000 1048591    linuxidc  600        67108864  2          目标     

--------- 信号量数组 -----------

键        semid      拥有者  权限    nsems   

2、显示所有的消息队列Message Queue

# ipcs -q

3、显示所有的信号量

# ipcs -s

4、显示所有的共享内存

# ipcs -m

5、显示IPC设施的详细信息

# ipcs -q -i id

id 对应shmid、semid、msgid等。-q对应设施的类型(队列),查看信号量详细情况使用-s,查看共享内存使用-m。

6、显示IPC设施的限制大小

# ipcs -m -l

-m对应设施类型,可选参数包括-q、-m、-s。

7、显示IPC设施的权限关系

# ipcs -c

# ipcs -m -c

# ipcs -q -c

# ipcs -s -c

8、显示最近访问过IPC设施的进程ID。

# ipcs -p

# ipcs -m -p

# ipcs -q -p

9、显示IPC设施的最后操作时间

# ipcs -t

# ipcs -q -t

# ipcs -m -t

# ipcs -s -t

10、显示IPC设施的当前状态

linuxidc@linuxidc:~/linuxidc.com$ ipcs -u

---------- 消息状态 -----------

已分配队列数 = 0

已用消息头(header)数 = 0

已用空间 = 0 字节

---------- 共享内存状态 ------------

段已分配 11

页已分配 27256

页驻留  7083

页交换  0

交换性能:0 次尝试  0 次成功

--------- 信号量状态 -----------

已使用数组 = 0

已分配信号量数 = 0

Linux上的ipcs命令,不支持UNIX上的-b、-o指令,同样UNIX中不支持-l、-u指令,所以在编写跨平台的脚本时,需要注意这个问题。

删除IPC

ipcrm -m| -q| -s shm_id

例如,我们在以0x12345678为KEY创建了一个共享内存,可以直接使用ipcrm -M 0x12345678来删除共享内存区域。

下面的命令可以释放所有已分配的共享内存:

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

原文链接:https://www.linuxidc.com/Linux/2019-04/157862.htm

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Linux内存管理之mmap详解

    作者:freeboy1015 来源:http://lib.csdn.net/article/linux/62126 一. mmap系统调用 1. mmap系统调...

    小小科
  • Linux内存管理之mmap详解

    来源:http://lib.csdn.net/article/linux/62126

    小小科
  • 详解Linux内核内存管理架构

    内存管理子系统可能是linux内核中最为复杂的一个子系统,其支持的功能需求众多,如页面映射、页面分配、页面回收、页面交换、冷热页面、紧急页面、页面碎片管理、页面...

    砸漏
  • PHP共享内存详解 前言

    Ticks是从PHP 4.0.3开始才加入到PHP中的,它是一个在declare代码段中解释器每执行N条低级语句就会发生的事件。N的值是在declare中的di...

    sunsky
  • 分享丨C/C++内存管理详解--堆、栈

    因此要想成为C++高手,内存管理一关是必须要过的,除非放弃C++,转到Java或者.NET,他们的内存管理基本是自动的,当然你也放弃了自由和对内存的支配权,还放...

    一头小山猪
  • 一文搞定 | Linux 共享内存原理

    在Linux系统中,每个进程都有独立的虚拟内存空间,也就是说不同的进程访问同一段虚拟内存地址所得到的数据是不一样的,这是因为不同进程相同的虚拟内存地址会映射到不...

    杰哥的IT之旅
  • 一文搞定 | Linux共享内存原理

    在Linux系统中,每个进程都有独立的虚拟内存空间,也就是说不同的进程访问同一段虚拟内存地址所得到的数据是不一样的,这是因为不同进程相同的虚拟内存地址会映射到不...

    刘盼
  • Swift 内存管理详解

    Swift内存管理: Swift 和 OC 用的都是ARC的内存管理机制,它们通过 ARC 可以很好的管理对象的回收,大部分的时候,程序猿无需关心 Swift...

    Mr.RisingSun
  • 解决Linux system v 共享内存问题

    非NULL:自己用malloc开辟一个空间,让共享内存shmid和这个地址关联上。但是如果不是4K的整数倍,内核会向上或者向下调整。

    砸漏
  • Win3内存管理之私有内存跟共享内存的申请与释放

      通过上一篇文章.我们理解了虚拟内存与物理内存的区别. 那么我们有API事专门申请虚拟内存与物理内存的.

    IBinary
  • Swift 中的内存管理详解

    这篇文章是在阅读《The Swift Programming Language》Automatic Reference Counting(ARC,自动引用计数)...

    哲洛不闹
  • Android内存管理(四)Linux的内存管理机制

    linux内存管理卷帙浩繁,本文只能层层递进地带你领略冰山轮廓,通过本文你将了解到以下内容:

    Anymarvel
  • iOS 内存管理的理解分享(理论篇)

    大壮
  • 宋宝华:世上最好的共享内存(Linux共享内存最透彻的一篇)

    早期的共享内存,着重于强调把同一片内存,map到多个进程的虚拟地址空间(在相应进程找到一个VMA区域),以便于CPU可以在各个进程访问到这片内存。

    Linux阅码场
  • Java内存管理原理及内存区域详解

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间。Java虚拟机所管理的内存将会包...

    哲洛不闹
  • Java内存管理原理及内存区域详解

    Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干不同的数据区域,这些区域都有各自的用途以及创建和销毁的时间。Java虚拟机所管理的内存将会包...

    哲洛不闹
  • Linux的内存共享映射(mmap和munmap)

           Linux下的进程间通信也可以使用mmap的内存共享映射来实现,mmap的作用就是把磁盘文件的一部分直接映射到进程的内存中,那么进程就可以直接对该...

    Ch_Zaqdt
  • 物理内存管理之zone详解

    上一次说过了物理内存由node,zone,page三级结构来描述。而node是根据当前的系统是NUMA还是UMA系统。假设我们当前是UMA系统架构,则只有一个n...

    DragonKingZhu
  • ARC内存管理机制详解

            ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic ...

    lizelu

扫码关注云+社区

领取腾讯云代金券