Go语言协程调度原理,协程为什么快!
前言:
Go面试技术点。用于记录学习复习总结!
goroutine的理解:
是一种轻量级的用户态线程(可以避免用户态到核心态的切换,节省资源开销),由Go运行时调度器进行管理!在Go中,每一格协程都会被分配一个较小的栈空间(默认为2KB),并以非常低的成本创建和销毁。
Goroutine的运行时:
Go运行时调度器采用了M:N的模型,也就是在M个操作系统线程上运行N个协程。具体来说,Go运行时初始化了一个或多个GOMAXPROCS指定数量的操作系统线程,并在这些线程上运行协程。
【M(左):N(中)模型图】
当一个协程阻塞时,调度器会自动将其与当前协程解除绑定,并将其转移到等待队列中,然后运行其它的协程,从而实现了高效地利用了CPU的时间片。
Go中协程的优势:
协程不像传统多线程编程那样必须避免线程竞争和加锁解锁等操作。事实上,在Go中通常通过channel实现协程之间的同步和通信。Go的channel机制提供了一种非常有效且安全的协程同步方式,可以避免竞争条件和死锁等问题。同时,协程可以自我调节、自我管理,从而可以避免了频繁的线程切换带来的性能损耗。这使得协程同游非常快的相应速度和高效的并发处理能力。
总而言之:Go 的协程是一种轻量级、高效率的并发编程方式,得益于其独特的调度机制和 channel 通信机制,可以有效地利用 CPU 时间片,并具有比传统多线程编程更加安全和高效的优点。
比传统多线程编程更加安全和高效的优点。