golang协程调度的原理是甚么
Golang的协程调度器的原理是基于M:N的模型。其中M代表操作系统的线程(Machine),N代表Golang的协程(Goroutine)。
Golang的调度器保护了一个全局的运行队列,其中包括了所有待履行的协程。调度器会根据一定的策略从队列当选择协程,并将其分配给一个空闲的线程来履行。当一个协程产生阻塞(例如等待I/O操作完成)时,调度器会暂停该协程的履行,并将其从线程中移除,然后将线程重新分配给其他协程。
调度器还会根据一定的策略来决定是否是创建新的线程。当系统负载较高还是某个线程履行时间太长时,调度器会根据需要创建新的线程来平衡负载。而当协程数量减少时,过剩的线程会被烧毁,以减少资源的占用。
调度器还使用了一些技术来提高性能,例如抢占式调度和工作盗取。抢占式调度可以在一个协程履行时间太长时主动中断其履行,以便履行其他协程。工作盗取则指的是当一个线程履行完任务后,会从其他线程的队列中盗取任务履行,以提高线程的利用率。
总的来讲,Golang的协程调度器通过量线程和协程的配合,和一些优化技术,实现了高效的协程调度,并能够充分利用多核处理器的性能。
TOP