自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(27)
  • 收藏
  • 关注

原创 etcd 一些机制

checkquorum机制:每隔一段时间,leader节点会尝试连接集群中的节点(发送心跳),如果发现自己可以连接到的节点个数没有超过半数,则主动切换成follower状态。这样在网络分区的情况下,旧的leader节点可以很快的知道自己已经过期了。PreVote优化当follower节点准备发起选举时候,先连接其他节点,并询问它们是否愿意参与选举(其他人是否能正常收到leader节点的信息),当有半数以上节点响应并参与则可以发起新一轮选举。...

2020-11-18 11:50:02 227

原创 etcd 源码分析之unstable

unstable对于leader节点:维护了客户端请求对应的entry记录对于follower节点:维护从leader复制来的entrytype unstable struct { // 快照数据,未写入storage的 snapshot *pb.Snapshot // 未写入storage的entry entries []pb.Entry // entries中第一条entry记录的索引值 offset uint64 logger Logger}尝试获取第一和最后// ma

2020-11-18 11:49:18 300

原创 etcd 源码分析之storage

MemoryStorage在内存上维护状态信息、快照数据、Entrytype MemoryStorage struct { // Protects access to all fields. Most methods of MemoryStorage are // run on the raft goroutine, but Append() is run on an application // goroutine. sync.Mutex //状态信息(当前任期,当前节点投票给了谁,已

2020-11-17 14:38:27 271

原创 etcd 源码分析之raftLog

raftLog管理节点上的日志(数据)type raftLog struct { // memoryStorage实例 storage Storage // unstable 实例 unstable unstable // 已提交的位置 committed uint64 // 已应用的位置 applied uint64 logger Logger // maxNextEntsSize是从对nextEnts的调用返回的消息的最大总数字节大小 maxNextEntsSize

2020-11-17 14:38:06 174

原创 etcd 源码分析之raft&config

raft 结构体type raft struct { id uint64 //集群中的标识 Term uint64 //当前任期 Vote uint64 //当前任期投票给了谁 readStates []ReadState // the log raftLog *raftLog //本地log maxMsgSize uint64 //单条消息最大字节 maxUncommittedSize uint64 //最大为commit数量 // TODO(tbg):

2020-11-17 14:37:43 169

原创 golang 一些知识

抽象语法树(AST)用树状的方式表示编程语言的语法结构。抽象语法树中的每一个节点都表示源代码中的一个元素,每一颗子树都表示一个语法元素。静态单赋值(Static Single Assignment, SSA)如果一个中间代码具有静态单赋值的特性,那么每个变量就只会被赋值一次。指令集不同的处理器使用了不同的架构和机器语言,所以很多编程语言为了在不同的机器上运行需要将源代码根据架构翻译成不同的机器代码。复杂指令集计算机(CISC)和精简指令集计算机(RISC)是目前的两种 CPU 区别· 复杂指令

2020-11-17 14:37:00 116

原创 golang 源码分析之select

select让 Goroutine 同时等待多个 Channel 的可读或者可写.在多个文件或者 Channel 发生状态改变之前,select 会一直阻塞当前线程或者 Goroutine。select 是一种与 switch 相似的控制结构。select 中虽然也有多个 case,但是这些 case 中的表达式必须都是 Channel 的收发操作。scase:runtime.scase(select 控制结构中的 case )type scase struct { c

2020-11-17 14:36:39 266

原创 golang 源码分析之 网络轮询器

网络轮询器为了提高 I/O 多路复用的性能,不同的操作系统也都实现了自己的 I/O 多路复用函数,例如:epoll、kqueue 和 evport 等。Go 语言为了提高在不同操作系统上的 I/O 操作性能,使用平台特定的函数实现了多个版本的网络轮询模块src/runtime/netpoll_epoll.gosrc/runtime/netpoll_kqueue.gosrc/runtime/netpoll_solaris.gosrc/runtime/netpoll_windows.gosrc/

2020-11-17 14:36:06 502 1

原创 golang 源码分析之scheduler调度器

单线程调度器 · 0.x只包含 40 多行代码;程序中只能存在一个活跃线程,由 G-M 模型组成;多线程调度器 · 1.0允许运行多线程的程序;全局锁导致竞争严重;任务窃取调度器 · 1.1引入了处理器 P,构成了目前的 G-M-P 模型;在处理器 P 的基础上实现了基于工作窃取的调度器;在某些情况下,Goroutine 不会让出线程,进而造成饥饿问题;时间过长的垃圾回收(Stop-the-world,STW)会导致程序长时间无法工作;抢占式调度器 · 1.2 ~ 至今基于协作的抢占

2020-11-17 14:35:16 364

原创 golang 源码分析之channel

channelchannel分为有阻塞的和无阻塞的,其实关键就是在于是否有capacity。已关闭的channal再次关闭会触发panic注意下已关闭的channal发送消息,会触发panic分析:先在runtime包里找到chan.gotype hchan struct { //队列中目前的元素计数 qcount uint // total data in the queue //环形队列的总大小 dataqsiz uint // si

2020-11-17 14:34:37 283

原创 golang 源码分析之sync

sync 同步sync.Mutexsync.RWMutexsync.WaitGroupsync.Oncesync.CondMutex// A Mutex must not be copied after first use.type Mutex struct { state int32 sema uint32}mutex.Lock()func (m *Mutex) Lock() { // 先看看能不能直接获取到 if atomic.CompareAndSwapInt32(

2020-11-17 14:34:04 145

原创 golang 源码分析之context

context上下文 context.Context 是用来设置截止日期、同步信号,传递请求相关值的结构体。该接口定义了四个需要实现的方法Deadline — 返回 context.Context 被取消的时间,也就是完成工作的截止日期;Done — 返回一个 Channel,这个 Channel 会在当前工作完成或者上下文被取消之后关闭,多次调用 Done 方法会返回同一个 Channel;Err — 返回 context.Context 结束的原因,它只会在 Done 返回的 Channel

2020-11-17 14:33:17 107

原创 golang 之make&new

make&newmake 的作用是初始化内置的数据结构,切片、哈希表和 Channelnew 的作用是根据传入的类型分配一片内存空间并返回指向这片内存空间的指针(返回的是指针)Go 语言就将代表 make 关键字的 OMAKE 节点根据参数类型的不同转换成了 OMAKESLICE、OMAKEMAP 和 OMAKECHAN 三种不同类型的节点,这些节点会调用不同的运行时函数来初始化相应的数据结构。new 如果申请的内存为0,返回zerobase ,其他则在编译期转换成 runtime.ne

2020-11-16 17:52:32 108

原创 golang 源码分析之interface

概述接口的本质就是引入一个新的中间层,调用方可以通过接口与具体实现分离,解除上下游的耦合,上层的模块不再需要依赖下层的具体模块,只需要依赖一个约定好的接口。在 Go 中:实现接口的所有方法就隐式的实现了接口;Go 语言中接口的实现都是隐式的接口也是 Go 语言中的一种类型,它能够出现在变量的定义、函数的入参和返回值中并对它们进行约束,不过 Go 语言中有两种略微不同的接口,一种是带有一组方法的接口,另一种是不带任何方法的 interface{}不包含任何方法的 interface{} 类型efac

2020-11-16 17:51:00 196

原创 golang 源码分析之panic&recover

panic&recoverpanic 能够改变程序的控制流,函数调用panic 时会立刻停止执行函数的其他代码,并在执行结束后在当前 Goroutine 中递归执行调用方的延迟函数调用 deferrecover 可以中止 panic 造成的程序崩溃。它是一个只能在 defer 中发挥作用的函数,在其他作用域中调用不会发挥任何作用panic 只会触发当前 Goroutine 的延迟函数调用;recover 只有在 defer 函数中调用才会生效;panic 允许在 defer 中嵌套多次

2020-11-16 17:49:58 157

原创 golang 源码分析之defer

deferGo 语言的 defer 会在当前函数或者方法返回之前执行传入的函数。它会经常被用于关闭文件描述符、关闭数据库连接以及解锁资源。Go 语言 defer 语句的三种机制(来源网络)Golang 的 1.13 版本 与 1.14 版本对 defer 进行了两次优化堆上分配 在 Golang 1.13 之前的版本中,所有 defer 都是在堆上分配,该机制在编译时会进行两个步骤: 1、在 defer 语句的位置插入 runtime.deferproc,当被执行时,延迟

2020-11-16 17:48:45 269

原创 golang 源码分析之string

stringGo 语言中的字符串其实是一个只读的字节数组string 对应的结构type StringHeader struct { Data uintptr //指向底层数据 Len int //长度}type stringStruct struct { str unsafe.Pointer len int}字符串拼接concatstrings:runtime/concatstringsfunc concatstrings(buf *tmpBuf,

2020-11-16 17:47:21 295

原创 golang 源码分析之map

map的实现原理:hashhash表 O(1) 的读写性能非常优秀,提供了键值之间的映射。hash 的性能好不好主要看2点 :哈希函数和冲突解决方法go中利用拉链法实现哈希表装载因子:=元素数量 / 桶数量扩容后数据的迁移:只会发生在删除和写入过程,查询没有hmap : runtime/map.hmap// A header for a Go map.type hmap struct { // 当前的数量 count int // # live cells == size of

2020-11-16 17:46:18 163

原创 golang 源码分析之slice

切片切片就是动态数组,它的长度并不固定,我们可以随意向切片中追加元素,而切片会在容量不足时自动扩容。cmd/compile/internal/types.NewSlice// NewSlice returns the slice Type with element type elem.func NewSlice(elem *Type) *Type { //返回的结构体 TSLICE 中的 Extra 字段是一个只包含切片内元素类型的 Slice{Elem: elem} 结构, // 也就是说切片

2020-11-16 17:45:11 137

原创 bigCache 源码分析

BigCachetype BigCache struct { shards []*cacheShard //分片 lifeWindow uint64 //过期时间 clock clock //时间获取的方法 hash Hasher //hash算法 config Config //配置文件 shardMask uint64 //常量:分片数-1,用于&运算替换取模运算 maxShardSize ui

2020-11-16 17:42:50 448

原创 golang 实现归并排序、快速排序

归并排序// 归并排序// 主要是mergefunc MergeSort(arr []int) { arrLen := len(arr) if arrLen <= 1 { return } mergeSort(arr, 0, arrLen-1)}func mergeSort(arr []int, start, end int) { if start >= end { return } mid := (start + end) / 2 mergeSort(a

2020-11-16 17:36:58 141

原创 golang 实现二分查找、插入排序、冒泡排序、选择排序

二分查找// 二分func binarySearch(list []int, key int) int { low, high := 0, len(list)-1 for low <= high { mid := (low + high) / 2 if key < list[mid] { high = mid - 1 continue } if key > list[mid] { low = mid + 1 continue } re

2020-11-16 17:34:48 153

转载 go对get、post请求封装

Get请求封装//Get http get methodfunc Get(url string, params map[string]string, headers map[string]string) (*http.Response, error) { //new request req, err := http.NewRequest("GET", url, nil) if err...

2019-05-21 01:26:52 628

原创 计算机网络(一)——TCP/IP四层协议

TCP/IP的体系结构分为4层,它包括应用层、运输层、网络层、网络接口层。1、应用层应用层是体系结构中的最高层。应用层的任务是通过应用进程间的交互来完成特定网络应用。应用层协议定义的是应用进程间通信和交互的规则。如域名系统DNS,HTTP协议,SMTP协议等,应用层交互的数据单元称为报文。2、运输层运输层的任务就是负责向两台主机中进程之间的通信提供通用的数据传输服务。主要使用以...

2019-05-12 21:43:08 1099

原创 数据结构(二)——排序二叉树、红黑树、B-TREE

1、排序二叉树首先如果普通二叉树每个节点满足:左子树所有节点值小于它的根节点值,且右子树所有节点值大于它的根节点值,则这样的二叉树就是排序二叉树。1/1插入操作首先要从根节点开始往下找到自己要插入的位置(即新节点的父节点);具体流程是:新节点与当前节点比较,如果相同表示已经存在且不能再重复插入;如果小于当前节点,则到左子树中寻找,如果左子树为空则当前节点为要找的父节点,新节点插入到当前...

2019-05-12 21:13:07 384

原创 数据结构(一)——栈、队列、链表

1、栈(stack)栈(stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶(top)。它是后进先出(LIFO)的。对栈的基本操作只有 push(进栈)和 pop(出栈)两种,前者相当于插入,后者相当于删除最后的元素。public class Stack<T> { private T data[];//用数组表示栈元素 privat...

2019-05-12 20:59:19 196

原创 线程编程中踩的坑(一)

今天在进行线程编程中踩了一个坑先看一个无聊的例子:public class Myt { static boolean stop=false; public static void main(String[] args) throws InterruptedException { Thread thread =new Thread() { @Override publi...

2019-02-28 11:07:27 202 1

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除