深入理解GMP模型

深入理解GMP模型前言源码剖析数据段上重要的全局变量newproc创建协程Gruntime.gopark挂起Gruntime.goready唤醒Gsysmon监控线程schedult调度图解调度Goroutine调度器的GMP模型的设计思想(1)GMP模型简介(2)调度器的设计策略(3) “go func()”经历了什么过程(4)调度器的生命周期Go调度器GMP调度场景的全过程分析场景1:G1创建G2场景2:G1执行完毕场景3,4,5:G2开辟过多的G => G2的P本地队列满了再创建G7 =>
分类: 其他 发布时间: 11-27 08:34 阅读次数: 0

Golang底层原理剖析之垃圾回收GC

GC前置知识概念了解Go V1.3-标记清除法步骤缺点Go V1.5-三色标记法步骤图示去除STW的三色标记法的图示去除STW的三色标记法产生的问题Go V1.8-三色标记+混合写屏障“强-弱” 三色不变式强三色不变式弱三色不变式两种屏障方式插入写屏障介绍图示删除写屏障介绍图示两种屏障的缺点混合写屏障步骤混合写屏障的场景分析对象被堆对象删除引用,被栈对象引用对象被栈对象删除引用,被另一个栈对象引用对象被堆对象删除引用,被另一个堆对象引用对象被栈对象删除引用,被堆对象引用总结前置知识概念了解Root s
分类: 其他 发布时间: 11-27 08:34 阅读次数: 0

浅谈Golang T和*T方法集的关系

T和*T的方法集四种调用场景接口传值,调用值接收者接口传指针,调用指针接收者接口传指针,调用值接收者(success)接口传值,调用指针接收者(error)原因剖析总结四种调用场景接口传值,调用值接收者package maintype Iface interface { hello()}type Stu struct {}func (c Stu) hello() { panic("implement me")}func main(){ var IfTs Iface var s
分类: 其他 发布时间: 11-27 08:33 阅读次数: 0

Golang底层原理剖析之互斥锁sync.Mutex

互斥锁sync.MutexMutex概括Mutex.state状态标识Mutex源码剖析Mutex概括Mutex(Mutual exclusion),Go中Mutex的数据结构是这样的,因为足够简单,所以不需要额外的初始化,零值就是一个有效的互斥锁,处于Unlocked状态。state存储的是互斥锁的状态,加锁和解锁,都是通过atomic包提供的函数原子性,操作该字段。sema用作一个信号量,主要用于等待队列。Mutex有两种模式,在正常模式下,一个尝试加锁的goroutine会先自旋四次,自旋锁
分类: 其他 发布时间: 11-27 08:33 阅读次数: 0

浅谈Golang互斥锁sync.Mutex

sync.Mutex概述Mutex的数据结构Mutex.state的状态正常模式饥饿模式源码解析Lock正常模式饥饿模式Unlock概述Mutex的数据结构Go中Mutex的数据结构是这样的,因为足够简单,所以不需要额外的初始化,零值就是一个有效的互斥锁,处于Unlocked状态。state存储的是互斥锁的状态,加锁和解锁,都是通过atomic包提供的函数原子性,操作该字段。sema用作一个信号量,主要用于等待队列。type Mutex struct { state int32 sema ui
分类: 其他 发布时间: 11-27 08:33 阅读次数: 0

浅谈Golang信号量runtime.semaphore

runtime.semaphoreruntime.mutex操作系统提供同步原语sync.Mutex使用信号量runtime.semaphorechannel自己实现队列runtime.mutex操作系统提供同步原语理解了同步的本质,我们知道可以通过锁,来保护临界区操作的互斥性。如果尝试获得锁失败了,第一种策略是屡败屡战,不断重复尝试,直到成功获得锁或时间片耗完,这被称为自旋锁。第二种策略是让出CPU,进到等待队列里去,我们称之为调度器对象,通俗理解就是操作系统提供的线程间同步原语,一般以一组系统调用
分类: 其他 发布时间: 11-27 08:33 阅读次数: 0

Golang底层原理剖析之多路select、channel数据结构和阻塞与非阻塞

多路select和channel数据结构channel多路select浅谈channel send操作浅谈channel recv操作channel我们通过make创建一个缓冲区大小为5,元素类型为int的channel。ch是存在于函数栈帧上的一个指针,指向堆上的hchan数据结构。type hchan struct { qcount uint // 数组长度,即已有元素个数 dataqsiz uint // 数组容量,即可容纳元素个
分类: 其他 发布时间: 11-27 08:32 阅读次数: 0

Golang底层原理剖析之内存逃逸

内存逃逸堆/栈逃逸分析为什么需要逃逸怎么查看逃逸逃逸场景(什么情况才分配到堆中)1. 返回局部变量地址(指针)2. 编译阶段不能确定接口的动态类型(interface{})3. 栈空间不足导致逃逸(空间开辟过大)4. 无法判断当前切片长度时5. 闭包捕获变量并修改导致变量逃逸逃逸总结堆/栈堆(Heap):一般来讲是人为手动进行管理,手动申请、分配、释放。一般所涉及的内存大小并不定,一般会存放较大的对象。另外其分配相对慢,涉及到的指令动作也相对多。栈(Stack):由编译器进行管理,自动申请、分配、释
分类: 其他 发布时间: 11-27 08:32 阅读次数: 0

7天用Go从零实现Web框架Gee教程

7天用Go从零实现Web框架Gee教程前言Day0 序言设计一个框架Day1 HTTP基础标准库启动web服务实现http.Handler接口Gee框架的雏形main.go和gee.go解析运行测试前言本文学习自geektutu/7days-golang在此基础上加入自己的学习历程与理解Day0 序言设计一个框架设计框架之前,需要知道为什么要使用框架,框架能解决什么问题,只有明白了这一点,才能设计出框架中的功能`net/heep简单的处理请求示例`func main() { htt
分类: 其他 发布时间: 11-27 08:32 阅读次数: 0

golang数据结构篇之栈和队列以及简单标准库

数据结构篇栈队列sortmathcopy类型转换栈//创建栈 stack := make([]int, 0) //push压入栈 stack = append(stack, 10) //pop弹出 v := stack[len(stack)-1] stack = stack[:len(stack)-1] //检查栈空 len(stack) == 0队列//创建队列queue := make([]int, 0)//enqueue入队queue = append(queue, 1
分类: 其他 发布时间: 11-27 08:32 阅读次数: 0

golang力扣leetcode 128. 最长连续序列

128. 最长连续序列128. 最长连续序列题解代码128. 最长连续序列128. 最长连续序列题解题目要求在一个数组中找出一个数字最长连续序列,还要是On的复杂度首先把所有数字存在map里面,然后遍历map,此时要对current进行判断,如果hashmap[current-1]存在,那就跳过这次循环,因为我们要去找最小的一个数,如果不存在,这么那个数字必定是某个连续序列中首位数字,这个时候去计数hashmap[current+1]有几个,即可。外层循环需要 O(n)的时间复杂度,只有当一个数是
分类: 其他 发布时间: 11-27 08:31 阅读次数: 0

golang随笔之slice+append的陷阱

slice+append问题初探解析总结Go中没有引用传递问题初探package mainimport "fmt"func main() { s1 := []int{1, 2} s2 := s1 s2 = append(s2, 3) Test1(s1) Test1(s2) fmt.Println(s1, s2)}func Test1(s []int) { s = append(s, 0) for i := range s { s[i]++ }}A:[2,3]
分类: 其他 发布时间: 11-27 08:31 阅读次数: 0

golang数据结构篇之二叉树

二叉树二叉树遍历递归遍历前序非递归中序非递归后续非递归DFS 深搜-从上到下DFS 深搜-从下向上(分治法)BFS 层次遍历二叉树遍历前序遍历:先访问根节点,再前序遍历左子树,再前序遍历右子树中序遍历:先中序遍历左子树,再访问根节点,再中序遍历右子树后序遍历:先后序遍历左子树,再后序遍历右子树,再访问根节点以根访问顺序决定是什么遍历左子树都是优先右子树递归遍历前中后序递归遍历换换位置即可func preorderTraversal(root *TreeNode) { if root
分类: 其他 发布时间: 11-27 08:31 阅读次数: 0

golang力扣leetcode 104. 二叉树的最大深度

104. 二叉树的最大深度104. 二叉树的最大深度题解代码104. 二叉树的最大深度104. 二叉树的最大深度题解思路就是递归,分治法,分而治之跟着代码想这个图即可理解代码/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */func maxDepth(root *Tree
分类: 其他 发布时间: 11-27 08:31 阅读次数: 0

golang数据结构篇之分治法

分治法思想分治法遍历二叉树归并排序快排思想先分别处理局部,再合并结果。分而治之。使用场景:快速排序归并排序二叉树相关问题分治法模板递归返回条件分段处理合并结果func traversal(root *TreeNode) ResultType { // nil or leaf if root == nil { // do something and return } // Divide ResultType left =
分类: 其他 发布时间: 11-27 08:30 阅读次数: 0

golang力扣leetcode 110. 平衡二叉树

110. 平衡二叉树110. 平衡二叉树题解代码110. 平衡二叉树110. 平衡二叉树题解思路用分治法,左边平衡 && 右边平衡 && 左右两边高度 <= 1才为true代码/** * Definition for a binary tree node. * type TreeNode struct { * Val int * Left *TreeNode * Right *TreeNode * } */func i
分类: 其他 发布时间: 11-27 08:30 阅读次数: 0

Golang随笔之《Go专家编程》查漏补缺

《Go专家编程》前言第一章 常见数据结构的实现原理管道普通使用场景v, ok := <-ch的ok含义读写channel底层逻辑图例slice简单表达式:扩展表达式:解释iota本质string双引号和反单引号的区别string的注意点for-rangerange不同类型的区别前言本文仅作书籍阅读笔记,查漏补缺第一章 常见数据结构的实现原理管道普通使用场景读写nil管道均会阻塞,而且是永久阻塞关闭的管道仍然可以读取数据向关闭的管道写数据会触发panicv, ok := <-
分类: 其他 发布时间: 11-27 08:30 阅读次数: 0

golang力扣leetcode 124. 二叉树中的最大路径和

124. 二叉树中的最大路径和124. 二叉树中的最大路径和题解代码124. 二叉树中的最大路径和124. 二叉树中的最大路径和题解思路,递归,大问题分解成小问题代码package mainimport "math"type TreeNode struct { Val int Left *TreeNode Right *TreeNode}func maxPathSum(root *TreeNode) int { maxSum := math.MinInt32 var
分类: 其他 发布时间: 11-27 08:30 阅读次数: 0

golang力扣leetcode 236. 二叉树的最近公共祖先

236. 二叉树的最近公共祖先236. 二叉树的最近公共祖先题解代码236. 二叉树的最近公共祖先236. 二叉树的最近公共祖先题解思路:要找最近的公共祖先,直接递归左右子树,直到左右子树都有的时候,就是答案了代码package mainfunc main() {}type TreeNode struct { Val int Left *TreeNode Right *TreeNode}func lowestCommonAncestor(root, p, q *Tr
分类: 其他 发布时间: 11-27 08:29 阅读次数: 0

golang力扣leetcode 102. 二叉树的层序遍历

102. 二叉树的层序遍历102. 二叉树的层序遍历题解代码102. 二叉树的层序遍历102. 二叉树的层序遍历题解简单的队列,比较考验语法熟练度而已。。注意27行那里有个坑,应该是queue[0],而不是queue[i],因为每次都出队了,下一个索引位置肯定还是0代码package mainfunc main() {}type TreeNode struct { Val int Left *TreeNode Right *TreeNode}func levelO
分类: 其他 发布时间: 11-27 08:29 阅读次数: 0