golang 并发二(原理)
每个操作系统都有一个固定大小的栈内存,用户保存函数的局部变量。但是空能会这个固定大小显然不太灵活。而goroutine在生命周期开始时申请一个很小的栈,与操作系统线程类似,用于保存函数调用期间的局部变量。本质区别是它的大小不是固定的,可以按需增大和缩小。
操作系统线程由内核进行调度,每隔几秒,cpu调用内核函数,暂停正在运行的线程,并将执行信息保存到内存,之后找到下一个需要执行的线程,然后从内存中恢复执行信息,最后执行线程。由于保存了一个线程的状态到了内存,并且从内存恢复了另一个线程的状态,所以进行了上下文切换。这是一个比较慢的过程。
go运行时包含一个自己的调度器,可以调用m个goruotine到n个操作系统线程,与操作系统线程调度不同的是,go调度器不是由时钟来决定的,而是有特定的go语言结构触发的。
java当中每一个线程都有一个独特的标识,但是goroutine没有提供可供程序员访问的标识。
有疑问加站长微信联系(非本文作者)