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

SystemV共享内存

一、原理

申请:与共享库类似,OS先在共享区开辟/申请一段共享内存,然后通过页表映射,挂接到进程地址空间,返回这块内存的首地址,使得不同进程能访问同一份资源。

释放:去关联+释放共享内存

一个进程可以有多块共享内存,一块共享内存可以被多个进程使用,需要相应管理的struct。

二、shmget(shared memory)

1、key

判断该共享内存是否已经存在

ftok形成一个key

是一套算法,利用pathname和proj_id形成唯一标识的key,尽量保证不重复(冲突概率低的)

冲突时就会调用失败

2、生命周期随内核不随进程

ipcs -m查看所有的共享内存

ipcrm -m 释放共享内存 + shmid

nattch表示连接的进程数

3、perms权限

4、createShm和getShm封装

三、shmat(attach)

1、nattch

 while :; do ipcs -m | head -3 && ipcs -m | grep LZF;sleep 1;done;

四、shmdt(解除关联,不用杀进程)

五、shmctl控制

删除共享内存

六、建立2个进程通信过程

#include"comm.hpp"

int main()
{
    int shmid = CreateShm();
    log(Info,"Create Shm success");
    sleep(3);
    char* shmaddr = (char*)shmat(shmid,nullptr,0);
    log(Debug,"shmat success, shmaddr:0x%x",shmaddr);
    sleep(3);
    shmdt(shmaddr);
    log(Debug,"shmdt success,shmaddr:0x%x",shmaddr);
    sleep(5);
    //log(Info,"processa quit"); 
    shmctl(shmid,IPC_RMID,nullptr);
    log(Debug,"destroy shm done,shmaddr:0x%x",shmaddr);
    sleep(5);

    return 0;
}
#include"comm.hpp"

int main()
{
    int shmid = GetShm();

    char* shmaddr = (char*)shmat(shmid,nullptr,0);
    log(Debug,"shmat success, shmaddr:0x%x",shmaddr);
    sleep(3);
    shmdt(shmaddr);
    log(Debug,"shmdt success,shmaddr:0x%x",shmaddr);
    sleep(5);

    return 0;
}

七、利用共享内存实现进程间通信

直接往映射后的虚拟地址shmaddr写入和读取即可。

八、共享内存的特性

速度快---拷贝次数少

九、共享内存的属性

十、利用管道实现同步与互斥

attach后建立管道,写端写入共享内存后,向管道传一个字符,读端接收后,开始从共享内存中读取。

读端会阻塞,只用共享内存就会一直读。


http://www.kler.cn/news/134935.html

相关文章:

  • 一生一芯18——Chisel模板与Chisel工程构建
  • 安防视频监控平台EasyCVR服务器部署后出现报错,导致无法级联到域名服务器,该如何解决?
  • 数据结构——树状数组
  • 拜托!佛系点,你只是给社区打工而已
  • 设计模式(5)-使用设计模式实现简易版springIoc
  • 单链表相关面试题--3.给定一个带有头结点 head 的非空单链表,返回链表的中间结点。如果有两个中间结点,则返回第二个中间结点
  • Java的IO流-打印流
  • 【机器学习】特征工程:特征选择、数据降维、PCA
  • OpenCV C++ 图像 批处理 (批量调整尺寸、批量重命名)
  • 关于漏洞:检测到目标SSL证书已过期【原理扫描】
  • 自用函数(持续更新)
  • 数理统计的基本概念(一)
  • Selenium UI 自动化
  • Mapmost Alpha,一款非常好用且强大的三维城市创建工具~!
  • 反渗透水处理成套设备有哪些
  • 分享职业技术培训类型
  • HarmonyOS脚手架:快捷实现ArkTs中json转对象
  • Linux环境搭建(tomcat,jdk,mysql下载)
  • JS进阶——高阶技巧
  • 2 Redis的高级数据结构
  • 2024年测试工程师必看系列之fiddler设置手机端抓包全套教程
  • 为什么选择B+树作为数据库索引结构?
  • 前端常用utils方法持续更新中
  • 为什么同样是做测试,别人年薪30W+?我10k!!!
  • 采集淘宝天猫整店商品api(店铺列表、店铺所有商品)
  • Unity中 Start和Awake的区别
  • 医生ai数字人线上应用有效缓解了医疗资源不均的问题
  • buildadmin+tp8表格操作(7.1)表格的事件监听(el-table中的事件)
  • Arcgis js Api日常天坑问题3——加载geojson图层,元素无属性
  • rabbitMQ的direct模式的生产者与消费者使用案例