波奇学Linux:共享内存

进程通信的前提:不同的进程看到同一份的资源

直接原理:同一块物理内存映射到不同进程的共享区

共享内存拆解:

1.申请内存,通过页表映射到进程地址空间

2.返回首地址,便于进程利用

3.释放共享内存,去关联

4.内存的申请必须要系统调用,确保空间不是私有的

5.利用先管理再组织,不难猜到内核有个struct结构体管理起来

申请共享内存系统调用接口

size_t 创建共享内存大小单位是字节,返回值为共享内存标识符,失败返回-1

shmflg参数选项:IPC_CREAT:如果存在返回,不存在就创建

IPC_CREAT|IPC_EXCL : 不存在就创建,存在就出错返回,保证申请的共享内存一个是新的

IPC_EXCL:不单独使用

参数key:作为某一块共享内存的标识符,拿到同一个key就可以看到同一块内存,key存在struct描述对象中

利用路径和项目id创建一个唯一key 用于申请共享内存

路径本身就具有唯一性!

实际运用时并不是直接拿到key,而是拿到pathname 和 proj_id

key vs shmid

key创建共享内存的参数,shmid 函数shmget的返回值

key操作系统内定唯一性 shmid只在进程内,表示资源唯一性

查看共享资源

当进程结束时,用户不主动关闭,共享内存依然存在,除非内核重启。

删除共享内存

ipcrm -m shmid

key是系统使用的,shmid是用户层使用。

挂接共享内存到地址空间:建立进程和共享空间的关系

返回值void* 共享空间在地址空间的虚拟地址

shmid:共享内存描述符

shamddr:挂接的地址 系统决定

shmflg:挂接的权限 保持权限不变,设为0

char* shamddr=(char*)shmat(shmid,nullptr,0);

 

 nattch等于1,表示有一个挂载当进程结束时会自动结束挂载,或者调用shmdt函数在进程就能结束挂载

shmdt(shamddr);

在进程中删掉共享内存

共享内存的属性由struct ipc_perm保存,猜测涉及到管理共享内存

cmd参数选项对共享内存的操作

shmctl(shmid,IPC_RMID,nullptr);

进程通过共享内存通信 

当两个进程同时挂接到共享内存时,两个进程实现通信。共享内存被挂载到进程的的地址空间,直接在进程中通过虚拟地址访问。

comm.hpp代码

#ifndef __COMM_HPP__
#define __COMM_HPP__

#include<iostream>
#include<string>
#include<sys/ipc.h>
#include<cstring>
#include<sys/shm.h>
#include<sys/types.h>
#include"log.hpp"
using namespace std;
//共享内存大小一般建议4096的整数倍 1024字节=1kb
const int size=4096;
const string pathname="/home/boki";
const int proj_id=0x8888;
Log log;

//获取key
//将GetKey和GetShoareMem都放在同一个头文件中保证获得的key相同
key_t GetKey()
{
    key_t k=ftok(pathname.c_str(),proj_id);
    if(k==-1)
    {
        log(Fatal,"ftok error: %s",strerror(errno));
        exit(1);
    }
    log(Info,"ftok success,key is : %d",k);
    return k;
}

int GetShareMemHelper(int flag)
{
    key_t k=GetKey();
    int shmid=shmget(k,size,flag);
    if(shmid<0)
    {
        log(Fatal,"creat share memory error: %s",strerror(errno));
        exit(2);
    }
    log(Info,"create share memory success, shmid: %d",shmid);
    return shmid;
}
int CreateShm()
{
    return GetShareMemHelper(IPC_CREAT|IPC_EXCL|0666);
}
int GetShm()
{
    return GetShareMemHelper(IPC_CREAT);
}
#endif

process.a代码

#include "comm.hpp"

using namespace std;
int main()
{
    // 创建共享内存

    int shmid=CreateShm();

    //共享内存挂接到进程
    char* shamddr=(char*)shmat(shmid,nullptr,0);
    while(true)
    {
        cout<<"client say@"<<shamddr<<endl;
        sleep(1);
    }
    //删除挂接关系
    shmdt(shamddr);

    //删除共享内存
    shmctl(shmid,IPC_RMID,nullptr);
    return 0;
}

process.b代码

#include "comm.hpp"

using namespace std;
int main()
{
    // 创建共享内存

    int shmid=GetShm();
    
    //共享内存挂接到进程
    char* shamddr=(char*)shmat(shmid,nullptr,0);
    // ipc code
    while(true)
    {
        char buffer[1024];
        cout<<"Please Enter@ ";
        fgets(shamddr,4096,stdin);
    }
    //删除挂接关系
    shmdt(shamddr);
    return 0;
}

效果

 

此时可以把shamddr看成malloc返回的地址,且通信过程不再需要系统调用。

共享内存的机制特点

共享内存没有同步互斥保护机制:

          管道文件读端会阻塞等到写端打开,而共享内存两端各自独立

共享内存是所有的进程通信中,速度最快的:

        拷贝少,管道通信至少拷贝4次,用户-缓冲区-内核-缓冲区-屏幕

共享内存内部的数据,由自己保护

查看共享内存属性

内存文件同步互斥保护机制

通过管道的机制,每次写入信息到共享内存时,向管道传入符号,另一端管道文件接收到特殊符号,才允许从内存中读取。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/418819.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

手机AI摄影时代开启,传音引领行业标准化建设

今年春节&#xff0c;AI摄影可谓大出风头。人们在社交平台晒出自己在龙年的AI写真&#xff0c;极大地增添了节日的氛围感&#xff0c;也让我们看到了“AI摄影”的价值。新年伊始&#xff0c;手机巨头们纷纷布局该赛道&#xff0c;基于AI大模型实现的影像功能成为业界关注焦点。…

c语言 广度优先搜索(Breadth-First Search,BFS)

广度优先搜索&#xff08;Breadth-First Search&#xff0c;BFS&#xff09;是一种图遍历算法&#xff0c;通常用于搜索或遍历树和图等数据结构。其基本思想是先访问起始顶点&#xff0c;然后逐层遍历其相邻的顶点&#xff0c;直到找到目标顶点或遍历完所有顶点。 BFS通常使用…

c++面试三 -- 智能指针--7000字

一、智能指针 C 中的智能指针是一种用于管理动态分配的内存的对象&#xff0c;它们可以自动进行内存管理&#xff0c;避免内存泄漏和悬挂指针等问题。 1. 悬挂指针 悬挂指针&#xff08;dangling pointer&#xff09;是指在程序中仍然存在但已经不再指向有效内存地址的指针。悬…

深入理解nginx的https sni机制

目录 1. 概述2. 初识sni3. nginx的ssl证书配置指令3.1 ssl_certificate3.2 ssl_certificate_key3.3 ssl_password_file4. nginx源码分析4.1 给ssl上下文的初始化4.2 连接初始化4.3 处理sni回调4.2 动态证书的加载5. 总结阅读姊妹篇: 深入理解nginx的https alpn机制 1. 概述 SN…

FreeRTOS 其它知识点

目录 一、低功耗Tickless模式 1、低功耗Tickless模式的引入 2、Tickless 具体实现 二、空闲任务 1、空闲任务相关知识点 2、钩子函数 3、空闲任务钩子函数 三、使用RTOS的好处 一、低功耗Tickless模式 1、低功耗Tickless模式的引入 FreeRTOS 的系统时钟是由滴答定时器中…

数字孪生与智慧交通的融合发展:推动交通行业数字化转型,构建智慧城市新生态

随着信息技术的快速发展和城市化进程的深入推进&#xff0c;交通行业正面临着前所未有的机遇与挑战。传统的交通管理模式已难以满足日益增长的交通需求&#xff0c;而数字化转型则成为了推动交通行业创新发展的必由之路。数字孪生技术作为一种前沿的信息技术手段&#xff0c;为…

LIS(最长上升子序列, 合唱队形)

最长上升子序列 直接使用动态规划&#xff1a; 这个题目的关键就是在于我们选定一个数&#xff0c;然后利用这个数作为标准和这个数之前的所有数进行比较&#xff0c;如果比前面某一个数要大&#xff0c;那么就需要将这数自己本身的现存的最长长度与比较出来的数的最长加一&am…

【iOS ARKit】RealityKit 同步机制

协作 Session 可以很方便地实现多用户之间的AR体验实时共享&#xff0c;但开发者需要自行负责并确保AR场景的完整性&#xff0c;自行负责虚拟物体的创建与销毁。为简化同步操作&#xff0c;RealityKit 内建了同步机制&#xff0c;RealityKit 同步机制基于 Multipeer Connectivi…

Java核心卷一 · 笔记04

C++ type_info 类的使用 在 C++ 中,type_info 类是一个标准库提供的用于运行时类型信息的类。它定义在 <typeinfo> 头文件中,并用于获取和比较类型信息。下面是一些使用 type_info 类的常见操作示例: 包含头文件:#include <typeinfo>使用 typeid 运算符获取类…

安全防御(第六次作业)

攻击可能只是一个点&#xff0c; 防御需要全方面进行 IAE引擎 DFI和DPI技术 --- 深度检测技术 DPI --- 深度包检测技术 --- 主要针对完整的数据包&#xff08;数据包分片&#xff0c;分段需要重组&#xff09; &#xff0c;之后对 数据包的内容进行识别。&#xff08;应用层&a…

18 SpringMVC实战

18 SpringMVC实战 1. 课程介绍2. Spring Task定时任务1. 课程介绍 2. Spring Task定时任务 package com.imooc.reader.task

LSS 论文及代码详解:Lift, Splat, Shoot:

文章目录 1. 相关概念1.1 什么叫做BEV自底向上方法1.2 BEV网格2. 自底向上方法框架-LSS2.1 视锥点云和Lift操作2.1.1 视锥点云的空间位置2.1.2 视锥点云的特征(Context)2.2 BEV Pillar和Splat操作2.3 Shoot: Motion Planning2.4 完整的pipeline2.5 cumsum_trick(): 池化累积求…

LINUX基础培训二十七之shell标准输入、输出、错误

一、Shell 输入/输出重定向 大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回​​到您的终端。一个命令通常从一个叫标准输入的地方读取输入&#xff0c;默认情况下&#xff0c;这恰好是你的终端。同样&#xff0c;一个命令通常将其输出写入到标准输出&#xff…

数电学习笔记——逻辑代数的基本定理

目录 一、带入定理 二、反演定理 三、对偶定理 一、带入定理 在任何一个包含变量A的逻辑等式中&#xff0c;若以另外一个逻辑式代入式中所有A的位置&#xff0c;则等式仍然成立。 例1&#xff1a;&#xff08;AB&#xff09;AB 将&#xff08;BC&#xff09;带入等式中所…

Jlink Segger工具软件的应用(如何连接)

一、Jlink Commander的如何连接 1、点击打开“Jlink Commander” 2、输入“connect” 3、根据提示输入“&#xff1f;”。 此处是选择MCU 内核类型 4、此时jink commander 会提示选择对应的内核&#xff0c;如“图F5.1”。根据内核类型进行选择。 SWM1xx系列、SWM2xx系列…

做活动和会议直播,为什么要多个媒体平台同步直播?

传媒如春雨&#xff0c;润物细无声&#xff0c;大家好&#xff0c;我是51媒体网胡老师。 多个媒体平台同步直播活动和会议的原因主要有以下几点&#xff1a; 扩大观众覆盖面&#xff1a;不同的媒体平台拥有各自独特的用户群体&#xff0c;通过在多个媒体平台同步直播&#xff…

2024年3月阿里云服务器价格下调折扣表(附优惠价格表)

阿里云服务器ECS等核心产品价格全线下调&#xff0c;最高幅度达55%&#xff0c;2024年3月1日生效&#xff0c;针对ECS部分在售产品的官网折扣价、ECS计算型节省计划进行调整&#xff0c;生效后&#xff0c;基于官网折扣价的新购和续费&#xff0c;将按照新的价格进行计费。阿里…

IDEA-DeBug理论与实践

文章目录 01_Debug简介和意义02_IDEA中的Debug步骤03_跳转到当前代码执行的行04_步过调试的使用05_步入调试的使用06_强制步入调试的使用07_步出调试的使用08_回退断点调试的使用09_运行到光标处10_计算表达式11_条件断点12_多线程调试 在软件开发中&#xff0c;IDEA&#xff0…

物联网技术助力智慧城市安全建设:构建全方位、智能化的安全防护体系

一、引言 随着城市化进程的加速和信息技术的迅猛发展&#xff0c;智慧城市已成为现代城市发展的重要方向。在智慧城市建设中&#xff0c;安全是不可或缺的一环。物联网技术的快速发展为智慧城市安全建设提供了有力支持&#xff0c;通过构建全方位、智能化的安全防护体系&#…

SpringMVC01、回顾MVC

1、回顾MVC 1.1、什么是MVC MVC是模型(Model)、视图(View)、控制器(Controller)的简写&#xff0c;是一种软件设计规范。是将业务逻辑、数据、显示分离的方法来组织代码。MVC主要作用是降低了视图与业务逻辑间的双向偶合。MVC不是一种设计模式&#xff0c;MVC是一种架构模式。…