
Golang
文章平均质量分 91
simanstar
后台开发
展开
-
图解Golang垃圾回收机制
Go1.3使用的是标记清除法,分下面四步进行进行STW(stop the worl即暂停程序业务逻辑),然后从main函数开始找到不可达的内存占用和可达的内存占用 开始标记,程序找出可达内存占用并做标记 标记结束清除未标记的内存占用 结束STW停止暂停,让程序继续运行,循环该过程直到main生命周期结束 一开始的做法是将垃圾清理结束时才停止STW,后来优化了方案将清理垃圾放到了STW之后,与程序运行同时进行,这样做减小了STW的时长。但是STW会暂停用户逻辑对程序的性能影响是非常大的.原创 2022-03-15 00:08:17 · 404 阅读 · 0 评论 -
Golang Sync.Pool浅析(有错漏,待更新)
sync pool使用来存放临时变量的一个缓冲区,但是这个缓冲区并不可靠,每次gc的时候,都会首先清除缓冲区,所以,假如一个slice仅仅存放在 Pool 中,而没有其他地方引用,则会被当成垃圾清理掉。概念A Pool is a set of temporary objects that may be individually saved and retrieved.Any item stored in the Pool may be removed automatically at any ti原创 2022-01-30 14:56:48 · 717 阅读 · 0 评论 -
Golang sync.Mutex源码分析
sync.Mutex是一个不可重入的排他锁。 这点和Java不同,golang里面的排它锁是不可重入的。当一个 goroutine 获得了这个锁的拥有权后, 其它请求锁的 goroutine 就会阻塞在 Lock 方法的调用上,直到锁被释放。数据结构与状态机 sync.Mutex由两个字段 state 和 sema 组成。其中 state 表示当前互斥锁的状态,而 sema 是用于控制锁状态的信号量。type Mutex struct { state int32 sem...原创 2022-01-30 00:07:00 · 820 阅读 · 0 评论 -
sync.map原理分析
一、疑惑开篇#有了map为什么还要搞个sync.map 呢?它们之间有什么区别?答:重要的一点是,map并发不是安全的。在Go 1.6之前, 内置的map类型是部分goroutine安全的,并发的读没有问题,并发的写可能有问题。自go 1.6之后, 并发地读写map会报错,这在一些知名的开源库中都存在这个问题,所以go 1.9之前的解决方案是额外绑定一个锁,封装成一个新的struct或者单独使用锁都可以。go version go1.13.9 windows/amd64测试一波#原创 2022-01-29 23:13:59 · 835 阅读 · 0 评论 -
深度解密Go语言之unsafe
目录指针类型 什么是 unsafe 为什么有 unsafe unsafe 实现原理 unsafe 如何使用 获取 slice 长度 获取 map 长度 map 源码中的应用 Offsetof 获取成员偏移量 string 和 slice 的相互转换 总结 参考资料指针类型在正式介绍 unsafe 包之前,需要着重介绍 Go 语言中的指针类型。我本科开始学编程的时候,第一门语言就是 C。之后又陆续学过 C++,Java,Python,这些语言都挺强大的,但是没了原创 2022-01-28 15:50:37 · 537 阅读 · 0 评论 -
golang中的reflect(反射)
一、概述在golang中,reflect是一个比较高级的话题,本文将尽可能简单而又清楚的介绍相关内容。本文将从如下几个方面进行阐述:- 什么是reflection ?- 如何检查一个变量var 并获得其真实类型- golang中的reflect包1.1 reflect.Type 和 reflect.Value1.2 reflect.Kind1.3 NumField() 和 Field()1.4 Int() 和 String()- 完整实例- 如何使用reflection二、什么原创 2022-01-26 16:32:19 · 4480 阅读 · 1 评论 -
深入理解Golang之context
context是Go并发编程中常用到一种编程模式。本文将从为什么需要context,深入了解context的实现原理,以了解如何使用context。前言这篇文章将介绍Golang并发编程中常用到一种编程模式:context。本文将从为什么需要context出发,深入了解context的实现原理,以及了解如何使用context。为什么需要context在并发程序中,由于超时、取消操作或者一些异常情况,往往需要进行抢占操作或者中断后续操作。熟悉channel的朋友应该都见过使用done chan原创 2021-11-14 01:46:58 · 774 阅读 · 0 评论 -
golang的defer机制详解
defer概述 defer用来声明一个延迟函数,把这个函数放入到一个栈上,当外部的包含方法return之前,返回参数到调用方法之前调用,也可以说是运行到最外层方法体时调用。我们经常用他来做一些资源的释放,比如关闭io操作。 defer是golang的一个特色功能,被称为“延迟调用函数”。当外部函数返回后执行defer。类似于其他语言的 try… catch … finally… 中的finally,当然差别还是明显的。在使用defer之前我们应该多了解defer的特性,这样才能避免使用上的...原创 2021-11-13 19:08:21 · 10694 阅读 · 1 评论 -
深入理解Golang Channel
Golang使用Groutine和channels实现了CSP(Communicating Sequential Processes)模型,channles在goroutine的通信和同步中承担着重要的角色。在GopherCon 2017中,Golang专家Kavya深入介绍了 Go Channels 的内部机制,以及运行时调度器和内存管理系统是如何支持Channel的,本文根据Kavya的ppt学习和分析一下go channels的原理,希望能够对以后正确高效使用golang的并发带来一些启发。以..原创 2021-10-25 20:20:34 · 222 阅读 · 0 评论 -
Golang 协程调度
一、线程模型N:1模型,N个用户空间线程在1个内核空间线程上运行。优势是上下文切换非常快但是无法利用多核系统的优点。 1:1模型,1个内核空间线程运行一个用户空间线程。这种充分利用了多核系统的优势但是上下文切换非常慢,因为每一次调度都会在用户态和内核态之间切换。(POSIX线程模型(pthread),Java) M:N模型, 每个用户线程对应多个内核空间线程,同时也可以一个内核空间线程对应多个用户空间线程。Go打算采用这种模型,使用任意个内核模型管理任意个goroutine。这样结合了以上两种模型的原创 2021-10-25 19:09:41 · 510 阅读 · 0 评论 -
Golang调度机制
首先golang中协程golang是用户线程与系统线程的对应关系是多对多,既能利用多核cpu资源,也能尽可能减少上下文切换成本,代价是go需要实现复杂的goroutine调度机制。N:1,所有用户线程对应1个系统线程,无法利用多核cpu;1:1,1个用户线程对应一个系统线程,上下文切换成本高。调度逻辑四个结构体M:Machine,操作系统线程。一个M被创建后会在P空闲队列中获取P进行绑定,未绑定则进入阻塞状态。P:Process,调度器的核心处理器。通常表示执行上下文,P用于绑定原创 2021-10-25 19:08:57 · 379 阅读 · 0 评论 -
图示Golang垃圾回收机制
垃圾回收概念程序创建对象等引用类型实体时会在虚拟内存中分配给它们一块内存空间,如果该内存空间不再被任何引用变量引用时就成为需要被回收的垃圾。操作系统会记录一个进程运行时的所占用的内存、CPU和寄存器等资源,当进程结束后便由操作系统能够自动回收资源。但是对于一个运行较长时间的程序,如果使用完内存资源后没有及时释放就会造成内存泄漏甚至系统错误。以不支持自动垃圾回收的C++为例:void foo(){ char *p = new char[128]; // 对指针的使用 delet..原创 2021-10-22 01:38:29 · 532 阅读 · 0 评论 -
图解Go语言内存分配
Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理。这样可以自主地实现更好的内存使用模式,比如内存池、预分配等等。这样,不会每次内存分配都需要进行系统调用。Golang运行时的内存分配算法主要源自 Google 为 C 语言开发的TCMalloc算法,全称Thread-Caching Malloc。核心思想就是把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采用二级分配的方式进行管理:每个线程都会自行维护一个独立的内存池,进行内存分配时优先从该内存池中分配,当内存..原创 2021-10-09 00:44:31 · 311 阅读 · 0 评论