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.利用管道来优化共享内存

相关推荐
一个在高校打杂的4 分钟前
honeypot之opencanary(轻量化蜜罐)
linux·网络安全·网络攻击模型·安全威胁分析·策略模式
大明者省5 分钟前
Ubuntu22.04 宝塔面板与 XFCE 远程桌面端口兼容性分析
运维·服务器·数据库·笔记
s_w.h11 分钟前
【 linux 】认识make和makefile
linux·运维·bash
代码熬夜敲Q14 分钟前
Docker基础
运维·docker·容器
不怕犯错,就怕不做22 分钟前
ARM设备异常断电容易造成数据损坏,硬件如何设计
linux·驱动开发·嵌入式硬件
Harm灬小海26 分钟前
【云计算学习之路】学习Centos7系统-Linux软件包管理
linux·运维·服务器·学习·云计算·yum·rpm
1892280486128 分钟前
NY379固态MT29F32T08GSLBHL8-36QA:B
大数据·服务器·人工智能·科技·缓存
caicai_xiaobai29 分钟前
Ubuntu上Git安装步骤
linux·git·ubuntu
平行云39 分钟前
实时云渲染平台数据通道,支持3D应用文件上传下载分享无缝交互
linux·unity·云原生·ue5·gpu算力·实时云渲染·像素流送
谪星·阿凯1 小时前
Linux提权全攻略博客
linux·运维·服务器·网络安全