Go 高级编程 三 内存模型
内存模型
并发编程模型:多线程、消息传递。从理论上来说,多线程和基于消息的并发编程是等价的。
go语言是基于消息并发模块的编程语言,将基于CSP模型的并发编程内置到语言中,可以通过go关键字来启动一个goroutine
go的goroutiune之间是共享内存的。
Goroutine
goroutiune 是一种轻量级的线程,由go关键字启动,与系统线程并不等价。
系统线程:
系统级线程都有一个固定大小对的栈(默认可能2MB),用于保存函数递归调用时参数和局部变量
固定栈大小会导致两个问题:对于只需要很小的栈空间的线程是一种资源的浪费,而对于需要巨大栈空间的线程面临栈溢出的风险
goroutine
以一个很小的栈启动(2kb或者4kb),遇到深度递归导致当前栈空间不足的时候,会根据需要动态伸缩栈的大小(可达到1Gb)
启动代价小
go运行时包含自己的调度器,可以在n个操作系统线程上多工调度m个goroutiune。
gorotiune采用半抢占式的协作调度,只有在当前goroutiune发生阻塞的时候才会进行调度;同时发生在用户态,调度器会根据具体函数只保存必要的寄存器,切换代价小。
运行时有一个runtime.GOMAXPROCS变量,用于控制当前运行正常非阻塞Goroutine的系统线程数目。
原子操作
原子操作是指并发编程中最小且不可并发化的操作。
原子操作对于多线程并发编程模型来说,不会发生有别于单线程的意外情况,共享资源的完整性可以得到保证。
一般情况下,原子操作都是通过“互斥”访问来保证的,通常由特殊的CPU指令提供保护
标准库的sync/atomic包对原子操作提供了丰富的支持

浙公网安备 33010602011771号