在 .NET 环境下实现跨进程高频率读写数据

news2025/5/25 7:42:02

目录

✅ 技术选型说明

📦 示例场景

🧩 数据结构定义

🚦 核心同步机制

🧑‍💻 消费者实现

⚡ 性能优化技巧

🛠 部署注意事项

📈 性能基准(理论值)

在 .NET 环境下实现跨进程高频率读写数据,通常需要结合高性能通信机制(如共享内存、命名管道或内存映射文件)和线程同步技术。以下是基于 内存映射文件(Memory-Mapped Files)信号量同步 的完整案例,适合高频数据传输场景(如实时传感器数据采集、高频交易日志等)。

技术选型说明

  1. MemoryMappedFile
    • 共享内存机制,适合跨进程高速读写
    • 通过 MemoryMappedViewAccessor 操作二进制数据
  2. SemaphoreSlim
    • 轻量级同步原语,避免忙等待
  3. 环形缓冲区(Ring Buffer)
    • 高效管理高频数据流,减少锁竞争

示例场景

模拟 传感器数据采集系统

  • 进程 A:每秒生成 100,000 条传感器数据(包含时间戳和数值)
  • 进程 B:实时消费数据并计算移动平均值

数据结构定义

// 通用数据结构(两个进程需共享定义)
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct SensorData
{
    public long Timestamp;      // 时间戳(毫秒)
    public float Value;         // 传感器数值
}

 核心同步机制

使用 MemoryMappedFile + Semaphore 实现无锁协作:

// 共享内存布局
const int BufferSize = 1024 * 1024; // 1MB 缓冲区
const string MapName = "SensorDataBuffer";
const string WriteSemaphore = "SensorWriteSemaphore";
const string ReadSemaphore = "SensorReadSemaphore";

// 生产者写入逻辑
using var mmf = MemoryMappedFile.CreateOrOpen(MapName, BufferSize);
using var writerSem = new SemaphoreSlim(1, 1); // 写信号量
using var readerSem = new SemaphoreSlim(0, 1); // 读信号量

var accessor = mmf.CreateViewAccessor();
int writeIndex = 0;

for (int i = 0; i < 1000000; i++)
{
    await writerSem.WaitAsync(); // 等待写权限

    var data = new SensorData
    {
        Timestamp = DateTime.Now.Ticks,
        Value = (float)(Math.Sin(i * 0.01) * 100)
    };

    accessor.Write(writeIndex, ref data);
    writeIndex += Marshal.SizeOf<SensorData>();

    if (writeIndex >= BufferSize)
        writeIndex = 0; // 环形缓冲区

    readerSem.Release(); // 通知消费者
}

 消费者实现

// 消费者读取逻辑
using var mmf = MemoryMappedFile.OpenExisting(MapName);
using var writerSem = new SemaphoreSlim(1, 1);
using var readerSem = new SemaphoreSlim(0, 1);

var accessor = mmf.CreateViewAccessor();
int readIndex = 0;
float sum = 0;
int count = 0;

while (true)
{
    await readerSem.WaitAsync(); // 等待数据

    var data = new SensorData();
    accessor.Read(readIndex, out data);
    readIndex += Marshal.SizeOf<SensorData>();

    if (readIndex >= BufferSize)
        readIndex = 0;

    writerSem.Release(); // 归还写权限

    // 计算移动平均(示例)
    sum += data.Value;
    count++;
    if (count % 100 == 0)
    {
        Console.WriteLine($"Moving Avg: {sum / 100:F2}");
        sum = 0;
        count = 0;
    }
}

性能优化技巧

  1. 预分配缓冲区
    使用固定大小的 MemoryMappedFile 避免动态扩容开销
  2. 原子操作替代锁
    对于索引更新可使用 Interlocked 类(示例中简化为环形缓冲区)
  3. 批量处理
    消费者每次读取多个数据项减少同步开销
  4. 内存对齐
    使用 [StructLayout(Pack=1)] 确保结构体内存对齐

部署注意事项

  1. 权限管理
    确保两个进程有相同的共享内存访问权限
  2. 异常处理
    添加 try-catch 处理 WaitOne 超时和资源释放
  3. 资源清理
    使用 using 语句确保 MemoryMappedFile 正确释放
  4. 跨平台兼容性
    Windows 下使用命名管道更稳定,Linux 推荐 MemoryMappedFiles

性能基准(理论值)

方法吞吐量(1MB 缓冲区)延迟(单向)
MemoryMappedFile~800,000 条/秒<5μs
Named Pipe~300,000 条/秒10-50μs
TCP Socket~150,000 条/秒100-500μs

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

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

相关文章

选择合适的Azure数据库监控工具

Azure云为组织提供了众多服务&#xff0c;使其能够无缝运行应用程序、Web服务和服务器部署&#xff0c;其中包括云端数据库部署。Azure数据库能够与云应用程序实现无缝集成&#xff0c;具备可靠、易扩展和易管理的特性&#xff0c;不仅能提升数据库可用性与性能&#xff0c;同时…

bi软件是什么?bi软件是做什么用的?

目录 一、BI 软件是什么 1. 基本概念 2. 工作原理 二、BI 软件是做什么用的&#xff1f; 1. 精准洞察市场趋势 2. 优化企业战略规划 3. 辅助投资决策 三、如何选择合适的 BI 软件 1.功能匹配度 2.易用性和可扩展性 3.数据安全和稳定性 4.技术支持和服务 总结 生产…

锐化算子构建方法(机翻)

为了充分利用 GIP&#xff08;通用图像处理单元&#xff09;的并行处理能力&#xff0c;像素组的规模保持较小。每组像素数量的最小化可最大化可并行实现的独立内核数量。理想情况下&#xff0c;若处理单元可获取给定邻域的每个像素值&#xff0c;则内核可完全通用&#xff08;…

算法中的数学:费马小定理

1.同余式 定义&#xff1a;如果两个整数a,b模p的余数相同&#xff0c;那么a,b就是模p的同余式 记作&#xff1a; 性质&#xff1a; 1.同加性&#xff1a;若a和b同时加一个整数&#xff0c;那么他们加完之后的两个数模p仍为同余式 2.同乘性&#xff1a;若a和b同时乘一个整数&…

【Python 算法零基础 4.排序 ③ 插入排序】

目录 一、引言 二、算法思想 三、算法分析 1.时间复杂度 2.空间复杂度 3.算法的优点和缺点 ① 算法的优点 ② 算法的缺点 四、实战练习 1491. 去掉最低工资和最高工资后的工资平均值 思路与算法 ① 插入排序算法 (insertSort 方法) Ⅰ、初始化 Ⅱ、遍历未排序元素 Ⅲ、元素后移…

LangGraph实现多智能体的方法

生活中我们常常需要同时处理多个任务&#xff0c;比如预订旅行时&#xff0c;既要订机票&#xff0c;又要订酒店。如果有一个智能助手能同时帮你搞定这些事情&#xff0c;那该有多方便啊&#xff01;LangGraph的多智能体系统就能做到这一点。它就像一个超级助手团队&#xff0c…

聚铭安全管家平台2.0重磅发布——大模型智驱高效降本新方向

【聚铭安全管家平台2.0正式发布】在数字化安全威胁日益严峻的背景下&#xff0c;聚铭网络创新推出安全管家平台2.0&#xff0c;首创"云端智能区域中台本地终端"三级协同架构&#xff0c;深度融合AI安全大模型技术&#xff0c;实现威胁智能研判与自动化响应。该平台通…

使用注解动态映射:根据实体List列表动态生成Excel文件

我们一般通过POI来生成对应的Excel文件&#xff0c;绝大多数情况是需要手动编写单元格内容&#xff0c;然后顺序填充值&#xff0c;今天我们将动态根据实体来生成Excel表头&#xff0c;同时自动填充内容。 文章目录 1. 定义注解2. 实体类应用注解3. 动态导出工具类 1. 定义注解…

基于cornerstone3D的dicom影像浏览器 第二十一章 显示DICOM TAGS

系列文章目录 第一章 下载源码 运行cornerstone3D example 第二章 修改示例crosshairs的图像源 第三章 vitevue3cornerstonejs项目创建 第四章 加载本地文件夹中的dicom文件并归档 第五章 dicom文件生成png&#xff0c;显示检查栏&#xff0c;序列栏 第六章 stack viewport 显…

【循环位运算——uint32,DP】

题目 代码 #include <bits/stdc.h> using namespace std; using ll long long; using uint unsigned;const int N 1010;ll f[N][N]; uint a[N]; int n, m;int main() {ios::sync_with_stdio(0);cin.tie(0);cin >> n >> m;for(int i 1; i < n; i)cin …

贪心介绍 LeetCode 455.分发饼干 LeetCode 376. 摆动序列 LeetCode 53. 最大子序和

贪心介绍 贪心的本质是选择每一阶段的局部最优&#xff0c;从而达到全局最优。 eg: 有一堆钞票&#xff0c;你可以拿走十张&#xff0c;如果想达到最大的金额&#xff0c;你要怎么拿&#xff1f; 指定每次拿最大的&#xff0c;最终结果就是拿走最大数额的钱。每次拿最大的就…

Postgresql 数据库体系架构

1 postgresql 软件目录 rootu24-pg-110:~# tree -L 1 /usr/local/postgresql-17/ /usr/local/postgresql-17/ ├── bin #可执行二进制文件 ├── include ├── lib └── share 2 数据库目录及文件 #目录结构 base --每个数据库的子目录 global --数据库集簇范…

Vue框架1(vue搭建方式1,vue指令,vue实例生命周期)

一.VUE vue概述(vue.js) vue是前端JavaScript框架,对JavaScript进行封装,是一套用于构建用户界面的渐进式框架.vue的核心只关注图示层,不仅易上手,还便于与第三方库或既有的项目整合. vue.js和Angular.js,React.js一起,并称为前端三大主流框架 注意: 在此初步学习的是vue…

skywalking 10.2 源码编译

1.源码下载 Downloads | Apache SkyWalking 选择 SkyWalking APM 最新版下载&#xff0c; 下载后&#xff0c;在本地解压。 2.Idea加载工程 2.1 根目录pom文件删除checkstyle 插件 后续做二开时避免代码风格校验报错 2.2 删除apm-webapp 工程中 frontend-maven-plugin插件…

C++ --- string

C --- string 简介1、构造函数2、迭代器&#xff08;主流的遍历方式&#xff09;2.1字符串经典遍历和修改的方式2.2使用迭代器遍历和修改字符串2.3使用范围for遍历对象&#xff08;C11支持的新特性&#xff09; 3、常见&#xff0c;常用方法或重载3.1查询大小和容量管理3.2增3.…

Android Studio 连接夜神模拟器 自动断开的问题

版本情况&#xff1a; Android Studio Meerkat Feature Drop | 2024.3.2 Build #AI-243.25659.59.2432.13423653, built on April 30, 2025 Runtime version: 21.0.6-13368085-b895.109 amd64夜神模拟器 V7.0.5.9046 问题描述&#xff1a; cmd命令行使用adb连接夜神模拟器成…

Python入门手册:Python中的数据结构类型

在Python中&#xff0c;数据结构是组织和存储数据的方式&#xff0c;它们允许你以高效的方式操作和处理数据。Python提供了几种内置的数据结构&#xff0c;包括列表&#xff08;List&#xff09;、元组&#xff08;Tuple&#xff09;、集合&#xff08;Set&#xff09;和字典&a…

巡礼中国西极·跨越昆仑天山 | 北斗卫星徽章护航昆仑科考

神秘深邃&#xff0c;遗世独立。帕米尔高原&#xff0c;横亘于中亚东南部&#xff0c;我国的最西端&#xff0c;面积约10万平方千米&#xff0c;平均海拔4500米以上&#xff0c;古代丝绸之路在此经过。昆盖山&#xff0c;一座掩藏在帕米尔高原褶皱深处、鲜为人知的山脉&#xf…

Vue常用自定义指令-积累的魅力【VUE】

前言 在【自定义指令—v2与v3之间的区别【VUE基础】一文中&#xff0c;整理了自定义指令部分vue2和vue3 两个版本的区别&#xff0c;有兴趣的伙伴或者针对自定义部分比较迷茫的伙伴可以跳转看一下。此次主要介绍一些自己积累的一些自定义指令的代码&#xff0c;与大家一起分享。…

LangChain4j第三篇: RAG的简单应用与实践

引言:RAG 构建属于你的大模型 大语言模型(LLM)的知识体系本质上仅限于它所接受的训练数据。 其一在知识时效性方面,模型参数固化于训练完成的时点,而现实世界中的知识和信息持续动态更新。 其二在非公开数据层面,企业内部的机密文档(如产品设计图、商业策略等)及个人隐…