波奇学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 codewhile(true){char buffer[1024];cout<<"Please Enter@ ";fgets(shamddr,4096,stdin);}//删除挂接关系shmdt(shamddr);return 0;
}

效果

 

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

共享内存的机制特点

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

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

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

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

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

查看共享内存属性

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

flex的5种常见使用

Flex 布局教程&#xff1a;语法篇 文章目录 一.基本概念二 例子 其实我每次记一个样式标签,都是根据英文来记,但是justify-content和align-items确实让我迷惑,这次我打算只记 justify-content属性定义了项目在主轴上的对齐方式,好好总结一下用法~ 一.基本概念 采用 Flex 布局…

SpringBoot 事务失效及其对应解决办法

简介 本文主要讲述Spring事务会去什么情况下失效及其解决办法 Spring 通过AOP 进行事务控制&#xff0c;如果操作数据库报异常&#xff0c;则会进行回滚&#xff1b;如果没有报异常则会提交事务&#xff1b;但是&#xff0c;如果Spring 事务失效&#xff0c;会导致数据缺失/重…

Quartz与Spring Task的区别

1、相同点&#xff1a; 两者均能实现定时调度任务 2、Quartz ① 默认多线程异步执行 ② 单个任务时&#xff0c;在上一个调度未完成时&#xff0c;下一个调度时间到时&#xff0c;会另起一个线程开始新的调度。业务繁忙时&#xff0c;一个任务会有多个调度&#xff0c;可能导…

DAY65: 图论入门797、200、695

深度优先搜索 深度优先搜索按照一个方向一直搜索直到截止&#xff0c;再回溯换搜索方向。 搜索方向&#xff0c;是认准一个方向搜&#xff0c;直到碰壁之后再换方向换方向是撤销原路径&#xff0c;改为节点链接的下一个路径&#xff0c;回溯的过程 因为需要回溯&#xff0c;…

【STM32】STM32学习笔记-独立看门狗和窗口看门狗(47)

00. 目录 文章目录 00. 目录01. WDG概述02. 独立看门狗相关API2.1 IWDG_WriteAccessCmd2.2 IWDG_SetPrescaler2.3 IWDG_SetReload2.4 IWDG_ReloadCounter2.5 IWDG_Enable2.6 IWDG_GetFlagStatus2.7 RCC_GetFlagStatus 03. 独立看门狗接线图04. 独立看门狗程序示例105. 独立看门…

简单排列组合题(python版)

文章预览&#xff1a; 题目解法一输出结果 解法二输出结果输出结果 题目 有四个数字:1,2,3,4能组成多少个互不相同且无重复的数字的三位数? 各式多少? 解法一 我们粗略看一下这个题既然我们要组成三位数&#xff0c;那我们就循环3层每一层出一个数&#xff0c;并且if语句判…

OD(12)之Mermaid思维导图(Mindmap)

OD(12)之Mermaid思维导图(Mindmap)使用详解 Author: Once Day Date: 2024年2月29日 漫漫长路才刚刚开始… 全系列文章可参考专栏: Mermaid使用指南_Once_day的博客-CSDN博客 参考文章: 关于 Mermaid | Mermaid 中文网 (nodejs.cn)Mermaid | Diagramming and charting tool…

postman传参与返回值切换为左右显示的操作

目录 第一步 点击“Settings”&#xff0c;在下拉框选择“Settings” 第二步 在默认打开的General页面&#xff0c;参照下图改动两处 第一步 点击“Settings”&#xff0c;在下拉框选择“Settings” 第二步 在默认打开的General页面&#xff0c;参照下图改动两处 附上修改后…

字符串函数strstr()详解

一、strstr()函数的作用 字符串函数 strstr() 是 C 语言的一个标准库函数&#xff0c;它的作用是在一个字符串中查找给定字符串的第一个匹配之处&#xff0c;并返回指向该字符串的指针。如果没有找到该字符串&#xff0c;则返回 NULL。1 二、strstr()函数的原型和参数 strst…

c语言求奇数分之一序列前N项和

本题要求编写程序&#xff0c;计算序列 1 1/3 1/5 ... 的前N项之和。 输入格式: 输入在一行中给出一个正整数N。 输出格式: 在一行中按照“sum S”的格式输出部分和的值S&#xff0c;精确到小数点后6位。题目保证计算结果不超过双精度范围。 输入样例: 23输出样例: …

opencv中的rgb转gray的计算方法

转换原理 在opencv中&#xff0c;可以使用cv2.cvtColor函数将rgb图像转换为gray图像。示例代码如下&#xff0c; import cv2img_path "image.jpg" image cv2.imread(img_path) gray_image cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) mean gray_image.mean() pri…

【AI Agent系列】【MetaGPT多智能体学习】4. 基于MetaGPT的Team组件开发你的第一个智能体团队

本系列文章跟随《MetaGPT多智能体课程》&#xff08;https://github.com/datawhalechina/hugging-multi-agent&#xff09;&#xff0c;深入理解并实践多智能体系统的开发。 本文为该课程的第四章&#xff08;多智能体开发&#xff09;的第二篇笔记。主要是对MetaGPT中Team组件…

【Django】执行查询—检索对象

检索对象 检索全部对象 >>> all_entries Entry.objects.all()通过过滤器检索指定对象 通过添加过滤条件精炼原始 QuerySet。两种最常见的精炼 QuerySet 的方式是&#xff1a; filter(**kwargs) 返回一个新的 QuerySet&#xff0c;包含的对象满足给定查询参数。 ex…

【Tomcat】在 linux 上实现 Catlina.log 自动分割,防止文件过大

背景描述 catalina.out即标准输出和标准出错&#xff0c;所有输出到这两个位置的都会进入catalina.out&#xff0c;这里包含tomcat运行自己输出的日志以及应用里向console输出的日志。默认这个日志文件是不会进行自动切割的&#xff0c;所以我们需要借助其他工具进行切割&…

MySQL:快照读和当前读

mysql读取数据实际上有两种读取模式&#xff1a;当前读和快照读 快照读&#xff1a;快照读的执行方式是生成 ReadView&#xff0c;直接利用 MVCC 机制来进行读取&#xff0c;并不会对记录进行加锁。当前读&#xff1a;每次读取的都是当前最新的数据&#xff0c;但是读的时候不…

剑指offer面试题22 栈的压入弹出序列

考察点 辅助栈知识点 题目 分析 这道题目要求输入俩个序列&#xff0c;第一个序列表示栈的压入顺序&#xff0c;要求判断第二个序列是否是该栈的弹出顺序。遇到这类题目思维一定要往辅助栈上靠&#xff0c;因为关于栈的考点其实就是这个。这种题目的解题思路就是归纳&#x…

「Python系列」Python pyecharts模块

文章目录 一、pyecharts安装二、pyecharts应用三、pyecharts图表类型四、pyecharts特点与功能特点&#xff1a;功能&#xff1a; 五、相关链接 一、pyecharts安装 要安装 Python 的 pyecharts 模块&#xff0c;你可以使用 pip&#xff0c;这是 Python 的包管理工具。请按照以下…

Payment Without Change

题目链接&#xff1a;Problem - 1256A - Codeforces 解题思路&#xff1a; 题目的大致意思就是手中的硬币数拿出若干枚正好等于s&#xff0c;分三种情况 .如果n > s && b < s,输出no .如果b > s,输出yes .如果n * (a < (s / n) ? a : (s / n)) b >…

数据结构(C语言版)02---链表

链表&#xff1a; 声明&#xff1a;LNode* LinkList在链表里面这两个是等价的; #include<stdio.h> #include<stdlib.h> typedef int Elemtype; typedef struct LNode{Elemtype data;struct LNode* next; }LNode,*LinkList; 链表打印函数&#xff1a; //打印v…

【iOS ARKit】RealityKit 同步机制

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