Go sync.Map 实现

Go基于CSP模型,提倡”Share memory by communicating; don’t communicate by sharing memory.”,亦即通过channel来实现goroutine之间的数据共享,但很多时候用锁仍然是不可避免的,它可以让流程更直观明了,并且减少内存占用等。通常我们的实践是用channel传递数据的所有权,分配工作和同步异步结果等,而用锁来共享状态和配置等信息。

本文从偏实现的角度学习下Go的atomic.Load/Store,atomic.Value,以及sync.Map。

阅读更多

Go Interface 实现

本文从源码的角度学习下Go接口的底层实现,以及接口赋值,反射,断言的实现原理。作为对比,用到了go1.8.6和go1.9.1两个版本。

1. eface

空接口通过eface结构体实现,位于runtime/runtime2.go:

阅读更多

Go 调度模型

G P M 模型

定义于src/runtime/runtime2.go:

  • G: Gourtines, 每个Goroutine对应一个G结构体,G保存Goroutine的运行堆栈,即并发任务状态。G并非执行体,每个G需要绑定到P才能被调度执行。
  • P: Processors, 对G来说,P相当于CPU核,G只有绑定到P(在P的local runq中)才能被调度。对M来说,P提供了相关的执行环境(Context),如内存分配状态(mcache),任务队列(G)等
  • M: Machine, OS线程抽象,负责调度任务,和某个P绑定,从P的runq中不断取出G,切换堆栈并执行,M本身不具备执行状态,在需要任务切换时,M将堆栈状态写回G,任何其它M都能据此恢复执行。

阅读更多

常见GC算法

先来看看GC(自动垃圾回收)的主要问题:

  1. 额外的开销(内存/CPU)
  2. 执行GC的时机无法预测,在实时性要求高的场景或事务处理来说可能是不可容忍的
  3. 部分GC算法会Stop-the-world

各语言运行时在选取GC算法时,都要从这几个方面进行衡量与取舍,下面是一些常见的GC算法。

阅读更多

Hexo使用mathjax渲染公式

最近有在博客中嵌入公式的需求,目前主要有两个数学公式渲染引擎mathjax和KaTeX,前者应用更广泛,支持的语法更全面,因此这里简述将mathjax整合到hexo。

阅读更多

docker 网络模式

以Docker为平台部署服务器时,最应该理解透彻的便是网络配置。离上次学习,Docker网络又更新了不少内容,重新温习一下。

阅读更多

探讨服务端回合制战斗系统

本文记录最近做战斗系统的一些心得和思考,由于我们的战斗系统是回合制的,与大部分回合制游戏一样,需要服务器计算战斗,客户端以战报的方式回放。这里探讨一下服务端战斗系统的设计思路,实现一个灵活,可配置,扩展性强的战斗系统。

阅读更多

用context库规范化Go的异步调用

常见并发模型

之前对比过Go和Erlang的并发模型,提到了Go的优势在于流控,下面列举几种常见的流控:

阅读更多

Go vs Erlang

源于从Erlang到Go的一些思维碰撞,就像当初从C++到Erlang一样,整理下来记于此。

阅读更多

Erlang+Lua的一次重构

目前所在的项目基于erlang cluster搭建框架,再接入lua用于写逻辑。由于之前有一些erlang+lua的开发经验,因此着手项目的重构和优化,过程中一些体会,记录于此。

阅读更多