进程的共享主存通信实验
进程的共享主存通信
【预备知识】
共享存储区为进程提供了直接通过主存进行通信的有效手段,不像消息缓冲机制那样需要系统提供缓冲,也不像pipe机制那样需要事先建立一个特殊文件,而是由通信双方直接访问某些共享虚拟储存空间。在Linux中,系统管理一组共享主存段控制块。通信进程在使用共享主存段以前,首先提出申请,系统为之分配存储空间并返回共享主存段标识号。一个共享段建立后,进程把它被附加到自己虚拟空间中。一个进程可以附加多个共享主存段。一个共享主存段一旦被附加到进程的虚拟空间后,对它的访问与其他虚拟地址的访问完全相同。但为了保证共享主存段数据的完整性,通信的进程之间要互斥地进行访问。当通信进程不再需要该共享主存段时,可使用命令将其与进程分离,从而使其从进程的虚空间删除。
- 共享主存段使用的数据结构
(1)共享主存段控制块(或共享主存段头)
每个共享主存段都有一个控制块,用来描述共享主存段的一些属性,共享主存段控制块定义在sys/shm.h中,其结构如下:
struct shmid_ds
{
struct ipc_perm shmperm; / * 共享主存段访问控制结构 * /
int shmsegsz; / * 共享段以字节为单位的长度 * /
struct ptentry * shmptbl; / * 共享页表始址 * /
ushort shmlpid; / * 最近执行共享段操作的进程标识 * /
ushort shmcpid; / * 创建共享段的进程标识 * /
ushort shmnattch; / * 当前附件段号 * /
ushort shmcnattch; / * 主存中的附加段号 * /
time_t shmatime; / * 最近一次附件操作的时间 * /
time_t shmdtime; / * 最近一次与进程分离操作的时间 * /
time_t shmctime; / * 最近一次修改时间 * /
}
为了便于管理,系统将维持的共享主存段组成一个表,共有SHMMNI=100个元素,其结构如下:
struct shmid_ds shmen[SHMMNI]; / * 共享段表 * /
其访问控制结构定义如下:
struct ipc_perm
{
key_t key;
ushort uid; /* owner euid and egid * /
ushort gid;
ushort cuid;
ushort cgid;
ushort mode; /*lower 9 bits of shmflg*/
ushort seq /*sequence number*/
};
(2)共享主存段的数据结构
每个共享主存段都对应一个页表和允许的存取权限,结构如下;
struct shmptds
{
int shmspte; /*开始也表项*/
int shmsflg; /*对共享段的读/写权限*/
}
每个进程最多允许6个共享主存段(SHMSEG=6).
- 申请一个共享主存段
参与通信的进程,通信前要先申请一个共享主存段,若是第一次申请,则要为其分配一个主存空间及页表,并对共享主存区控制块进行初始化,申请共享主存段调用语法如下:
# include<sys/ipc.h>
# include<sys/shm.h>
int shmget(key_t key,size_t size,int shmflg)
其中,key为共享主存段的关键字,size是共享主存段字节长度,shmflg为创建和访问标志。
返回值:成功时,为与key值相关的共享主存段的标识号,且大小是页对齐;失败时,为-1。
如果key的值为IPC_PRIVATE,或不为IPC_PRIVATE,创建的共享段与key无关,关键字由系统分配。
Shmflg由如下成分组成:
.IPC_CREAT,创建一个新段。如果该标志没有设置,将查找与key相关的段,且该段允许用户访问。
.IPC_EXCL,与IPC_CREAT一起使用,确保创建一个新的共享段。若该段已经存在,出错。
低9位为三类用户的访问方式的定义。
- 将共享段附加到申请通信的进程空间
对于已申请通信所需的共享段,进程需把它附加到自己的虚拟空间后才能对其进行读写,将共享段附加到申请通信的进程空间的函数调用语法:
#include < sys/sem.h >
void shmat ( int shmid,coid * shmadd,nt shmflg);
这里shmid是进程调用shmget后返回的共享段标识号;shmadd是给出的应附加到进程虚空间的地址;shmflg为允许对共享段的访问方式。
返回值:成功时为附加到进程地址空间的虚地址,失败时为-1。
连接到进程虚空间的地址规则为:
.shmadd为0,则将该共享段附加到系统选择的进程的第一个可用地址之后。
.shmadd为非0,如果shmflg指定了SHM_RND标志,则将该共享段附加shmadd取整后指定的地址上。
.shmadd为非0,如果shmflg未指定SHM_RND标志,则将该共享段附加shmadd指定的地址上。通常将shmadd指定为0,由系统安排连接地址。
4.将共享段与进程之间解除链接
当进程不再需要共享段时,将其从它的地址空间拆下,调用语法为:
#include < sys/sem.h >
int shmdt( void * shmaddr );
其中,shmaddr是共享段在进程地址空间的虚地址。返回值为0。
5.对共享段进行控制
#include < sys/sem.h >
int shmctl(int shmid,int cmd,struct_ds * buf);
返回值:成功时为0,失败时为-1。
系统调用shmctl根据控制命令cmd对共享段进行控制。cmd可能的取值有:
. IPC_STAT,将有关共享段的信息复制到具有shmid_ds结构的buf中;
. IPC_SET,用于用户和用户组,或对其存取权限进行修改,要求用户必须为超级用户或拥有者;
. IPC_RMID,用于标志删除共享段。在共享段与所有进行分离时,实际进行删除;
. IPC_LOCK,在Linux环境下,将共享段锁在主存中;
. IPC_UNLOCK,在Linux环境下,允许将共享段锁换出主存。
编程实现例<一>
【任务】
编程实现一个是进程向共享段写信息的例子。
【程序】
#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#define SHMKEY 75#define K 1024int shmid;main(){int i,*pint;char *addr;extern char *shmat();shmid=shmget(SHMKEY,16*K,0777|IPC_CREAT);/*申请创建一个16K大小的共享存储段,其标识号为SHMKEY*/addr=shmat(shmid,0,0); /*缺省地址将共享段附加到系统指定位置*/printf(“addr ox%x\n”,addr);/*打印附加到进程地址空间的地址*/pint=(int *) addr;for (i=0;i<256;i++)*pint++=i; /*向共享主存段写入0~255个数*/pint=(int *)addr;*pint=256; /*共享段第一个字中写入信息长度256,以便接收进程读*/Pause(); /*暂停等待接收进程读*/}修正后的代码:
【运行结果】
【分析】
第一个例子是一个进程向共享段写信息的例子,它使用了共享内存来实现进程间的通信。程序首先申请创建一个16K大小的共享存储段,标识号为SHMKEY,然后将共享段附加到系统指定位置,并打印附加到进程地址空间的地址。接着向共享主存段写入0~255个数,并在共享段第一个字中写入信息长度256,以便接收进程读取。最后暂停等待接收进程读
编程实现例<二>
【任务】
编程实现从共享段读信息的例子
【程序】
#include <sys/types.h>#include <sys/ipc.h>#include <sys/shm.h>#define SHMKEY 75#define K 1024int shmid;main(){int i,*pint;char *addr;extern char *shmat();shmid=shmget(SHMKEY,8*K,0777); /*由SHMKEY得到共享段标识号*/addr=shmat(shmid,0,0); /*将共享段与本进程相连*/pint=(int *) addr;while (*pint==0); /*若共享区无信息时,在此等待*/for (i=0;i<256;i++)printf(“%d\n”,*pint++);}修正后的代码:
【运行结果】
【分析】
第二个例子是一个从共享段读信息的例子,同样使用了共享内存来实现进程间的通信。程序首先通过SHMKEY得到共享段标识号,然后将共享段与本进程相连。接着程序进入一个while循环,在共享区无信息时,在此等待。当共享区有信息时,将信息读取出来并打印出来。
相关文章:
进程的共享主存通信实验
进程的共享主存通信 【预备知识】 共享存储区为进程提供了直接通过主存进行通信的有效手段,不像消息缓冲机制那样需要系统提供缓冲,也不像pipe机制那样需要事先建立一个特殊文件,而是由通信双方直接访问某些共享虚拟储存空间。在Linux中&…...
深度缓冲技术在AI去衣中的神奇作用
引言: 随着人工智能技术的飞速发展,其在图形处理和视觉领域的应用日益增多。AI去衣技术便是其中一个颇具争议但又技术上引人入胜的话题。今天,我们将深入探讨一项关键技术——深度缓冲(Depth Buffering),它…...
能效?性能?一个关于Windows下使用openssl speed进行速度测试的诡异问题
问题描述 最近的某个软件用到了openssl,所以就想着测试一下速度。我的电脑是惠普的,CPU是AMD Ryzen 7 PRO 6850HS,系统是Win11。我使用openssl自带的speed测试加密/解密的速度,命令大致如下: openssl speed -evp aes…...
block性能考虑和线程安全
性能考虑 频繁地创建和销毁大量的 block 可能会对性能造成影响,特别是当这些 block 被拷贝到堆上时。同时,block 捕获大量数据时也会增加内存使用。 在讨论性能考虑时,主要关注的是 block 的创建、拷贝到堆上以及捕获变量的成本。以下是针对…...
没有公网ip,如何实现外网访问内网?
目前拨号上网是最广泛的上网方式,这种方式优点是价格便宜,缺点是没有固定公网ip,每次重新您拨号ip地址都会变。如果有一台服务器,需要实现外网访问,在没有固定公网ip的环境下,该如何实现呢?使用…...
Python中如何将小数转化为百分数进行输出
小数转化为百分数 Python中如何将小数转化为百分数进行输出基本概念使用字符串格式化1. 使用字符串格式化操作符 %2. 使用str.format()方法3. 使用f-string(格式化字符串字面量) **重点内容**:**无论是通过使用%格式化操作符、str.format()方…...
加入全球少儿编程运动:Scratch让每个孩子都能成为创造者(Scratch最新版客户端和初/中/高级学习资料整理分享)
文章目录 📖 介绍 📖🏡 演示环境 🏡📒 文章内容 📒📝 安装与使用📝 社区与资源 🎈 获取方式 🎈⚓️ 相关链接 ⚓️ 📖 介绍 📖 你知道…...
引擎:主程渲染
一、引擎发展 二、引擎使用 1.游戏渲染流程 2.3D场景编辑器操作与快捷键 3.节点的脚本组件 脚本介绍 引擎执行流程 物体节点、声音组件\物理组件\UI组件、脚本组件 暴露变量到面板 4.节点的查找 基本查找 this.node:挂载当前脚本的节点A; this.nod…...
Java 高级面试问题及答案
问题6:请解释Java中的异常处理机制。 探讨过程: 异常处理是Java程序中错误处理的关键部分。正确地处理异常可以提高程序的稳定性和健壮性。 答案: Java中的异常处理机制允许程序在出现错误时,不会导致程序立即终止,而…...
邮件的安全认证(dkim/spf/dmarc)
dkim dkim是用来识别电子邮件合法以及完整性的一种技术手段,主要方式是通过非对称加密对邮件本身进行签名,邮件接收方可以使用发送方提供的公钥对签名进行校验,来确认邮件是否伪造或者被篡改。 如何查看dkim dkim签名被放在邮件原始内容的…...
单调栈问题
原理 单调栈的核心原理是:在栈内保持元素的单调性(递增或递减) 单调递增栈: 用于处理“下一个更小的元素”问题。当新元素比栈顶元素小或等于时,直接入栈;否则,一直从栈顶弹出元素,…...
Hexo博客重新部署与Git配置
由于电脑重装了一次,发现之前Hexo与NexT主题版本过于落后,重新部署了下。 1 Node.js与git安装 这一块安装就不赘述了。去两个官网找安装文件安装即可。 node.js git 打开git以后配置的几个关键命令行。 git config --global user.name "你的gi…...
KUKA机器人专业名词解释
1、CCU Cabinet Control Unit (控制柜控制单元) 2、CIB Cabinet Interface Board (控制柜接口板) 3、HMI Human Machine Interface (人机界面);KUKA.HMI 是 KUKA 操作界面。 4、KCB …...
阿里云 物联网平台 MQTT连接、数据传输
阿里云 物联网平台 MQTT连接、数据传输 1、设备连接阿里云 2、多设备之前的通信、数据流转 3、设备数据来源的读取。 基于C# winform 开发上位机,读取设备、仪器、MES或者电子元器件的数据,MQTT传输至阿里云平台,可视化界面构建界面&#…...
栈和队列OJ练习题及解答
前言 上一篇博客已经讲到了栈和队列的数据结构,概括一下:栈后进先出(Last In First Out)、队列先进先出(First In First Out)。那么,接下来就来讲讲,关于栈和队列的相关练习题&#…...
渗透测试-信息收集
网络安全信息收集是网络安全领域中至关重要的一环,它涉及到对目标系统、网络或应用进行全面而细致的信息搜集和分析。这一过程不仅有助于理解目标网络的结构、配置和潜在的安全风险,还能为后续的渗透测试、风险评估和安全加固提供有力的支持。 在网络安…...
电力乙级资质延伸换证:企业转型的契机
电力乙级资质延伸换证不仅是企业合规运营的必要步骤,同时也为企业转型提供了重要的契机。在这个过程中,企业可以重新审视自身的业务模式、管理体系、技术能力等方面,寻找新的增长点和发展方向。 首先,电力乙级资质延伸换证要求企业…...
基于Redis实现分布式锁——Java版本
基于Redis实现分布式锁——Java版本 版本一版本二版本三Redisson 定义分布式锁接口如下: public interface ILock {boolean tryLock(long timeoutSec);void unlock(); }版本一 设定业务超时时间,到期自动解锁。缺点是超时时间不好估计,需要…...
Qt自定义控件--提升为
为什么要自定义控件 1,有复合小控件需要组合为一个整体控件时; 2,一个复合控件需要重复使用时; 实现 自定义控件文件 新增三个文件 关联不同组的控件 关联之前的准备工作 1,在主控件选择和子控件所有控件所在控件…...
Lua 基础 01 入门
Lua 基础相关知识 第一期 注释 -- 单行注释--[[多行注释 --]]-- 多加一个横杠符号就能重新启用注释内的代码 ---[[print("Lua") --]]数据类型 Lua 是动态类型语言,变量不需要类型定义,只需要为变量赋值。 Lua 有 8 种基本类型:…...
手把手调试:从V8引擎的ArrayBuffer到WebAssembly,一步步拆解Chrome CVE-2020-6507漏洞利用链
深入解析Chrome V8引擎漏洞利用:从ArrayBuffer到WebAssembly的内存操控实战 浏览器安全研究领域近年来持续升温,其中V8引擎作为Chrome和Node.js的核心组件,其安全性直接影响着数十亿用户。本文将带您深入探索一个典型V8漏洞(CVE-2…...
ExplorerBlurMica终极指南:让你的Windows文件资源管理器焕然一新
ExplorerBlurMica终极指南:让你的Windows文件资源管理器焕然一新 【免费下载链接】ExplorerBlurMica Add background Blur effect or Acrylic (Mica for win11) effect to explorer for win10 and win11 项目地址: https://gitcode.com/gh_mirrors/ex/ExplorerBlu…...
基于YOLO的安全帽佩戴检测系统~Python+模型训练+2026原创+YOLO算法
项目简介 基于 YOLO 的智能安全帽佩戴检测平台,面向施工现场图片识别、检测记录管理与安全宣传信息展示等业务场景。系统后端采用 Flask 搭建 RESTful API 服务,结合数据库进行业务数据持久化存储,并通过 JWT 实现用户身份认证与接口访问控制…...
OpenFOAM字典文件关键配置实战指南
1. OpenFOAM字典文件基础认知 第一次接触OpenFOAM的朋友,看到满屏幕的字典文件可能会有点懵。这玩意儿就像乐高积木的说明书,告诉你每个零件该怎么拼。我刚开始用的时候,经常把blockMeshDict和snappyHexMeshDict搞混,结果生成的网…...
技术人终身学习:2026年软件测试从业者必跟的5个播客
在技术迭代日新月异的今天,终身学习已不再是可选项,而是软件测试从业者保持竞争力的生存法则。碎片化的时间如何转化为系统性的认知升级?深度思考如何突破日常工作环境的局限?播客,以其伴随性强、信息密度高、视角多元…...
GLM-4.1V-9B-Base实战案例:智能客服知识库图片问答模块集成方案
GLM-4.1V-9B-Base实战案例:智能客服知识库图片问答模块集成方案 1. 项目背景与需求分析 在智能客服系统中,用户经常需要上传产品图片、使用场景截图或问题示意图进行咨询。传统客服系统只能依赖人工处理这类图片咨询,效率低下且成本高昂。G…...
如何高效管理游戏资源:GodotPckTool 完全指南与5个实战技巧
如何高效管理游戏资源:GodotPckTool 完全指南与5个实战技巧 【免费下载链接】GodotPckTool Standalone tool for extracting and creating Godot .pck files 项目地址: https://gitcode.com/gh_mirrors/go/GodotPckTool GodotPckTool 是一个独立的命令行工具…...
foobox-cn:重塑foobar2000视听体验的智能界面解决方案
foobox-cn:重塑foobar2000视听体验的智能界面解决方案 【免费下载链接】foobox-cn DUI 配置 for foobar2000 项目地址: https://gitcode.com/GitHub_Trending/fo/foobox-cn 你是否曾因音乐播放器界面过于简陋而错失沉浸式的听觉享受?当功能性凌驾…...
开源剧本AI落地实操:像素剧本圣殿+Dual-GPU并行推理完整教程
开源剧本AI落地实操:像素剧本圣殿Dual-GPU并行推理完整教程 1. 项目概览 像素剧本圣殿(Pixel Script Temple)是一款基于Qwen2.5-14B-Instruct深度微调的专业剧本创作工具。这个开源项目将先进的AI推理能力与独特的8-Bit复古美学相结合&…...
只要一行代码,瞬间搭建 Web 服务器 python -m http.server 8000
只要一行代码,瞬间搭建 Web 服务器 python -m http.server 8000 目录 只要一行代码,瞬间搭建 Web 服务器 python -m http.server 8000 1. 核心机制:内置的 `http.server` 模块 2. 为什么它能“求生”,但不能“生产”? 🚀 并发处理能力 (Concurrency) 🛡️ 安全性 (Se…...




