进程的共享主存通信实验
进程的共享主存通信
【预备知识】
共享存储区为进程提供了直接通过主存进行通信的有效手段,不像消息缓冲机制那样需要系统提供缓冲,也不像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 种基本类型:…...

远程连接阿里云ECS
说明:ECS(阿里云服务器)可选择的系统镜像如下: 本文介绍基于Windows系统,对CentOS、Ubuntu、Windows这三个操作系统的连接方式,以及连接工具Windterm的使用。 CentOS & Windterm CentOS是我使用时间最…...

【C++】多态(上)超详细
封装,继承,多态不只是C的三大特性,而是面向对象编程的三大特性。 什么是多态: 不同的对象做同一件事情,结果会出现多种形态。 1.满足多态的几个条件 1.父子类完成虚函数重写(需要满足三同:函…...

【Git】 Git分支操作指南
隐形的纪念躲在心里面 也许吧 也许不会再见 阴天或晴天 一天又一年 风它在对我说莫忘这一切 🎵 蔡淳佳《隐形纪念》 Git是一种非常强大的分布式版本控制系统,允许用户在开发过程中创建不同的分支(branch)来分…...

智慧文旅赋能旅游服务升级:以科技创新驱动行业变革,打造智慧化、个性化、高效化的旅游新体验,满足游客日益增长的多元化需求
目录 一、引言 二、智慧文旅的概念与内涵 三、智慧文旅在旅游服务升级中的应用 1、智慧旅游服务平台建设 2、智慧景区管理 3、智慧旅游营销 四、智慧文旅推动旅游行业变革的案例分析 案例一:某智慧旅游城市建设项目 案例二:某景区智慧化改造项目…...

AtCoder Beginner Contest 310 E题 NAND repeatedly
E题:NAND repeatedly 标签:动态规划题意:给定一个长度为 n n n的 01 01 01字符串 A i A_i Ai,给定规则: 0 ⊼ 0 1 , 0 ⊼ 1 1 , 1 ⊼ 0 1 , 1 ⊼ 1 0 0⊼01,0⊼11,1⊼01,1⊼10 0⊼01,0⊼11,1⊼01,1⊼10。 求 ∑…...

一款简易的免费抽奖软件
一、介绍 这款抽奖软件设计简洁,操作便捷。用户可以轻松将参与名单通过EXCEL文件导入至程序中,并可根据需要设定各类奖品和对应的中奖人数。在选定了奖品后,用户只需点击“开始”按钮,随后再按下“暂停”按钮,软件便会…...

Kubernetes 监控管理
目录 1. Metrics Server2. Prometheus & Grafana3. cAdvisor4. 日志收集5. 告警与通知6. 最佳实践 Kubernetes 监控管理是确保集群稳定运行和应用服务质量的关键环节。它涉及收集、聚合、分析集群及其上运行的应用程序的各种指标和日志数据。 1. Metrics Server 作用&…...

哈希表第6/9题--四数相加II
题目描述: 给你四个整数数组 nums1、nums2、nums3 和 nums4 ,数组长度都是 n ,请你计算有多少个元组 (i, j, k, l) 能满足: 0 < i, j, k, l < nnums1[i] nums2[j] nums3[k] nums4[l] 0 示例 1: 输入&…...

使用JavaScript将富文本HTML转换为纯文本
在Web开发中,我们经常需要处理HTML内容,但有时为了特定的目的,比如文本处理、搜索或显示在非HTML环境中,我们可能希望将富文本HTML转换为纯文本。这里,我们将探讨如何使用JavaScript来实现这一功能。 为什么要将HTML转…...

2024-05-13 问AI: 介绍一下 google wavenet 声码器
文心一言 Google的WaveNet声码器是一个深度学习模型,用于生成高质量的音频信号,特别是人类语音。与传统的声码器相比,WaveNet可以生成更加自然和流畅的音频,因为它直接模拟了原始音频信号的波形生成过程。 WaveNet的核心思想是使…...