/android-chrome-192x192.png

ImCBC

自由 分享 合作

  

进程控制和通信(三) · 消息、信号、共享内存

本文详细介绍了进程间通信的三种方式:消息队列、信号和共享内存,并结合代码示例展示其实现与应用。消息队列通过内核空间共享内存实现进程间通信,支持多进程间消息区分;信号用于进程间的中断机制,需结合PID使用;共享内存允许进程在用户空间通信,但需解决同步问题。文章还介绍了信号量的概念及其在共享内存同步中的应用,信号量通过原子操作实现资源互斥与同步。作者提供了完整代码示例,涵盖发送端、接收端及信号量的使用,适合深入学习进程通信的读者。

进程、线程和协程概念

本文介绍了进程、线程和协程的基本概念及其区别,进程是操作系统资源分配的最小单位,线程是任务执行的最小单位,协程则是用户态的轻量级线程。文章详细阐述了进程的内存管理机制,包括虚拟内存和内存映射表的工作原理,解释了线程共享进程资源的特性及其切换开销较低的原因。协程的特点是完全由用户控制,不涉及内核态切换,文章还提出了协程与串行的区别及协程库实现的疑问,适合对操作系统概念感兴趣的读者。

C++类的内存分布

本文探讨了C++类的内存分布,重点分析类成员函数、成员变量、虚表的内存布局及其共享机制。通过代码示例和gdb调试,作者验证了类成员函数地址与实例地址分离,所有实例共享一份函数;成员变量地址紧随实例地址,不同实例维护独立变量;派生类继承基类成员变量时会复制而非共享内存。此外,虚表地址与实例地址分离,所有实例共享一份虚表,编译器通过添加__vptr指针指向虚表地址。文章提供了详细实验过程和结论,适合深入理解C++内存管理的读者。

数据结构与算法之字符串匹配

本文介绍了字符串匹配的两种经典算法:暴力匹配(BF)和Boyer-Moore(BM)算法。BF算法通过逐字符比较主串和模式串,时间复杂度为O(mn)。BM算法利用坏字符和好前缀规则,从右向左匹配,显著减少比较次数,时间复杂度更优。文章详细讲解了BM算法的两条规则及其实现原理,并提供了C++代码示例,包括坏字符和好前缀的预处理和匹配逻辑。BM算法通过提高空间复杂度换取时间效率,适用于大规模字符串匹配场景。

struct位域

本文详细介绍了C++中struct位域的使用方法及其内存对齐规则,指出位域大小总是最大标识符的整数倍。通过代码示例,作者展示了如何定义和操作位域,并分析了小端和大端存储模式对位域数据的影响。此外,文章还通过汇编代码解析了位域的实现原理,强调了位域在节省内存和精确控制数据存储方面的优势。

使用CICD自动部署

本文介绍了如何使用GitHub Actions和GitLab CI/CD实现自动化编译和部署。作者以个人博客为例,展示了通过GitHub Actions自动编译Hugo项目并部署到阿里云OSS的配置流程,同时分享了在GitLab中进行接口测试的CI/CD配置。文章强调了CI/CD工具在提高开发效率和代码质量中的重要作用,并建议根据需求灵活配置。

不同分支存储不同内容

本文介绍了如何在同一个Git仓库中使用不同分支存储不同内容的实践方法。作者通过配置Git子模块,将Hugo框架、文章内容和Live2D模型分别存储在master、content和live2d分支中,实现了内容的分离和低耦合。此方法便于备份和迁移特定内容,同时支持多分支协作开发。文章还提到使用CI/CD流程自动编译和部署网站源码,进一步提升了开发效率。

为什么推荐加const或constexpr修饰常量

本文通过代码示例和汇编分析,解释了在C++中使用const或constexpr修饰常量的优势。作者指出,这些修饰符可以避免额外的内存占用和赋值操作,从而提高程序性能。同时,文章提到const/constexpr修饰的常量在反汇编后可能暴露其值,存在一定的安全性问题。通过对比未修饰和修饰后的代码,作者直观地展示了性能优化的效果。

数据结构与算法之图

本文介绍了图的基本概念及其存储方式,包括邻接表的实现。重点讲解了图的两种遍历方法:广度优先搜索(BFS)和深度优先搜索(DFS),分别通过open-close表实现,并提供了详细的代码示例。文章还分析了图在实际场景中的应用,如地图、好友关系和编译器依赖关系。

数据结构与算法之单调栈

本文讲解了单调栈的概念及其构建方法,分析了单调递增和递减栈的实现过程,并通过状态机的方式实现了单调栈的构建。文章还以LeetCode题目“每日温度”为例,展示了单调栈在解决“第一个比当前大/小的元素”问题中的应用,提供了详细的代码实现和逻辑分析。