IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

标签:状态机

共 2 篇相关文章

IT 累计浏览 2,650

ERLANG OTP源码分析 – gen_fsm

这篇文章从一个有趣的视角切入,对比分析了Erlang/OTP中`gen_fsm`与更为人熟知的`gen_server`模块。作者没有停留在概念表面,而是直接深入源码,揭示了两者在实现层面的核心差异。 关键的突破口在于进程状态的管理。`gen_server`中,进程主要通过一个统一的状态数据(`StateData`)来记住上下文。而`gen_fsm`则在递归循环中引入了一个额外的原子型状态名称(`StateName`)。正是这个`StateName`,像一个路由开关,决定了下一次循环时具体调用哪个处理函数,从而实现了状态的流转与切换。 另一个精妙的对比在于消息驱动模式。`gen_server`通常遵循经典的“请求-响应”客户端/服务器模型,由外部调用者发送请求消息。然而`gen_fsm`的许多转换中,发送关键消息的往往是状态机自身——例如,在完成某个处理后主动通知另一个进程。这体现了它作为自主状态机的设计哲学。 归根结底,这篇文章拆解了`gen_fsm`作为“带名称的递归”这一核心实现思路。理解这一点,也就明白了为何它天生适合建模那些具有明确离散状态、并需要根据状态自主执行不同逻辑的流程。

IT 累计浏览 4,773

Lua GC 的源码剖析 (4)

这篇讲的是Lua垃圾回收(GC)中至关重要的标记(mark)过程实现。作为系列分析的第四篇,作者从GC的整体流程切入,将镜头聚焦到标记阶段:它如何从根集合出发,精准地标记出所有存活对象,同时避免程序在运行中修改对象引用而导致标记错误。 文章的核心在于剖析Lua采用的“三色标记法”与写屏障(write barrier)机制的协同工作。作者通过源码走读,展示了灰色、黑色、白色对象状态之间的转换逻辑,以及当黑色对象被赋予白色引用时,写屏障如何“拦截”并记录这一变化,确保后续能正确标记。实现上,Lua为不同状态的对象维护了不同的链表,这种设计让遍历和状态转移都十分高效。 更巧妙的是,Lua针对不同对象类型(如表、字符串、闭包)采用了差异化的标记策略。例如,对于表的标记会递归处理其键值对,而字符串则利用其不可变性简化了流程。这种细致的实现兼顾了正确性与性能。作者在剖析中也点出了这种设计背后对运行时效率和代码复杂度的权衡思考,让人看到一个高效GC背后的精巧工程实现。