Go语言反射 Posted on 2022-04-29 | Go语言版本 入口reflect.TypeOf和reflect.ValueOf两个函数会分别返回Type和Value两个结构,顾名思义,分别代表一个Go数据的类型和值。通过查看Type和Value的方法可以得出反射可以实现的功能。 12345type Value struct { ty ... Read more »
Go语言内存管理-内存释放 Posted on 2022-03-28 | 内存管理中涉及到内存释放的部分。文中使用Go版本为1.17.6 释放方法在《Go语言内存管理-底层视角》中提到,位于go/src/runtime/mgcscavenge.go中pageAlloc的方法scavengeRangeLocked会使用sysUnused将一段内存从ready状态转为pr ... Read more »
Go语言内存管理-番外篇之算法分析 Posted on 2022-03-25 | 内存管理涉及到的算法,主要包括队列、各种位运算。文中使用Go版本为1.17.6 位运算使用位移操作,实现各类算法 2的幂次判断一个正整型数字,是否是2的幂次方,例如 1=>false,2=>true 1234func IsPowerOf2 (n uint) bool { r ... Read more »
Go语言内存管理-顶层视角 Posted on 2022-03-24 | 内存管理涉及初始化、分配以及回收三个方面。文中使用Go版本为1.17.6 概览为减少分配时的竞争,go内存管理借鉴TCMALLOC的分级管理思想,每一个P(G-M-P,参考Go的调度管理)有自己的内存结构mcache,同一个P内的G分配内存时不需要加锁。当P内无内存可分配时,通过加锁,使用mce ... Read more »
Go语言内存管理-底层视角 Posted on 2022-03-21 | 内存管理涉及初始化、分配以及回收三个方面。文中使用Go版本为1.17.6 系统调用GO使用mmap和munmap调用操作系统进行内存分配和释放。mmap和munmap原型如下: 123456#include <sys/mman.h>void *mmap(void *addr, siz ... Read more »
raft笔记 Posted on 2022-01-12 | raft论文笔记,备忘和参考.读取之前需要读一下链接中的论文 服务状态每个服务都会保存如下状态: CurrentTerm:当前的term值.如果接收到请求或者响应的term T > CurrentTerm,则变更CurrentTerm为T,并且变更角色为follower VotedFor ... Read more »
如何写一篇技术文章 Posted on 2022-01-10 | 提炼一种能够写出通熟易懂技术文章的方法,以Go语言的网络轮询器netpoller的介绍为例 Morsing’s BlogThe Go NetpollerMorsing’ Blog中关于netpoller的文章在码农桃花源讲调度器以及Draven的<<Go语言设计与实现>> ... Read more »
如何实现一个数据库 Posted on 2022-01-07 | 关于数据库大家都不陌生,例如关系型数据库Mysql,其InnoDB存储引擎以一颗B+树来组织数据;Key-Value存储Redis,数据放到内存中,以一个HashTable来组织数据,根据Value的数据类型,又会使用双向链表、SkipList等结构来组织Value数据;分布式数据库Etcd,需要 ... Read more »
MQTT GO客户端实现 Posted on 2021-01-06 | Introduction上一篇文章通过spec对mqtt有了基本了解,接着通过一个mqtt go客户端的代码,看看具体的工程实现细节.具体代码参考链接 代码概览首先看看代码结构: 123456789101112131415161718192021222324252627282930313233343 ... Read more »
MQTT学习笔记 Posted on 2021-01-04 | Introduction关键特性:bandwidth-efficient,lightweight,high latency networks因为这些特性,所以MQTT很适合物联网的环境,从技术角度来说,消息队列有很多,为何MQTT会有这些特性呢?进一步,如何设计一个协议能达到这些特性. 加密端口8 ... Read more »