CSAPP ch12总结了三种并发模型:基于进程,基于IO多路复用,基于线程。在实际的服务器应用中基于线程的并发模型并不能创建和使用过多的thread。因为thread数目过多于CPU核数,内核调度和切换thread将付出较大代价。因此通常在基于线程的基础上,在用户态设计用户态线程模型与调度器,使得调度不需要陷入内核完成,减小并发调度代价。 调度器的设计与演化用户态线程模型又根据多少个协程对应OS ...
Goroutine源码记录
上一篇博客总结了Go调度器的设计以及go调度器解决如何解决了用户态线程典型问题,这一篇就跟踪下Goroutine的源码实现。Go1.5源码剖析 已经写的非常详细了,我只把我觉得重要的地方集中总结一下。这两篇写好挺久了,以后再补充。 Go程序初始化过程C程序的入口地址通常是C运行库的_start函数,它完成了初始化堆栈、命令行参数设置、环境变量初始化、IO初始化、线程相关初始化或者还有全局构造。Go ...
Hystrix-go实现
原本写博客只是为了方便自己记忆,后来发现贴代码和写注释并没有帮助自己理清思路。今天看了Hystrix的实现,想试试用更简单的方式能不能说清楚原理和实现要点。 后记:说不贴代码结果还是贴了好多,好像尝试失败了…最终还是觉得代码比文字更容易理解… Hystrix-goHystrix项目本来是Netflix开源的Java项目,主要功能是隔离熔断,hystrix-go是这个隔离熔断库的go版本。其中隔 ...
Sort排序总结
最近在复习算法。翻出小伙伴在14年写的排序算法开始读,发现自己离开C/C++已经太久到打分号都很不习惯,于是乎打算写个go的堆排快排总结,主要根据标准库的sort包写的,另外刷了几道LeetCode的题目。 Sort Interfacesort的参数是个接口,它实现计算长度,比较以及Swap这三个方法。然后Sort方法根据深度来判断当前排序使用heapSort quickSort还是insertS ...
gRPC interceptor
go-grpc-middleware这个项目对gRPC的interceptor进行了封装,支持多个拦截器的链式组装。最近正好在看gRPC的拦截器和这个grpc-middleware,发现跟我们做的handlerChain类似,其他go-web框架通常也有自身的filter功能实现对其入口出口消息的拦截,这里总结一下实现方式。 gRPC Interceptor客户端和服务端都可以在初始化时注册拦截 ...
grpc负载均衡浅析
gRPC-BalancergPRC没有提供Balancer的实现,但给出了接口。基本原理是gRPC的client端为它要访问的target地址维护了ClientConn。在没有Balancer时这个ClientConn的conns只有一个address和它对应的一个连接,当有Balancer时Balancer会给出target对应的一组地址列表,ClientConn要维护这组地址对应的所有连接。 ...
Go Select的实现
select语法总结 select对应的每个case如果有已经准备好的case 则进行chan读写操作;若没有则执行defualt语句;若都没有则阻塞当前goroutine,直到某个chan准备好可读或可写,完成对应的case后退出。 Select的内存布局了解chanel的实现后对select的语法有个疑问,select如何实现多路复用的,为什么没有在第一个channel操作时阻塞 从而导致后面 ...
Go Channel的实现
channel作为goroutine间通信和同步的重要途径,是Go runtime层实现CSP并发模型重要的成员。在不理解底层实现时,经常在使用中对channe相关语法的表现感到疑惑,尤其是select case的行为。因此在了解channel的应用前先看一眼channel的实现。 Channel内存布局channel是go的内置类型,它可以被存储到变量中,可以作为函数的参数或返回值,它在runt ...