当前位置: 首页 > news >正文

Linux中的进程间通信之共享内存

共享内存

共享内存示意图

共享内存数据结构

struct shmid_ds {struct ipc_perm shm_perm; /* operation perms */int shm_segsz; /* size of segment (bytes) */__kernel_time_t shm_atime; /* last attach time */__kernel_time_t shm_dtime; /* last detach time */__kernel_time_t shm_ctime; /* last change time */__kernel_ipc_pid_t shm_cpid; /* pid of creator */__kernel_ipc_pid_t shm_lpid; /* pid of last operator */unsigned short shm_nattch; /* no. of current attaches */unsigned short shm_unused; /* compatibility */void *shm_unused2; /* ditto - used by DIPC */void *shm_unused3; /* unused */
};

共享内存函数

shmget函数

功能:用来创建共享内存
原型int shmget(key_t key, size_t size, int shmflg);
参数key:这个共享内存段名字---> 为了进行唯一性标识size:共享内存大小shmflg:由九个权限标志构成,它们的用法和创建文件时使用的mode模式标志是一样的
返回值:成功返回一个非负整数,即该共享内存段的标识码;失败返回-1
shmflg:

IPC_CREAT:如何存在就获取,不存在就创建

IPC_EXEL:无法单独使用

IPC_CREAT|IPC_EXEL:不存在就创建,如何存在就出错返回

ftok
#include <sys/types.h>
#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);
key_t k=getKey();printf("key: 0x%x\n",k);int shmid=createShm(k);printf("shmid: %d\n",shmid);

key: 0x66053050
shmid: 65595

共享内存=物理内存块+共享内存相关属性

ipcs -m

查看共享内存

共享内存的生命周期是随OS的,不是随进程的。

ipcrm -m shmid

删除共享内存

shmctl函数

功能:用于控制共享内存
原型int shmctl(int shmid, int cmd, struct shmid_ds *buf);
参数shmid:由shmget返回的共享内存标识码cmd:将要采取的动作(有三个可取值)buf:指向一个保存着共享内存的模式状态和访问权限的数据结构
返回值:成功返回0;失败返回-1

监视共享内存:

while :; do ipcs -m; sleep 1; echo "---------------------"; done

shmat函数

让共享内存和进程关联起来

功能:将共享内存段连接到进程地址空间
原型void *shmat(int shmid, const void *shmaddr, int shmflg);
参数shmid: 共享内存标识shmaddr:指定连接的地址shmflg:它的两个可能取值是SHM_RND和SHM_RDONLY
返回值:成功返回一个指针,指向共享内存第一个节;失败返回-1

共享内存的优点:速度最快,能大大减少拷贝次数。

共享内存的缺点:没有同步和互斥的操作,没有对数据做保护

共享内存大小一般为4KB(page)的整数被,4KB是内存划分的基本单位

同样的代码使用共享内存和管道,考虑键盘输入和显示器输出,二者各有几次数据拷贝?

管道需要经历6次拷贝(去除cin的话为4次)

共享内存需要经历4次拷贝(去除cin的话为2次)

http://www.lryc.cn/news/452164.html

相关文章:

  • 第18周 3-过滤器
  • Linux之进程概念
  • 小程序-使用npm包
  • 【springboot】整合沙箱支付
  • 技术速递|Python in Visual Studio Code 2024年9月发布
  • 数据结构-3.5.队列的顺序实现
  • preconnect 预解析
  • Leecode热题100-283.移动零
  • 如何高效使用Prompt与AI大模型对话
  • Java 之深入理解 String、StringBuilder、StringBuffer
  • vue3项目执行pnpm update后还原package.json文件后运行报错
  • 蓝桥杯【物联网】零基础到国奖之路:十七. 扩展模块之单路ADC和NE555
  • SolveigMM Video Splitter方便快捷视频分割合并软件 V3.6.1309.3-供大家学习研究参考
  • Unity3D 创建一个人物,实现人物的移动
  • 【笔记】数据结构12
  • django的URL配置
  • 精华帖分享 | 因子构建思考1
  • kubernetes笔记(四)
  • 通信工程学习:什么是SNMP简单网络管理协议
  • ubuntu20.04系统下,c++图形库Matplot++配置
  • [激光原理与应用-126]:南京科耐激光-激光焊接 - 焊中无损检测技术 - 智能制程监测系统IPM介绍 - 26- 频域分析法
  • 深入理解 Solidity 修饰符(Modifier):功能、应用与最佳实践
  • YOLO11项目实战1:道路缺陷检测系统设计【Python源码+数据集+运行演示】
  • 怎么屏蔽统计系统统计到的虚假ip
  • 前端开发设计模式——策略模式
  • SysML案例-潜艇
  • 车辆重识别(2020NIPS去噪扩散概率模型)论文阅读2024/9/27
  • 基于深度学习的任务序列中的快速适应
  • 虚拟机三种网络模式详解
  • [leetcode]674_最长连续递增序列