什么是context 在传统服务中,处理一个请求通常会连带着发起多个对其他服务的请求,这通常可能会导致一个请求传播到多个goroutine中。 如上图所示,对于这种场景,如果request由于某些异常原因导致提前返回了结果,此时则需要通知所 … 继续阅读 借鉴context的源码技巧
Tag: Go
sync.Mutex 源码分析(三)
在前面的文章中,我们分析到Mutex在休眠g和唤醒g分别用到了runtime_SemacquireMutex和runtime_Semrelease,接下来简单分析这两个函数的源码。 SemacquireMutex其源码对应runtime#s … 继续阅读 sync.Mutex 源码分析(三)
sync.Mutex 源码分析(二)
接下来我们分析Mutex的源码: Mutex采用了一个int32类型的字段:state来描述当前锁的状态,包括: 当前mutex是否被持有 是否当前已经唤醒了一个goroutine 是否处于饥饿状态 当前等待唤醒的goroutine数量 其 … 继续阅读 sync.Mutex 源码分析(二)
golang netpoll 源码分析
在之前讲解goroutine的时候,我们说过,想要实现goroutine,必须解决的一个问题便是系统IO,系统调用不能长时间阻塞M,否则随着M的阻塞与新的M创建,协程会退化为线程导致系统负载过高。 golang选择的解决方案是重构网络库代码 … 继续阅读 golang netpoll 源码分析
GMP模型(六)M的状态流转
继续看m,在golang中没有对m的状态的枚举,但是我们依然可以根据其代码运行过程,将其分为以下几种状态: 这里我们模仿之前G和P的状态枚举,列举出M的状态枚举 新建状态(_Mnew):此时m完成OS Thread创建,完成g0的初始化,等 … 继续阅读 GMP模型(六)M的状态流转
GMP模型(五)P的状态流转
继续看P,对于p来说,p的生命周期比较简单,在进程刚初始化时,便会首先初始化所有的p: P的初始化 在系统入口函数runtime·rt0_go(SB)中,会调用schedinit()函数初始化全局变量sched时,会调用procresize … 继续阅读 GMP模型(五)P的状态流转
GMP模型(四)G的主动挂起状态
继续看g,在上一章中我们了解了golang如何解决g中代码存在系统调用的问题,接下来继续看另外一种情况,当g中存在锁或者类似需要waiting状态的时候,需要怎么处理? 其实简单想一想也能明白,无非是将g暂时挂起,让p继续调度其他g,等g执 … 继续阅读 GMP模型(四)G的主动挂起状态
GMP模型(三)G与系统调用
在上一章内容中,我们了解的G的生命周期,接下来我们继续第一章中简版GMP模型中留下的问题; G的中断 当我们执行系统调用时,如果不进行特殊处理,则会阻塞M,进而使得整个系统被拖慢,在golang中,通过系统调用源码可以找到,所有的系统调用最 … 继续阅读 GMP模型(三)G与系统调用
GMP模型(二)G的创建与执行
GMP中的G是对任务的抽象,其通过g结构体表示,其定义在runtime.runtime2.go中。 G 的创建 当程序中使用go关键字创建一个goroutine时,编译器会将其编译为newproc()函数,用来创建一个新的goroutine … 继续阅读 GMP模型(二)G的创建与执行
defer 源码分析
和Java的finally类似,Go也提供了defer关键字用来做函数最后的收尾动作。虽然defer的用法看似简单,但是不理解其原理,依然会踩到很多坑。同时recover()也是需要通过和defer关键字配合使用。因此,这里简单分析一下de … 继续阅读 defer 源码分析