为什么golang只在stw和站扫描的时候加入抢占功能
Go语言的设计目标之一是高并发性能,而抢占式调度是实现高并发的一种重要手段。但是,在实现抢占式调度时,需要考虑到与垃圾回收(GC)的交互。
在Go语言中,垃圾回收是通过停止-复制(STW)算法实现的。在STW期间,所有的goroutine都会被暂停,然后进行垃圾回收操作。这种方式可以确保垃圾回收的安全性,但同时也会带来一定的性能开销。
为了减少性能开销,Go语言采用了一种被称为“站扫描”的垃圾回收方式。在站扫描中,垃圾回收器会在每个goroutine的栈上扫描对象引用,以确定哪些对象是可达的。这种方式可以减少STW的时间,提高垃圾回收的效率。
由于站扫描需要遍历goroutine的栈,而栈是由编译器生成的,因此只有在特定的时机才能进行栈扫描。在Go语言中,只有在STW和站扫描的时候,垃圾回收器才能访问和修改goroutine的栈。因此,在这两个时机,才能实现抢占式调度。
需要注意的是,Go语言的抢占式调度是基于协作的。也就是说,只有在特定的时机,例如函数的调用、循环的迭代等等,才会触发抢占。这种设计可以避免频繁的抢占,从而提高性能。
原文地址: https://www.cveoy.top/t/topic/irxJ 著作权归作者所有。请勿转载和采集!