进程的共享主存通信实验
进程的共享主存通信
【预备知识】
共享存储区为进程提供了直接通过主存进行通信的有效手段,不像消息缓冲机制那样需要系统提供缓冲,也不像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 种基本类型:…...
C++程序崩溃别慌!手把手教你用backward-cpp+glog捕获并记录堆栈信息(附完整CMake配置)
C程序崩溃别慌!手把手教你用backward-cppglog捕获并记录堆栈信息(附完整CMake配置) 深夜两点,服务器告警突然响起。你揉着惺忪的睡眼查看日志,只看到一行冰冷的"Segmentation fault"——没有调用栈…...
新手也能懂:DCDC芯片外围那个神秘的‘自举电容’,到底怎么选才不会翻车?
新手也能懂:DCDC芯片外围那个神秘的‘自举电容’,到底怎么选才不会翻车? 第一次看到DCDC芯片数据手册里的"自举电容"时,我盯着那个连接在BTST和SW引脚之间的小元件发呆了十分钟——它看起来和普通电容没什么两样&#x…...
MiniCPM-o-4.5-nvidia-FlagOS跨平台部署:Windows系统配置要点
MiniCPM-o-4.5-nvidia-FlagOS跨平台部署:Windows系统配置要点 想在自己的Windows电脑上跑起来最新的MiniCPM-o-4.5-nvidia-FlagOS,结果被一堆环境问题卡住了?别急,这太正常了。很多朋友在Windows上部署这类AI项目时,总…...
Nginx + FFmpeg 核心配置
Nginx FFmpeg 核心配置(2 种最实用方案)我给你最简、能直接用的配置,不用你自己改半天,分两种场景:Nginx 接收 FFmpeg 推流(直播)Nginx 调用 FFmpeg 自动转码(高清 / 标清ÿ…...
coze-loop应用指南:在数据分析、Web开发等场景下的优化技巧
coze-loop应用指南:在数据分析、Web开发等场景下的优化技巧 1. 工具介绍与核心功能 coze-loop是一款基于Ollama框架的AI代码优化工具,它将复杂的代码优化过程简化为三步操作:选择目标、粘贴代码、获取优化建议。这个工具特别适合需要快速提…...
MTK手机屏显干扰全解析:亮灭屏、射频干扰与TP失灵,我是如何用PLL_CLOCK和Porch参数解决的
MTK手机屏显干扰全解析:亮灭屏、射频干扰与TP失灵实战解决方案 引言:当屏幕开始"跳舞"——移动设备显示异常背后的复杂世界 那块6.5英寸的OLED屏幕又一次在通话过程中突然闪烁起来,像被无形的幽灵操控着。作为MTK平台驱动开发工程师…...
【Python MCP服务器开发终极模板】:20年架构师亲授源码级解析与高并发优化实战
第一章:Python MCP服务器开发模板概览与核心设计哲学Python MCP(Model-Controller-Protocol)服务器开发模板是一套面向协议驱动、可插拔架构的轻量级服务框架,专为构建高内聚、低耦合的模型交互后端而设计。其核心不依赖于特定Web…...
2026上海紧固件专业展观察:12.9级螺栓为何成为高端制造核心紧固方案?
2026第十六届上海紧固件专业展(Fastener Expo Shanghai 2026)将于6月24日至26日在上海国家会展中心举办。作为紧固件行业的重要展示窗口,本届展会将集中呈现高强度紧固件的发展趋势,其中12.9级螺栓已成为当前制造业升级的重要标志…...
pngquant终极内存优化:处理大文件时的10个高效故障排除技巧
pngquant终极内存优化:处理大文件时的10个高效故障排除技巧 【免费下载链接】pngquant Lossy PNG compressor — pngquant command based on libimagequant library 项目地址: https://gitcode.com/gh_mirrors/pn/pngquant 想要高效压缩大型PNG文件却遇到内存…...
终极指南:如何将Squire富文本编辑器与现代前端工具链完美集成
终极指南:如何将Squire富文本编辑器与现代前端工具链完美集成 【免费下载链接】Squire The rich text editor for arbitrary HTML. 项目地址: https://gitcode.com/gh_mirrors/sq/Squire Squire是一个轻量级、高性能的HTML5富文本编辑器,专为处理…...




