咸菜拌白饭
末日未来临,上帝不审人。
  • 会员类型: 注册会员
  • 发表文章: 708 篇
  • 访问人气: 860 人气
  • 最近登录: 4月12日
circle-image
文章总计
708 篇文章
circle-image
评论次数
2 次评论
circle-image
访问总计
6.9w 阅读
circle-image
注册天数
237 天
Go goroutine的底层实现原理?

概念Goroutine可以理解为一种Go语言的协程(轻量级线程),是Go支持高并发的基础,属于用户态的线程,由Go runtime管理而不是操作系统。底层...

/ 0 评论 / 109 阅读 / 0 赞

Go原子操作和锁的区别?

原子操作由底层硬件支持,而锁是基于原子操作+信号量完成的。若实现相同的功能,前者通常会更有效率原子操作是单个指令的互斥操作;互斥锁/读写锁是一种数据结构,...

/ 0 评论 / 104 阅读 / 0 赞

Go 原子操作有哪些?

Go atomic包是最轻量级的锁(也称无锁结构),可以在不形成临界区和创建互斥量的情况下完成并发安全的值替换操作,不过这个包只支持int32/int64...

/ 0 评论 / 110 阅读 / 0 赞

Go 可重入锁如何实现?

概念:可重入锁又称为递归锁,是指在同一个线程在外层方法获取锁的时候,在进入该线程的内层方法时会自动获取锁,不会因为之前已经获取过还没释放再次加锁导致死锁为...

/ 0 评论 / 114 阅读 / 0 赞

Go 读写锁的实现原理?

概念:读写互斥锁RWMutex,是对Mutex的一个扩展,当一个 goroutine 获得了读锁后,其他 goroutine可以获取读锁,但不能获取写锁;...

/ 0 评论 / 95 阅读 / 0 赞

Go 互斥锁允许自旋的条件?

线程没有获取到锁时常见有2种处理方式:-   一种是没有获取到锁的线程就一直循环等待判断该资源是否已经释放锁,这种锁也叫做自旋锁,它不用将线程阻塞起来, ...

/ 0 评论 / 112 阅读 / 0 赞

Go 互斥锁正常模式和饥饿模式的区别?

在Go一共可以分为两种抢锁的模式,一种是正常模式,另外一种是饥饿模式。正常模式(非公平锁)在刚开始的时候,是处于正常模式(Barging),也就是,当一个...

/ 0 评论 / 143 阅读 / 0 赞

Go 互斥锁的实现原理?

Go sync包提供了两种锁类型:互斥锁sync.Mutex 和 读写互斥锁sync.RWMutex,都属于悲观锁。概念:Mutex是互斥锁,当一个 go...

/ 0 评论 / 86 阅读 / 0 赞

Go channel有无缓冲的区别?

无缓冲:一个送信人去你家送信,你不在家他不走,你一定要接下信,他才会走。 有缓冲:一个送信人去你家送信,扔到你家的信箱转身就走,除非你的信箱满了,他必须等...

/ 0 评论 / 114 阅读 / 0 赞

Go channel发送和接收什么情况下会死锁?

死锁:单个协程永久阻塞两个或两个以上的协程的执行过程中,由于竞争资源或由于彼此通信而造成的一种阻塞的现象。channel死锁场景:非缓存channel只写...

/ 0 评论 / 140 阅读 / 0 赞

Go channel共享内存有什么优劣势?

“不要通过共享内存来通信,我们应该使用通信来共享内存” 这句话想必大家已经非常熟悉了,在官方的博客,初学时的教程,甚至是在 Go 的源码中都能看到无论是通...

/ 0 评论 / 111 阅读 / 0 赞

Go channel如何控制goroutine并发执行顺序?

多个goroutine并发执行时,每一个goroutine抢到处理器的时间点不一致,gorouine的执行本身不能保证顺序。即代码中先写的gorouine...

/ 0 评论 / 101 阅读 / 0 赞

Go channel为什么是线程安全的?

为什么设计成线程安全?不同协程通过channel进行通信,本身的使用场景就是多线程,为了保证数据的一致性,必须实现线程安全如何实现线程安全的?channe...

/ 0 评论 / 103 阅读 / 0 赞

Go channel有什么特点?

channel有2种类型:无缓冲、有缓冲channel有3种模式:写操作模式(单向通道)、读操作模式(单向通道)、读写操作模式(双向通道)     写操作...

/ 0 评论 / 114 阅读 / 0 赞

Go channel的底层实现原理?

概念:Go中的channel 是一个队列,遵循先进先出的原则,负责协程之间的通信(Go 语言提倡不要通过共享内存来通信,而要通过通信来实现内存共享,CSP...

/ 0 评论 / 160 阅读 / 0 赞

Go map和sync.Map谁的性能好,为什么?

Go 语言的 sync.Map 支持并发读写,采取了 “空间换时间” 的机制,冗余了两个数据结构,分别是:read 和 dirtytype Map str...

/ 0 评论 / 112 阅读 / 0 赞

Go map如何扩容?

扩容时机:在向 map 插入新 key 的时候,会进行条件检测,符合下面这 2 个条件,就会触发扩容if !h.growing() && ...

/ 0 评论 / 110 阅读 / 0 赞

Go map 的负载因子为什么是 5?

什么是负载因子?负载因子(load factor),用于衡量当前哈希表中空间占用率的核心指标,也就是每个 bucket 桶存储的平均元素个数。负载因子 =...

/ 0 评论 / 116 阅读 / 0 赞

Go map冲突的解决方式?

比较常用的Hash冲突解决方案有链地址法和开放寻址法:链地址法当哈希冲突发生时,创建新单元,并将新单元添加到冲突单元所在链表的尾部。开放寻址法当哈希冲突发...

/ 0 评论 / 89 阅读 / 0 赞

Go map如何查找?

Go 语言中读取 map 有两种语法:带 comma 和 不带 comma。当要查询的 key 不在 map 里,带 comma 的用法会返回一个 boo...

/ 0 评论 / 108 阅读 / 0 赞

Go map为什么是非线程安全的?

map默认是并发不安全的,同时对map进行并发读写时,程序会panic,原因如下:Go 官方在经过了长时间的讨论后,认为 Go map 更应适配典型使用场...

/ 0 评论 / 108 阅读 / 0 赞

Go map遍历为什么是无序的?

使用 range 多次遍历 map 时输出的 key 和 value 的顺序可能不同。这是 Go 语言的设计者们有意为之,旨在提示开发者们,Go 底层实现...

/ 0 评论 / 94 阅读 / 0 赞

Go map的底层实现原理

Go中的map是一个指针,占用8个字节,指向hmap结构体源码包中src/runtime/map.go定义了hmap的数据结构:hmap包含若干个结构为b...

/ 0 评论 / 126 阅读 / 0 赞

Go slice为什么不是线程安全的?

先看下线程安全的定义:多个线程访问同一个对象时,调用这个对象的行为都可以获得正确的结果,那么这个对象就是线程安全的。若有多个线程同时执行写操作,一般都需要...

/ 0 评论 / 141 阅读 / 0 赞

Go slice扩容机制?

扩容会发生在slice append的时候,当slice的cap不足以容纳新元素,就会进行扩容,扩容规则如下如果新申请容量比两倍原有容量大,那么扩容后容量...

/ 0 评论 / 115 阅读 / 0 赞

Go slice深拷贝和浅拷贝

深拷贝:拷贝的是数据本身,创造一个新对象,新创建的对象与原对象不共享内存,新创建的对象在内存中开辟一个新的内存地址,新对象值修改时不会影响原对象值实现深拷...

/ 0 评论 / 96 阅读 / 0 赞

Go array和slice的区别?

1)数组长度不同数组初始化必须指定长度,并且长度就是固定的切片的长度是不固定的,可以追加元素,在追加时可能使切片的容量增大2)函数传参不同数组是值类型,将...

/ 0 评论 / 120 阅读 / 0 赞

Go slice的底层实现原理

切片是基于数组实现的,它的底层是数组,可以理解为对 底层数组的抽象。源码包中src/runtime/slice.go 定义了slice的数据结构:type...

/ 0 评论 / 109 阅读 / 0 赞

Go内置函数make和new的区别?

首先纠正下make和new是内置函数,不是关键字变量初始化,一般包括2步,变量声明 + 变量内存分配,var关键字就是用来声明变量的,new和make函数...

/ 0 评论 / 117 阅读 / 0 赞

Go defer关键字的实现原理?

定义:defer 能够让我们推迟执行某些函数调用,推迟到当前函数返回前才实际执行。defer与panic和recover结合,形成了Go语言风格的异常与捕...

/ 0 评论 / 81 阅读 / 0 赞

Go函数参数传递到底是值传递还是引用传递?

先说下结论:Go语言中所有的传参都是值传递(传值),都是一个副本,一个拷贝。参数如果是非引用类型(int、string、struct等这些),这样就在函数...

/ 0 评论 / 94 阅读 / 0 赞

Go函数返回局部变量的指针是否安全?

一般来说,局部变量会在函数返回后被销毁,因此被返回的引用就成为了"无所指"的引用,程序会进入未知状态。但这在 Go 中是安全的,Go 编译器将会对每个局部...

/ 0 评论 / 111 阅读 / 0 赞

Go方法值接收者和指针接收者的区别?

如果方法的接收者是指针类型,无论调用者是对象还是对象指针,修改的都是对象本身,会影响调用者;如果方法的接收者是值类型,无论调用者是对象还是对象指针,修改的...

/ 0 评论 / 79 阅读 / 0 赞

Go方法与函数的区别?

在Go语言中,函数和方法不太一样,有明确的概念区分。其他语言中,比如Java,一般来说函数就是方法,方法就是函数;但是在Go语言中,函数是指不属于任何结构...

/ 0 评论 / 124 阅读 / 0 赞

GC 如何调优

通过 go tool pprof 和 go tool trace 等工具 控制内存分配的速度,限制 Goroutine 的数量,从而提高赋值器对 CPU ...

/ 0 评论 / 112 阅读 / 0 赞

Go 语言中 GC 的流程是什么?

Go1.14 版本以 STW 为界限,可以将 GC 划分为五个阶段:GCMark 标记准备阶段,为并发标记做准备工作,启动写屏障 STWGCMark 扫描...

/ 0 评论 / 117 阅读 / 0 赞

GC 触发时机

主动触发:调用 runtime.GC被动触发:使用系统监控,该触发条件由 runtime.forcegcperiod 变量控制,默认为 2 分 钟。当超过...

/ 0 评论 / 126 阅读 / 0 赞

混合写屏障

混合写屏障继承了插入写屏障的优点,起始无需 STW 打快照,直接并发扫 描垃圾即可;混合写屏障继承了删除写屏障的优点,赋值器是黑色赋值器,GC 期间,任 ...

/ 0 评论 / 133 阅读 / 0 赞

删除写屏障

Golang 没有这一步,Golang 的内存写屏障是由插入写屏障到混合写屏障过渡 的。简单介绍一下,一个对象即使被删除了最后一个指向它的指针也依旧可以 ...

/ 0 评论 / 112 阅读 / 0 赞

插入写屏障

Go GC 在混合写屏障之前,一直是插入写屏障,由于栈赋值没有 hook 的原 因,栈中没有启用写屏障,所以有 STW。Golang 的解决方法是:只是需...

/ 0 评论 / 164 阅读 / 0 赞

写屏障

Go 在进行三色标记的时候并没有 STW,也就是说,此时的对象还是可以进行修 改。 那么我们考虑一下,下面的情况。我们在进行三色标记中扫描灰色集合中,扫描...

/ 0 评论 / 114 阅读 / 0 赞

三色标记原理

原理:首先把所有的对象都放到白色的集合中从根节点开始遍历对象,遍历到的白色对象从白色集合中放到灰色集合中 遍历灰色集合中的对象,把灰色对象引用的白色集合的...

/ 0 评论 / 111 阅读 / 0 赞

Sysmon 有什么作用

Sysmon 也叫监控线程,变动的周期性检查,好处-  释放闲置超过 5 分钟的 span 物理内存;-  如果超过 2 分钟没有垃圾回收,强制执行; -...

/ 0 评论 / 142 阅读 / 0 赞

基于信号的抢占式调度

在任何情况下,Go 运行时并行执行(注意,不是并发)的 goroutines 数量是 小于等于 P 的数量的。为了提高系统的性能,P 的数量肯定不是越小越...

/ 0 评论 / 113 阅读 / 0 赞

协作式的抢占式调度

在 1.14 版本之前,程序只能依靠 Goroutine 主动让出 CPU 资源才能触发调 度。这种方式存在问题有:某些 Goroutine 可以长时间占...

/ 0 评论 / 104 阅读 / 0 赞

GMP 中 hand off 机制

当本线程 M 因为 G 进行的系统调用阻塞时,线程释放绑定的 P,把 P 转移给其 他空闲的 M 执行。 细节:当发生上线文切换时,需要对执行现场进行保护...

/ 0 评论 / 112 阅读 / 0 赞

积极对作品评论进行回复、点赞及置顶等管理操作,可以提升互动数,进而提升积分等级哦
  • 3月25日

    已添加,回复晚,抱歉

  • 2024年09月26日