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

相关推荐
weixin_4426434212 分钟前
推荐FileLink数据跨网摆渡系统 — 安全、高效的数据传输解决方案
服务器·网络·安全·filelink数据摆渡系统
Karoku06630 分钟前
【企业级分布式系统】Zabbix监控系统与部署安装
运维·服务器·数据库·redis·mysql·zabbix
为什么这亚子33 分钟前
九、Go语言快速入门之map
运维·开发语言·后端·算法·云原生·golang·云计算
半桶水专家35 分钟前
用go实现创建WebSocket服务器
服务器·websocket·golang
布值倒区什么name1 小时前
bug日常记录responded with a status of 413 (Request Entity Too Large)
运维·服务器·bug
孤客网络科技工作室1 小时前
VMware 虚拟机使用教程及 Kali Linux 安装指南
linux·虚拟机·kali linux
。puppy2 小时前
HCIP--3实验- 链路聚合,VLAN间通讯,Super VLAN,MSTP,VRRPip配置,OSPF(静态路由,环回,缺省,空接口),NAT
运维·服务器
颇有几分姿色2 小时前
深入理解 Linux 内存管理:free 命令详解
linux·运维·服务器
光芒再现dev2 小时前
已解决,部署GPTSoVITS报错‘AsyncRequest‘ object has no attribute ‘_json_response_data‘
运维·python·gpt·语言模型·自然语言处理
AndyFrank2 小时前
mac crontab 不能使用问题简记
linux·运维·macos