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

相关推荐
小yu爱学习5 小时前
2026大专区块链技术应用专业考什么证?
运维·服务器·区块链
XH-hui5 小时前
【打靶日记】VluNyx 之 Hat
linux·网络安全·vulnyx
RisunJan5 小时前
Linux命令-fping命令(网络诊断工具)
linux·网络
BD_Marathon5 小时前
【Zookeeper】Zookeeper内部的数据模型
linux·分布式·zookeeper
咕噜签名-铁蛋5 小时前
云服务器给我们生活带来了什么影响力
运维·服务器·生活
遇到困难睡大觉哈哈5 小时前
Harmony os LazyForEach:数据懒加载详解
服务器·网络·windows·harmonyos·鸿蒙
繁华似锦respect5 小时前
C++ 无锁队列(Lock-Free Queue)详细介绍
linux·开发语言·c++·windows·visual studio
qq_433192185 小时前
Linux ISCSI服务器配置
linux·服务器·数据库
python百炼成钢5 小时前
47.Linux UART 驱动
linux·运维·服务器·驱动开发
w***15315 小时前
四、nginx的优化和location匹配规则
运维·nginx