进程 共享内存 linux?Linux共享内存

大家好,关于进程 共享内存 linux很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于Linux共享内存的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

linux查看共享内存命令

共享内存查看

使用ipcs命令,不加如何参数时,会把共享内存、信号量、消息队列的信息都打印出来,如果只想显示共享内存信息,使用如下命令:

[root@localhost~]# ipcs-m

------ Shared Memory Segments--------

key shmid owner perms bytes nattch status

0x00000000 1867776 root 600 393216 2 dest

0x00000000 1900545 root 600 393216 2 dest

0x00030021 1703938 zc 666 131104 1

0x0003802e 1736707 zc 666 131104 1

0x00030004 1769476 zc 666 131104 1

0x00038002 1802245 zc 666 131104 1

0x00000000 1933318 root 600 393216 2 dest

0x00000000 1966087 root 600 393216 2 dest

0x00000000 1998856 root 600 393216 2 dest

0x00000000 2031625 root 600 393216 2 dest

0x00000000 2064394 root 600 393216 2 dest

0x0014350c 2261003 cs 666 33554432 2

0x00000000 2129932 root 600 393216 2 dest

0x00000000 2162701 root 600 393216 2 dest

0x00143511 395837454 root 666 1048576 1

其中:

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

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

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

第四列就是权限perms;

第五列为创建的大小bytes;

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

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

linux共享内存使用的过程

Linux共享内存使用的过程?

一、什么是共享内存

顾名思义,共享内存就是允许两个不相关的进程访问同一个逻辑内存。共享内存是在两个正在运行的进程之间共享和传递数据的一种非常有效的方式。不同进程之间共享的内存通常安排为同一段物理内存。进程可以将同一段共享内存连接到它们自己的地址空间中,所有进程都可以访问共享内存中的地址,就好像它们是由用C语言函数malloc分配的内存一样。而如果某个进程向共享内存写入数据,所做的改动将立即影响到可以访问同一段共享内存的任何其他进程。

特别提醒:共享内存并未提供同步机制,也就是说,在第一个进程结束对共享内存的写操作之前,并无自动机制可以阻止第二个进程开始对它进行读取。所以我们通常需要用其他的机制来同步对共享内存的访问,例如前面说到的信号量。

二、共享内存的使用

与信号量一样,在Linux中也提供了一组函数接口用于使用共享内存,而且使用共享共存的接口还与信号量的非常相似,而且比使用信号量的接口来得简单。它们声明在头文件 sys/shm.h中。

1、shmget函数

该函数用来创建共享内存,它的原型为:

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

第一个参数,与信号量的semget函数一样,程序需要提供一个参数key(非0整数),它有效地为共享内存段命名,shmget函数成功时返回一个与key相关的共享内存标识符(非负整数),用于后续的共享内存函数。调用失败返回-1.

不相关的进程可以通过该函数的返回值访问同一共享内存,它代表程序可能要使用的某个资源,程序对所有共享内存的访问都是间接的,程序先通过调用shmget函数并提供一个键,再由系统生成一个相应的共享内存标识符(shmget函数的返回值),只有shmget函数才直接使用信号量键,所有其他的信号量函数使用由semget函数返回的信号量标识符。

第二个参数,size以字节为单位指定需要共享的内存容量

第三个参数,shmflg是权限标志,它的作用与open函数的mode参数一样,如果要想在key标识的共享内存不存在时,创建它的话,可以与IPC_CREAT做或操作。共享内存的权限标志与文件的读写权限一样,举例来说,0644,它表示允许一个进程创建的共享内存被内存创建者所拥有的进程向共享内存读取和写入数据,同时其他用户创建的进程只能读取共享内存。

linux共享内存分配

在Linux系统中,进程通过调用 shmget(共享内存获取)函数来申请一块可以供多个进程共享的内存区域。这个函数的使用需要三个关键参数。

首先,第一个参数是一个唯一的键值,用于标识共享内存。为了创建一个独占的内存块,进程可以使用IPC_PRIVATE常量作为键值。然而,如果其他进程也选择相同的键值,可能会导致冲突。通过指定一个已存在的键值,进程可以访问已存在的共享内存块,前提是权限允许。

第二个参数是所请求内存的大小。系统会以页面大小为单位进行分配,所以实际分配的内存大小会是页面大小的整数倍。这意味着,即使请求的大小不是页面的整数倍,也会向上取整分配。

第三个参数是一组标志,通过按位或操作来控制共享内存的行为。IPC_CREAT标志用于创建新的共享内存块,如果键值已被占用,只有当同时使用IPC_EXCL标志时,函数才会失败并拒绝创建。IPC_EXCL可以确保进程获得的是一个独占的内存块,而非共享现有资源。

权限控制由模式标志(通常由S_IRUSR, S_IWUSR, S_IROTH, S_IWOTH等常量组合)完成,这些标志决定了属主、属组和其他用户对内存块的访问权限。例如,S_IRUSR和S_IWUSR允许属主读写,S_IROTH和S_IWOTH则允许其他用户只读或只写。在创建共享内存时,可以设置这些标志来限制访问权限。

如果shmget调用成功,它会返回一个标识符,用于后续对共享内存的操作。如果内存块已存在,系统会检查权限和销毁标记。这样,进程就能有效地管理和共享内存资源。

阅读剩余
THE END