【Linux】system V 共享内存(上)

简介: 【Linux】system V 共享内存

system V

system V 是一套标准,独立于文件系统之外的,专门为了通信设计出来的模块

让两个毫不相关的进程看到同一份资源

1. 共享内存原理

第一阶段原理

b71b0658f8c64047999c4faf628da2d2.png

进程A和进程B都通过自己的页表映射到物理内存中的特定区域,进而找到该进程匹配的代码和数据

为了让进程A和进程B通信,前提是两者要看到同一份资源

假设在物理内存上开辟一块空间

进程A和进程B在自己的地址空间中都有自己的共享区

想办法把物理内存中新开辟空间 通过页表 映射到 进程A和进程B的共享区中

把地址空间的起始地址返回给用户

进程A和进程B就可以通过起始的虚拟地址,对应页表访问到内存

就完成了让进程A和进程B看到同一份资源,这份资源就被称为共享内存


第二阶段原理


5502b17ebf7f465882ed4f7bbb1c0c5d.png

系统中可以用ssh进行通信 ,是不是只能有一对进程使用共享内存呢?

可以,其他进程也可以通信

所以在任何时刻,可能有多个共享内存在被使用

系统中一定会存在很多共享内存同时存在

操作系统要不要整体管理所有的共享内存呢?要

操作性系统如何管理多个共享内存呢?

先描述,在组织

并不是在内存中开辟空间即可,系统为了管理共享内存,构建对应的描述共享内存的结构体对象

共享内存=共享内存的内核数据结构(伪代码:struct shm)+真正开辟的内存空间


2. 直接写代码–编写代码进行原理介绍


打开vscode,创建文件client.cc和server.cc(后缀为cc说明是c++)的文件

创建公共路径 comm.hpp

shmget函数

创建共享路径接口 ,输入 man shmget 查看


d22bc459d6d744fa8bf95e5a8ff4fead.png

申请一个 系统V的共享内存块

如果创建成功,则会返回共享内存标识符,失败返回-1

size代表申请内存块的大小

shmflg代表 选项

有两个最常用的选项,IPC_CREAT IPC_EXCL

转到定义就可以发现其实这两个都是宏

158e33b4777a48c8a9f3d512ab338b8e.png

若单独使用 IPC_CREAT :创建一个共享内存,如果共享内存不存在,就创建之,如果已经存在,就获取已经存在的共享内存并返回

IPC_EXCL不能单独使用 ,一般都要配合 IPC_CREAT

若要将两个选项同时传进去 IPC_CREAT | IPC_EXCL

两个选项同时用: 创建一个共享内存,如果共享内存不存在,就创建之,如果已经存在,则立马出错返回

如果创建成功,对应的共享内存一定是最新的


获取共享内存时,需要有一个key值


ftok函数

输入 man ftok

0d325f7de31443818c9699252ce210d8.png

根据路径和项目id进行算法结合,形成一个冲突概率低的key值

失败就返回-1,成功返回key值

key值用法

假设进程A创建了一个共享内存,但是进程B怎么知道那个共享内存是创建的吗?

就需要借助上述提到的 ftok 函数

49abb96e28f24d0e9b95ed095c5f4f87.png


c3a1ccf6913149fcac0bbad49fd67325.png

刚开始约定好 A和B用同样的路径字符串和项目id

借助A形成一个key值,将key值放入A创建的共享内存描述结构体中

此时B也形成一个相同的key值,通过寻找key值来找到A所创建的共享内存


pathname 代表 用户自己设定的路径字符串

proj_id 代表 项目id

key值意义为

让创建共享内存的进程可以给新共享内存设置key值

让获取共享内存的进程 通过key值 去找特定匹配的共享内存


相关文章
|
9月前
|
缓存 Linux
linux 手动释放内存
在 Linux 系统中,内存管理通常自动处理,但业务繁忙时缓存占用过多可能导致内存不足,影响性能。此时可在业务闲时手动释放内存。
421 17
|
5月前
|
缓存 Linux 数据安全/隐私保护
Linux环境下如何通过手动调用drop_caches命令释放内存
总的来说,记录住“drop_caches” 命令并理解其含义,可以让你在日常使用Linux的过程中更加娴熟和自如。
1028 23
|
7月前
|
监控 Linux Python
Linux系统资源管理:多角度查看内存使用情况。
要知道,透过内存管理的窗口,我们可以洞察到Linux系统运行的真实身姿,如同解剖学家透过微观镜,洞察生命的奥秘。记住,不要惧怕那些高深的命令和参数,他们只是你掌握系统"魔法棒"的钥匙,熟练掌握后,你就可以骄傲地说:Linux,我来了!
235 27
|
8月前
|
消息中间件 Linux
Linux中的System V通信标准--共享内存、消息队列以及信号量
希望本文能帮助您更好地理解和应用System V IPC机制,构建高效的Linux应用程序。
278 48
|
8月前
|
缓存 NoSQL Linux
Linux系统内存使用优化技巧
交换空间(Swap)的优化 禁用 Swap sudo swapoff -a 作用:这个命令会禁用系统中所有的 Swap 空间。swapoff 命令用于关闭 Swap 空间,-a 参数表示关闭 /etc/fstab 文件中配置的所有 Swap 空间。 使用场景:在高性能应用场景下,比如数据库服务器或高性能计算服务器,禁用 Swap 可以减少磁盘 I/O,提高系统性能。
294 3
|
8月前
|
缓存 Linux
Linux查看内存命令
1. free free命令是最常用的查看内存使用情况的命令。它显示系统的总内存、已使用内存、空闲内存和交换内存的总量。 free -h • -h 选项:以易读的格式(如GB、MB)显示内存大小。 输出示例: total used free shared buff/cache available Mem: 15Gi 4.7Gi 4.1Gi 288Mi 6.6Gi 9.9Gi Swap: 2.0Gi 0B 2.0Gi • to
578 2
|
9月前
|
消息中间件 Linux
Linux:进程间通信(共享内存详细讲解以及小项目使用和相关指令、消息队列、信号量)
通过上述讲解和代码示例,您可以理解和实现Linux系统中的进程间通信机制,包括共享内存、消息队列和信号量。这些机制在实际开发中非常重要,能够提高系统的并发处理能力和数据通信效率。希望本文能为您的学习和开发提供实用的指导和帮助。
620 20
|
10月前
|
Linux
【Linux】System V信号量详解以及semget()、semctl()和semop()函数讲解
System V信号量的概念及其在Linux中的使用,包括 `semget()`、`semctl()`和 `semop()`函数的具体使用方法。通过实际代码示例,演示了如何创建、初始化和使用信号量进行进程间同步。掌握这些知识,可以有效解决多进程编程中的同步问题,提高程序的可靠性和稳定性。
452 19
|
10月前
|
算法 Linux
深入探索Linux内核的内存管理机制
本文旨在为读者提供对Linux操作系统内核中内存管理机制的深入理解。通过探讨Linux内核如何高效地分配、回收和优化内存资源,我们揭示了这一复杂系统背后的原理及其对系统性能的影响。不同于常规的摘要,本文将直接进入主题,不包含背景信息或研究目的等标准部分,而是专注于技术细节和实际操作。
|
3月前
|
存储
阿里云轻量应用服务器收费标准价格表:200Mbps带宽、CPU内存及存储配置详解
阿里云香港轻量应用服务器,200Mbps带宽,免备案,支持多IP及国际线路,月租25元起,年付享8.5折优惠,适用于网站、应用等多种场景。
833 0