Linux中systemv共享内存

目录

1.原理

2.接口

1.shmget(share_memory_get获得共享内存)

2.ftok

3.shmat(share_memory_attaintion挂接到物理内存上)

4.key和shmid的区别

[5.ipc 指令](#5.ipc 指令)

6.shmdt函数(share_memory_detach取消挂接)

7.shmctl函数(share_memory_contrl)

1.cmd参数

3.代码呈现

4.谈谈优缺点

5.共享内存的属性

6.利用管道来优化共享内存


1.原理

进程间通信的本质就是:让不同的进程看到同一份资源。(和匿名通道和命名通道一样的道理)

共享内存一样需要内核结构体描述它,再组织。

2.接口

1.shmget(share_memory_get获得共享内存)

这边的size最好是4096(4KB)的整数倍,学过内存分配的知道,一般给物理内存分配的资源都是4kb的分配的,即使你要1字节,也会开辟4kb的内存。

但是我们看到这个函数,我们就会发问题了,key哪里来?所以我们在创建一个共享内存时,要先创建一个key值出来!

2.ftok

这两个形参是由用户自己规定。

3.shmat(share_memory_attaintion挂接到物理内存上)

题外:我们C语言中malloc开辟内存,其实只是在页表上开辟的内存,当代码运行到用这个内存的时候,发生缺页中断,才会在物理内存上开辟。

我们上面shmget是在物理内存上开辟共享内存空间,但是我们需要从页表和物理内存上建立联系,才能真正用到这上面!

其中shmaddr是在进程地址空间共享区的具体位置,但是我们不知道,就直接默认nullptr就好了,shmflg一样0就好了。

4.key和shmid的区别

5.ipc 指令

当完成上述函数,共享内存其实已经创建出来了,当然是由函数来删除这个共享内存的,但我现在想先将一下linux的指令,是如何查看和删除的。

6.shmdt函数(share_memory_detach取消挂接)

有挂接到物理内存,那就有取消,下面最后一个函数,一样道理,是取消共享内存!

7.shmctl函数(share_memory_contrl)

1.cmd参数

shmid_ds结构体下面属性会讲。

3.代码呈现

log.txt的日志代码在:Linux命名管道-CSDN博客有说。

comm.hpp

processa.cc

processb.cc

代码运行结果:

4.谈谈优缺点

1.共享内存没有像管道那样的同步互斥之类的保护机制。

2.共享内存是所有进程间通信速度最快的,因为他拷贝少,直接读取内存,而通信则需要在自己的用户层缓冲区(数组)先拷贝,再拷贝到管道上,在从管道拷贝到另一个用户层缓冲区。

3.共享内存内部的数据,有自己维护。

5.共享内存的属性

6.利用管道来优化共享内存

相关推荐
轻揉小乔 真新人几秒前
T-SQL查询进阶—理解SQL Server中的锁
服务器·数据库·sql
各类产品分享16 分钟前
电力行业AR智能运维哪个品牌好
运维·ar·ar巡检
Dlrb121127 分钟前
Linux驱动---sys文件系统自动添加设备节点、添加调试节点以及MISC设备驱动的解释
linux·imx6ull·misc·设备节点·sys文件系统
贾天佑忆月 迷失的昵41 分钟前
客户端与服务器持续同步解析(轮询,comet,WebSocket)
运维·服务器·websocket
刘某的Cloud44 分钟前
Galera Cluster mariadb 生产环境常见问题排查与运维指南
linux·运维·数据库·mariadb·集群高可用
70asunflower1 小时前
Linux 性能排查分析完全教程
linux·运维
兵bing2 小时前
Docker Compose 配置文件归纳总结-千问
运维·docker·容器
dok122 小时前
Johannes 《Linux内核模块与设备驱动开发:编写Linux驱动程序》 (11)kmalloc 动态内存分配和struct file中的私有数据
linux·驱动开发·算法
IT小盘3 小时前
17-构建Prompt测试集-提示词优化不再凭感觉
服务器·windows·prompt
INNOVIX稳石机器人3 小时前
从“存得下”到“管得活”:稳石四向穿梭车如何重塑密集仓储新逻辑?
大数据·运维