Web Analytics
yangyang

码农兼一个普普通通小青年

All Posts


C# 进程间通信深度解析:命名管道、TCP/IP 与内存映射文件

在现代软件架构中,无论是模块化的单体应用、面向服务的架构(SOA),还是日益普及的微服务部署,进程间通信(Inter-Process Communication, IPC)都已从一个简单的实现细节,演变为影响系统性能、安全性与可维护性的基石性架构决策。在此背景下,选择一种合适的 IPC 机制,不仅关乎数据传输的效率,更直接决定了整个系统的响应能力、资源消耗和技术债务。本文介绍了Windows平台上三种主流的IPC通讯方式:命名管道(Named Pipes), TCP/IP 套接字(TCP/IP Sockets),和内存映射文件(Memory-Mapped Files, MMF),给出了在一对一通讯场景下的企业级实现,并基于BenchmarkDotNet,使用乒乓测试的方式测试了三者的性能,结果显示,在本机IPC模式下,小字节的数据(16B,256B)传输下,内存映射文件的传输效率具有绝 …

NamedPipe IPC MMF TCPIP

使用内存映射文件实现进程间通讯

在前文浅谈内存映射文件中详细介绍了什么是内存映射文件(Memory-Mapped File, MMF),以及内存映射文件的用法。在其诸多应用中,很重要的一个就是进程间通讯(Inter-Process Communication,IPC)。内存映射文件允许将文件内容直接映射到进程的虚拟地址空间,使得应用程序能够像访问内存一样访问文件数据。但要正确和高效地使用内存映射文件进行进程间通讯则需要一些技巧,它需要处理多个进程对同一块内存区域进行高效的读写问题,这里就自然涉及到竞争和同步。本文首先介绍了一个简单的一对一的使用MMF进行进程间单向通讯的例子,紧接着指出其中的低效,然后通过引入环形队列数据结构来分隔读和写,从而达到移除锁的使用,进而大幅提高效率。最后在此基础上介绍了一对一双向通讯,以及一对多通讯的实现思路。 …

IPC Circular Queue MMF SPSC SPMC

浅谈内存映射文件

内存映射文件(Memory-Mapped File, MMF)允许将文件内容直接映射到进程的虚拟地址空间,使得应用程序能够像访问内存一样访问文件数据。这种机制通过操作系统虚拟内存管理器(Virtual Memory Manager, VMM)的深度集成,绕过了传统I/O操作中固有的数据复制和系统调用开销,从而在特定场景下实现数量级的性能提升。对于开发那些需要在I/O性能上达到极致的系统(如数据库、大数据分析平台、金融交易系统)而言,深入理解并掌握MMF是不可或缺的关键技能。 从传统I/O到内存映射的转变 传统的文件I/O,如通过FileStream进行的操作,其本质是指令驱动的。开发者通过Read、Write、Seek等命令,显式地请求操作系统在内核缓冲区和用户空间缓冲区之间移动数据 。这个过程涉及多次数据复制和频繁的上下文切换,是典型I/O瓶颈的根源。 相比之下,内存映射文件是一种状态驱 …

IPC MMF PMEM VMM MMU

浅谈环形队列数据结构

环形队列(Circular Queue),也被称为环形缓冲区(Circular Buffer)或环状缓冲区(Ring Buffer)。这是一个在高性能计算、底层驱动和实时系统中极为重要和常见的数据结构。环形队列有很多应用,比如音视频处理中的平滑地处理数据流,防止卡顿;操作系统内核中的I/O缓冲区、管道(Pipe)的实现;网络通信中用于收发网络数据包的缓冲区;以及使用内存映射文件进行进程间通讯时,使用环形缓冲区能够减少锁占用。 …

Circular Queue Ring Buffer

C++语言演化中的审慎原则

本文深入剖析了C++语言演化中所秉持的“审慎原则”,论证了标准委员会(WG21)通过有意识地拒绝或搁置某些语言特性,从而成功维护了C++的长期稳定性与核心设计哲学。报告通过四个关键案例展开论证:一、在处理多重继承的虚函数名冲突时,委员会选择推广设计模式(适配器模式)而非引入新“重命名”语法,以避免语言膨胀。二、面对双重分发的需求,它采纳了访问者模式,拒绝了可能导致对象模型过度复杂化的原生语言支持。三、它坚定地拒绝内置垃圾回收(GC)机制,以捍G卫RAII范式、零开销原则及性能的确定性,这些是C++的立身之本。四、在类型推导上,它没有直接采纳当时已有但存在瑕疵的typeof,而是精心设计了语义更精确的decltype,彰显了对语言基础工具正确性的极致追求。综上所述,这些决策共同揭示了C++标准化过程中的一种成熟智慧:通过审慎的“减法”来保证语言的健壮、高效与持久生命力 …

Visitor Pattern Double Dispatch RAII C++ Evolution Language Design Philosophy Prudence Principle Multiple Inheritance

CMake入门教程

CMake已经成为C++生态系统中事实上的标准构建系统生成器。它通过将复杂的构建逻辑抽象到一个统一的、跨平台的脚本语言中,极大地提高了项目的可维护性和可移植性。掌握现代CMake,特别是其基于目标的依赖管理思想,是每一位严肃的C++开发者必备的技能。本教程从CMake的基础工作流程和核心语法出发,深入探讨了作用域、库的构建与链接、条件编译以及高级模块化技术。我们强调了“源码外构建”的重要性,详细解析了PUBLIC、PRIVATE和INTERFACE关键字在传递依赖关系中的核心作用,并针对Linux平台特别讲解了RPATH和$ORIGIN在创建可重定位软件包中的应用。通过对比function与macro、target_sources与file(GLOB),我们阐明了现代CMake的最佳实践及其背后的设计哲学。最终,通过一个完整的实战项目,我们将所有理论知识融会贯通,展示了如何构建一个结构清晰 …

cmake Cross-Platform Out-of-Source Build RPATH Position-Independent Code Conditional Compilation target-link-libraries

Windows服务“伪运行”之谜:从一个时间同步服务的失灵谈起

本文通过一个时间同步服务的具体案例,深入探讨了Windows服务在“快速启动”模式下出现的“伪运行”问题。该问题的典型症状是:服务设置为自动启动,在“关机”再开机后,其状态显示为“正在运行”,却没有执行其OnStart方法中的关键启动任务(如首次时间同步)。文章剖析了此现象的根本原因在于Windows的快速启动机制。该机制通过休眠并恢复系统内核及服务进程来加速开机,这个过程会完全跳过OnStart方法,导致服务从一个过时的、无效的内存状态中“假醒”,成为“僵尸服务”。为解决此问题,文章提供了一套完整的排查与解决方案。首先,介绍了如何通过正确配置Windows事件日志来进行有效诊断,并指出了创建事件源的权限要点。其次,说明了如何通过禁用快速启动来快速验证问题根源。最终,文章给出了最健壮的根本性解决方案:在C#服务代码中重写OnPowerEvent方法,使其能够响应系统的Suspend …

Windows Service Fast Startup OnStart OnPowerEvent ResumeSuspend Hybrid Shutdown Event Log Service Troubleshooting

不止于值:解析.NET中“赋值即触发”的状态驱动事件模式

即便是给一个对象的属性赋上与它当前完全相同的值,相关的“已更改”(XXXChanged)事件依然被触发了。一个典型的例子就是在使用 System.Data.DataTable 或System.Configuration.ApplicationSettingsBase时。研究源码发现,ApplicationSettingsBase 和 DataTable 的“赋值即触发”行为,并非缺陷,而是.NET框架中一个优雅且实用的状态驱动事件模式的体现。它将数据容器从简单的值存储器提升为强大的状态机,极大地简化了数据持久化和同步的复杂性。它选择牺牲微不足道的判断性能,来换取核心功能(状态跟踪)的绝对可靠性。理解了其“关注状态,而非价值”的核心思想,并洞悉其源码实现后,我们就能根据实际场景,明智地选择是利用还是“修正”这一行为,从而编写出更健壮、更高效的.NET应用程序。 …

ApplicationSettingsBase PropertyChanged

使用NTP协议实现时间同步客户端和授时服务端

在之前写了两篇关于NTP的文章,一篇是使用NTP协议实现本地时间跟NTP授时服务器进行同步介绍了NTP协议的原理,另一篇是实现一个时间同步客户端NTPClock介绍了使用WPF编写一个模仿NTPClock的时间同步的App,因为Windows的自动较时功能不是很完善,所以这个应用我自己使用了很长时间。 在这篇文章里,我准备将前面两篇文章总结一下,对一些方法进行重构,另外实现一个利用NTP来实现授时的服务端,以完善整个功能。一般的我们都是使用一些公开的NTP授时服务地址,比如"time.windows.com"、"pool.ntp.org"等来获取时间,这有一些限制: 必须要求这个服务器能够访问和解析这些授时服务器地址,这在有些机房的内网计算机上其实是无法满足条件的。 这些公开的NTP授时服务器大多有请求频率限制,如果请求次数多过或过快,可能会请求失败。 有时候,我们有自己的GPS接收装置 …

NTP

浅析C#中异步编程以及TAP模式

虽然C#转眼间已经发展到了14.0版本,但有些在 C#5.0 引入并随.NET Framework 4.5一同发布的特性比如async和await我仍不是很清楚,然而这些新特性在一些人工智能生成的代码中使用的越来越多,因为它们确实能够提高异步编程时代码的清晰度,所以最近几天好好研究了一下它的原理。异步编程可以解决线程因为等待独占式任务而导致的阻塞,但异步编程一直是一个难点,如何正确实现异步模式却不容易,因为它涉及到诸如状态管理,异常管理,同步上下文,异步任务组合等等诸多问题。C#中有很多异步编程模型,最早的有APM (Asynchronous Programming Model) ,随后有EAP(Event-Based Asynchronous Pattern)以及建立在EAP基础上的BackgroundWorker等等,这些异步编程模型在场景比较简单时可能可以满足要求,但 …

Async Callback TAP APM EAP async await