nino's blog

我的读书笔记 我的自留地


  • Home

  • About

  • Tags

  • Categories

  • Archives

Goroutine浅析

Posted on 2017-12-10 | Edited on 2019-05-27 | In Golang

CSAPP ch12总结了三种并发模型:基于进程,基于IO多路复用,基于线程。在实际的服务器应用中基于线程的并发模型并不能创建和使用过多的thread。因为thread数目过多于CPU核数,内核调度和切换thread将付出较大代价。因此通常在基于线程的基础上,在用户态设计用户态线程模型与调度器,使得调度不需要陷入内核完成,减小并发调度代价。 调度器的设计与演化用户态线程模型又根据多少个协程对应OS ...

Goroutine源码记录

Posted on 2017-12-09 | Edited on 2019-05-26 | In Golang

上一篇博客总结了Go调度器的设计以及go调度器解决如何解决了用户态线程典型问题,这一篇就跟踪下Goroutine的源码实现。Go1.5源码剖析 已经写的非常详细了,我只把我觉得重要的地方集中总结一下。这两篇写好挺久了,以后再补充。 Go程序初始化过程C程序的入口地址通常是C运行库的_start函数,它完成了初始化堆栈、命令行参数设置、环境变量初始化、IO初始化、线程相关初始化或者还有全局构造。Go ...

Go 垃圾回收

Posted on 2017-12-07 | Edited on 2019-05-27 | In Golang

通常C++通过指针引用计数来回收对象,但是这不能处理循环引用。为了避免引用计数的缺陷,后来出现了标记清除,分代等垃圾回收算法。Go的垃圾回收官方形容为 非分代 非紧缩 写屏障 并发标记清理。标记清理算法的字面解释,就是将可达的内存块进行标记mark,最后没有标记的不可达内存块将进行清理sweep。 三色标记法判断一个对象是不是垃圾需不需要标记,就看是否能从当前栈或全局数据区 直接或间接的引用到这个 ...

Go 内存管理

Posted on 2017-12-01 | Edited on 2019-05-27 | In Golang

内存管理缓存结构Go实现的内存管理采用了tcmalloc这种架构,并配合goroutine和垃圾回收。tcmalloc的基本策略就是将内存分为多个级别。申请对象优先从最小级别的内存管理集合mcache中获取,若mcache无法命中则需要向mcentral申请一批内存块缓存到本地mcache中,若mcentral无空闲的内存块,则向mheap申请来填充mcentral,最后向系统申请。 mcache ...

Hystrix-go实现

Posted on 2017-11-24 | Edited on 2019-05-26 | In micro-service

原本写博客只是为了方便自己记忆,后来发现贴代码和写注释并没有帮助自己理清思路。今天看了Hystrix的实现,想试试用更简单的方式能不能说清楚原理和实现要点。 后记:说不贴代码结果还是贴了好多,好像尝试失败了…最终还是觉得代码比文字更容易理解… Hystrix-goHystrix项目本来是Netflix开源的Java项目,主要功能是隔离熔断,hystrix-go是这个隔离熔断库的go版本。其中隔 ...

Sort排序总结

Posted on 2017-11-21 | Edited on 2019-05-27 | In data-structure

最近在复习算法。翻出小伙伴在14年写的排序算法开始读,发现自己离开C/C++已经太久到打分号都很不习惯,于是乎打算写个go的堆排快排总结,主要根据标准库的sort包写的,另外刷了几道LeetCode的题目。 Sort Interfacesort的参数是个接口,它实现计算长度,比较以及Swap这三个方法。然后Sort方法根据深度来判断当前排序使用heapSort quickSort还是insertS ...

gRPC interceptor

Posted on 2017-11-13 | Edited on 2019-05-27 | In RPC

go-grpc-middleware这个项目对gRPC的interceptor进行了封装,支持多个拦截器的链式组装。最近正好在看gRPC的拦截器和这个grpc-middleware,发现跟我们做的handlerChain类似,其他go-web框架通常也有自身的filter功能实现对其入口出口消息的拦截,这里总结一下实现方式。 gRPC Interceptor客户端和服务端都可以在初始化时注册拦截 ...

grpc负载均衡浅析

Posted on 2017-11-12 | Edited on 2019-05-27 | In RPC

gRPC-BalancergPRC没有提供Balancer的实现,但给出了接口。基本原理是gRPC的client端为它要访问的target地址维护了ClientConn。在没有Balancer时这个ClientConn的conns只有一个address和它对应的一个连接,当有Balancer时Balancer会给出target对应的一组地址列表,ClientConn要维护这组地址对应的所有连接。 ...

Go Select的实现

Posted on 2017-11-07 | Edited on 2019-05-27 | In Golang

select语法总结 select对应的每个case如果有已经准备好的case 则进行chan读写操作;若没有则执行defualt语句;若都没有则阻塞当前goroutine,直到某个chan准备好可读或可写,完成对应的case后退出。 Select的内存布局了解chanel的实现后对select的语法有个疑问,select如何实现多路复用的,为什么没有在第一个channel操作时阻塞 从而导致后面 ...

Go Channel的实现

Posted on 2017-11-07 | Edited on 2019-05-27 | In Golang

channel作为goroutine间通信和同步的重要途径,是Go runtime层实现CSP并发模型重要的成员。在不理解底层实现时,经常在使用中对channe相关语法的表现感到疑惑,尤其是select case的行为。因此在了解channel的应用前先看一眼channel的实现。 Channel内存布局channel是go的内置类型,它可以被存储到变量中,可以作为函数的参数或返回值,它在runt ...

123
nino

nino

26 posts
7 categories
10 tags
GitHub Weibo
© 2020 nino
Powered by Hexo v3.8.0
|
Theme – NexT.Pisces v7.1.1