网络地址转换(Network Address Translation,NAT)是一种将不同网络的地址转换为同一网络的地址,从而实现不同网络间数据传输的技术
Jan 30, 2024
CAS,是Compare And Swap(比较和替换)的简称,是一种无锁算法,它是一种乐观锁技术。能够在不使用锁的情况下,保证对数据操作的原子性,解决多线程之间变量同步的问题。因为不涉及锁操作,所以具有交高的性能。
Apr 16, 2021
Ring buffer(环形缓冲区)是一种用于在固定大小的存储空间中循环存储数据的数据结构。它也被称为循环缓冲区、环形队列或循环队列。Ring buffer 通常用于在需要连续写入数据而无需动态分配内存的场景,比如在嵌入式系统、实时系统和高性能应用中。
Mar 22, 2021
BBR是google的TCP阻塞控制算法,可以最大程度的利用带宽,提升网络传输速率。 Linux kernel 4.9 及以上已支持 tcp_bbr 1.查看系统内核版本: uname -r 看内核版本是否大于等于4.9,否则要升级内核,或者安装bbr。 2.开启BBR: echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf 3.保存生效: sysctl -p 4.检查BBR是否启用: [root@linux ~] sysctl net.ipv4.tcp_available_congestion_control net.ipv4.tcp_available_congestion_control = reno cubic bbr [root@linux ~] sysctl net.
Mar 13, 2021
一致性哈希(Consistent Hashing)是一种分布式哈希算法,用于将键(key)映射到节点的过程。它主要用于解决在分布式系统中,动态添加或移除节点时,如何有效地重新分配数据的问题。
Mar 9, 2021
操作符合 说明 < , « 标准输入重定向 >, », 1> , 1» 标准输出重定向 2> , 2» 标准错误重定向 &> 标准输出/错误重定向 m >& n 将m的输出合并到n m <& n 将n的输输入合并到m >:重定向 >>:重定向追加
Dec 11, 2020
func StudownWait(hook func()) { sign := make(chan os.Signal) signal.Notify(sign, os.Interrupt, os.Kill) <-sign if hook != nil { hook() } }
Nov 19, 2020
通常公司都会有自己的Git仓库,可能涉及到利用go get进行项目依赖的问题。 我们以Gitlab作为私有仓库为例,仓库地址为:gitlab.com。 私有仓库鉴权设置 go get默认采用的https下载项目依赖,而私有仓库一般采用的ssh key的方式鉴权,所以直接使用go get会出现https鉴权失败的问题,解决办法有两种。 1. 将https替换为ssh 这种方式适合在自己的电脑上使用。 让git执行 git clone https://gitlab.com/xx.git时,自动替换为执行git clone git@gitlab.etsus.net:xx.git,需要执行如下命令: git config --global url."git@gitlab.etsus.net:".insteadof "https://gitlab.etsus.net/" 2. 利用Gitlab 的 Access Token鉴权 在有些情况下,比如对于编译服务器,可能采用ssh key的方式权限太大,可以采用Access Token的方式来解决问题。
Nov 5, 2020
通常对程序进行编译的时候,可能带一些条件(如不同平台、架构有不同的代码实现),让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译。golang中,称之为编译约束,进行编译约束的方式有2种分别: 编译标签(build tag) 文件后缀 编译标签 (build tag) 在源码文件顶部添加注释,来决定文件是否参与编译 // +build <tags> <tags>说明: 以空格分开表示AND 以逗号分开表示OR !表示NOT 标签可以指定为以下内容: 操作系统,环境变量中GOOS的值,如:linux、darwin、windows等等。 操作系统的架构,环境变量中GOARCH的值,如:arch64、x86、i386等等。 使用的编译器,gc或者gccgo。 是否开启CGO,cgo。 golang版本号: 比如Go Version 1.1为go1.1,Go Version 1.12版本为go1.12,以此类推。 其它自定义标签,通过go build -tags指定的值。 例如,编译条件为(linux AND 386) OR (darwin AND (NOT cgo))
Nov 4, 2020
v1.3以前:STW 在Go语言1.3之前,Go的垃圾回收过程采用了一个称为STW(Stop-The-World)的方法。这意味着在进行垃圾回收时,所有的Go协程都会被停止,直到垃圾回收完成。这种方式可能会导致程序在垃圾回收期间出现短暂的停顿,影响了程序的响应性能。 垃圾回收的过程主要包括以下几个步骤: 标记(Marking):从根对象(如全局变量、活动栈、寄存器等)开始,通过一种深度优先搜索算法,标记所有可以访问到的对象为活动对象(live objects)。 清扫(Sweeping):遍历堆内存,将未被标记的对象回收,释放它们所占用的内存。 压缩(Compaction):对堆内存进行压缩,使得已回收的内存空间连续起来,以便后续的内存分配能够更加高效。 这个垃圾回收过程在1.3版本之前主要是通过暂停整个应用程序来执行的,因此在大型应用程序中可能会导致较长的停顿时间,对于对实时性要求较高的应用程序可能会有影响。 v1.3:Mark STW & Sweep 1.3版本中,go runtime分离了mark和sweep操作,和以前一样,也是先暂停所有任务执行并启动mark,mark完成后马上就重新启动被暂停的任务了,而是让sweep任务和普通协程任务一样并行的和其他任务一起执行。如果运行在多核处理器上,go会试图将gc任务放到单独的核心上运行而尽量不影响业务代码的执行。go team自己的说法是减少了50%-70%的暂停时间。 v1.5:三色标记算法 三色标记算法(也称为Tri-Color Marking Algorithm)是一种用于垃圾回收的算法,通常用于实现并发标记-清除垃圾回收器。该算法通过将对象标记为三种颜色(通常是白色、灰色和黑色)来跟踪对象的可达性,并在标记过程中处理引用的变化。 它将对象分为三种颜色表示,分别是白色、灰色和黑色。 白色(White):表示对象尚未被访问或标记。在初始标记之前,所有的对象通常都是白色的。在初始标记后,白色对象可能被标记为灰色或黑色。 灰色(Gray):表示对象已经被发现,但其引用的其他对象尚未被遍历。换句话说,灰色对象的引用链路尚未完全探索。在追踪阶段,会从灰色对象开始继续探索其引用的其他对象,并将这些对象标记为灰色。一旦所有引用的对象都被遍历,灰色对象就会被标记为黑色。 黑色(Black):表示对象已经被完全探索,即其引用的所有其他对象都已经被遍历过,并且它们的可达性已经确定。黑色对象是被保证是可达的,不会被垃圾回收器回收。一旦对象变为黑色,它就会保持这种状态,直到下一次垃圾回收过程。 初始化: 算法开始前,将所有的对象标记为白色(表示未访问)。 根节点标记: 从程序的根节点开始,例如全局变量、活跃线程的栈、寄存器等,将这些根节点指向的对象标记为灰色(表示待访问)。 标记阶段: 不断地从灰色对象集合中取出一个对象进行标记,然后遍历该对象引用的其他对象。对于每个被引用的对象: 如果该对象是白色的,则将其标记为灰色,并将其加入灰色对象集合。 如果该对象已经是灰色或黑色的,则不需要做任何操作。 标记结束: 当灰色对象集合为空时,标记阶段结束。 清除阶段: 遍历所有对象,将未标记的对象(即白色的对象)视为垃圾,进行回收或其他处理。同时,将所有标记为灰色的对象重新标记为黑色(表示已访问)。 结束: 清除阶段完成后,垃圾回收器的工作完成,可以继续应用程序的执行。 三色标记算法(Three-color marking algorithm)通常用于垃圾回收(Garbage Collection)中,特别是在分代垃圾回收中。该算法使用三种不同的颜色来标记内存中的对象,以区分它们的状态。通常情况下,这三种颜色是白色(White)、灰色(Gray)和黑色(Black)。以下是三色标记算法的一般步骤:
Nov 4, 2020